Compare commits

...

88 Commits

Author SHA1 Message Date
Gregor Santner 774c5bec59 Merge dandelion news and FAQ content all into markdown files in the dandelion repository 2023-02-11 03:07:41 +01:00
Gregor Santner c65aab3840 Update translations, project info 2023-01-28 17:21:07 +01:00
Gregor Santner c2bea7bec0 Crowdin add Estonian, Update translations (PR #297) 2022-12-08 14:16:52 +01:00
Gregor Santner 36bd1af0b9 Translations: Add bulgarian 2022-07-13 01:51:31 +02:00
Gregor Santner 67b0bbbfd2
Update translations (PR #294) 2022-05-28 19:03:18 +00:00
Gregor Santner b80cc3ab04 Add croatian & thai language to translation system 2022-05-28 20:55:42 +02:00
Gregor Santner 37f586912f
Change link to domain podupti.me -> diaspora.fediverse.observer, closes #295, by @gsantner 2021-10-09 20:17:11 +02:00
Gregor Santner de378b8adc Add language Odia/Oriya (India), Update translations (#293) 2021-10-02 13:04:29 +02:00
Gregor Santner 8161353de7
New Crowdin updates (#292) 2021-09-09 22:46:37 +02:00
Gregor Santner c42b4995b3 Update crowdin config 2021-09-09 22:43:58 +02:00
Gregor Santner 5a5d1d66b3 Update CHANGELOG 2021-08-01 14:31:44 +02:00
Gregor Santner ceb0002546 Update translations (PR #286) 2021-08-01 14:12:24 +02:00
James Addison 0cf003ea38
Update README screenshot references (PR #291) 2021-08-01 13:38:59 +02:00
Gregor Santner 904f2af20a
Update gs/opoc utilities 2021-08-01 13:30:21 +02:00
Gregor Santner d923630b42
Update README badges, remove IRC 2021-05-19 20:48:50 +02:00
Gregor Santner a76a463cd4
Add language Esperanto, by @gsantner 2021-03-13 14:25:09 +01:00
Gregor Santner c9c10a6fd4
Add language Sinhala (Sri Lanka) 2021-02-28 22:09:03 +01:00
Gregor Santner e5866ffb2b
Update opoc 2021-01-18 21:32:50 +01:00
Gregor Santner 97d9bf434e
Various additions & improvements to opoc utils 2021-01-12 20:23:10 +01:00
Gregor Santner f1464b5f8f
ci add comment for cleanup as github has no delete-all button 2020-12-23 14:45:38 +01:00
Gregor Santner 369abf14a5
CI/CD: Remove special junit/lint jobs 2020-12-22 03:39:33 +01:00
Gregor Santner ceb98c4258
gh actions pull_request action 2020-12-21 23:50:58 +01:00
Gregor Santner 4ebd393250
Update v1.3.5 (translations/libs only) 2020-12-09 12:08:05 +01:00
Gregor Santner f3b3c6a160
disable AndroidSupportMeWrapper 2020-12-09 11:59:36 +01:00
Gregor Santner ff62aa5a07 Add Makefile; CI: Remove Circle/Travis, add GitHub Actions 2020-12-09 01:07:24 +01:00
Gregor Santner 6fbd399a4b
Update gsantner/opoc libs/utils 2020-12-09 00:57:31 +01:00
Gregor Santner fa7e37ccba
Remove Travis CI - Open Source love is gone 2020-12-08 08:41:38 +01:00
Gregor Santner 20d75acd39
New Crowdin updates (#276) 2020-12-05 22:08:40 +01:00
Gregor Santner 7b1897b2e0 crowdin: Add macedonian 2020-11-13 21:56:27 +01:00
Gregor Santner 93aadae64b
[ci skip] Crowdin translation bot: New translations for Swedish (#272) 2020-09-24 23:18:12 +02:00
Gregor Santner a7dd4a6166
New Crowdin translations (#267) 2020-05-29 21:27:09 +00:00
Gregor Santner cf1f0100ba
Update crowdin bot commit message template 2020-05-29 23:22:35 +02:00
Gregor Santner 875f613cd9
Update supportme link to https 2020-04-20 02:01:40 +02:00
Gregor Santner ea1ee6bc40 Update opoc 2020-03-29 19:53:32 +02:00
Gregor Santner a66d7bf3b2 New Crowdin translations (#264) 2020-03-29 19:33:19 +02:00
Gregor Santner c5849d7d6a Release v1.3.4 2020-02-09 13:12:59 +01:00
Gregor Santner cc16b84011 Add seconds to 'save picture' date format, closes #262 2020-02-09 13:12:07 +01:00
Gregor Santner 0f6b1c3ec3
Update opoc 2020-02-09 12:49:26 +01:00
Gregor Santner a686fea141 Bump junit from 4.12 to 4.13 (#261); New Crowdin translations (#260, #263) 2020-02-09 12:46:29 +01:00
Gregor Santner f9951f3b16 Release v1.3.3 2019-12-23 21:21:10 +01:00
Gregor Santner 073a688db9
New Crowdin translations (#259) 2019-12-23 20:18:54 +00:00
Gregor Santner 1f3cde9326
Add albanian / Tamil 2019-12-23 21:11:39 +01:00
Gregor Santner 8326c2196c
Update tools 2019-12-06 22:02:24 +01:00
Gregor Santner 7361d4bc3f
Update opoc
Update shared helper utilities of my projects to latest state
2019-11-20 00:34:10 +01:00
Gregor Santner 1948c28cff
Crowdin: Update language mapping 2019-11-04 14:18:40 +01:00
Gregor Santner d1be7f5215 Bump gradle from 3.5.0 to 3.5.1 (#254) 2019-10-04 01:38:43 +02:00
Gregor Santner 8d019b6c3b
New Crowdin translations (#253) 2019-09-22 13:55:33 +00:00
Gregor Santner 0708fcb02b
Update list of languages for crowdin 2019-09-22 13:35:33 +02:00
Gregor Santner c5e3a42005
Update opoc 2019-09-07 21:54:08 +02:00
Gregor Santner 8c3c7da2ab
Release v1.3.2 2019-08-25 14:19:19 +02:00
Gregor Santner 3bc6afad03
Fix getDateOfDaysAgo 2019-08-25 14:07:07 +02:00
Gregor Santner 194fbf6927 Rename test flavor to atest (so it's default dev flavor when starting android studio) 2019-08-24 14:54:25 +02:00
dependabot-preview[bot] 6d45620181 Bump gradle from 3.4.2 to 3.5.0 (#250) 2019-08-21 12:22:56 +00:00
Gregor Santner c9d3693515
New Crowdin translations (#245) 2019-07-26 01:28:14 +00:00
Gregor Santner a618da97d8
Update opoc 2019-07-26 03:19:28 +02:00
imgbot[bot] 3ec8ab89c6 [ImgBot] Optimize images (#247)
*Total -- 1,011.84kb -> 914.41kb (9.63%)

/app/src/flavorTest/res/drawable-ldpi/ic_launcher.png -- 1.50kb -> 1.24kb (17.35%)
/app/src/main/res/drawable-ldpi/ic_launcher.png -- 1.67kb -> 1.40kb (16.03%)
/metadata/en-US/promoGraphic.png -- 3.58kb -> 3.04kb (15.17%)
/app/src/flavorDandelior/ic_launcher-web.png -- 29.94kb -> 26.33kb (12.05%)
/metadata/en-US/featureGraphic.png -- 861.38kb -> 773.90kb (10.16%)
/app/src/flavorDandelior/res/drawable-xhdpi/ic_launcher.png -- 9.28kb -> 8.74kb (5.83%)
/app/src/flavorDandelior/res/drawable-xhdpi/ic_launcher_round.png -- 9.28kb -> 8.74kb (5.83%)
/app/src/flavorDandelior/res/drawable-hdpi/ic_launcher_round.png -- 8.01kb -> 7.58kb (5.36%)
/app/src/flavorDandelior/res/drawable-hdpi/ic_launcher.png -- 8.01kb -> 7.58kb (5.36%)
/app/src/flavorDandelior/res/drawable-xxhdpi/ic_launcher_round.png -- 11.90kb -> 11.28kb (5.19%)
/app/src/flavorDandelior/res/drawable-xxhdpi/ic_launcher.png -- 11.90kb -> 11.28kb (5.19%)
/app/src/flavorDandelior/res/drawable-xxxhdpi/ic_launcher_round.png -- 14.72kb -> 14.08kb (4.31%)
/app/src/flavorDandelior/res/drawable-xxxhdpi/ic_launcher.png -- 14.72kb -> 14.08kb (4.31%)
/app/src/flavorDandelior/res/drawable-mdpi/ic_launcher_round.png -- 6.80kb -> 6.58kb (3.33%)
/app/src/flavorDandelior/res/drawable-mdpi/ic_launcher.png -- 6.80kb -> 6.58kb (3.33%)
/app/src/flavorDandelior/res/drawable-ldpi/ic_launcher_round.png -- 6.17kb -> 5.99kb (2.96%)
/app/src/flavorDandelior/res/drawable-ldpi/ic_launcher.png -- 6.17kb -> 5.99kb (2.96%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2019-07-26 00:35:39 +00:00
Gregor Santner 938a54fc74
Release v1.3.1 2019-04-26 00:55:53 +02:00
Gregor Santner 0732fe1b91
New Crowdin translations (#243) 2019-04-25 22:53:54 +00:00
Gregor Santner a7054d3ff8 Update metadata 2019-04-21 15:57:49 +02:00
Paul Schaub 25020c1692
Merge pull request #240 from vanitasvitae/de_metadata
German translation of metadata
2019-03-11 15:51:39 +01:00
Paul Schaub b1fb5d646a
German translation of metadata 2019-03-11 14:10:35 +01:00
Gregor Santner 51c3f68f22 Release v1.3.0 2019-03-08 14:49:29 +01:00
Gregor Santner a80f6ebb45 New Crowdin translations (#238) 2019-03-08 14:45:02 +01:00
Gregor Santner 49c6a97ce7 Add AndroidSupportMeWrapper 2019-03-08 12:32:10 +01:00
Gregor Santner 4f44d1acd3
New Crowdin translations (#231) 2019-02-07 09:38:41 +00:00
Gregor Santner 24571f6921
Auto reformat code 2019-02-07 10:31:18 +01:00
massimilianoLe fb8eb60974 pullRefresh as option + Shortcut to settings @themesettings (#226)
* pull to refresh page

* Make youtube links open external

* corrected a bit but still not able to check if app is installed

* corrected triggersync

* Added option For user to choose how to open youtube links

* removed unecessary comment

* update with dandelion

* pull refresh option+shortcut to themes

* Changes request applyed

* added name in contributors list
2019-02-07 09:25:06 +00:00
Gregor Santner b833311353 Release v1.2.5 2019-01-11 02:43:53 +01:00
Gregor Santner 6f310985d6 Update gradle tooling & gsantner-opoc 2019-01-11 02:38:30 +01:00
Gregor Santner 6d62c70359
New Crowdin translations (#224) 2019-01-11 00:16:10 +00:00
Gregor Santner d34cbe1ed1
Remove/move serbian 2019-01-11 01:11:05 +01:00
Gregor Santner 66cbf9a47d update crowdin yaml 2019-01-11 00:56:13 +01:00
Gregor Santner b1d5e980c2
New Crowdin translations (#221) 2019-01-10 23:31:30 +00:00
massimilianoLe f693418d64 Make youtube links open external, by @massimilianoLe (#220) 2018-12-01 17:12:04 +01:00
Gregor Santner 04e89e516c
New Crowdin translations (#218) 2018-11-23 10:31:00 +01:00
massimilianoLe 5854075080 pull to refresh page (#219) 2018-11-23 10:28:37 +01:00
Gregor Santner 1f8babd708 Release v1.2.3 2018-11-12 01:33:36 +01:00
Gregor Santner 2618bdf5ad
New Crowdin translations (#214) 2018-11-12 01:25:36 +01:00
Gregor Santner 19884c33c1
New Crowdin translations (#212) 2018-10-09 20:57:57 +02:00
Gregor Santner 2289c04f0f Update opoc and it's license headers 2018-10-01 21:12:17 +02:00
Gregor Santner 1129f1848a
New Crowdin translations (#210) 2018-09-27 11:17:17 +02:00
Gregor Santner c77fd1db01
add more language remappings for crowdin 2018-09-27 11:13:25 +02:00
Gregor Santner b072111b8b
add more language remappings for crowdin 2018-09-27 10:58:04 +02:00
Gregor Santner 351b2d6447
Mark only strings.xml as translatable on crowdin 2018-09-27 10:49:31 +02:00
Gregor Santner ddc2549c66 Update Crowdin configuration file 2018-09-25 17:55:04 +02:00
Gregor Santner c1d34fc5db
Merge pull request #204 from muhaaliss/stringlate-tr-9470
Updated tr (Turkish) translation, by @muhaaliss
2018-09-16 09:32:10 +02:00
Muha Aliss 33db3656fa Updated tr (Turkish) translation
Commit made via Stringlate
2018-09-16 03:17:33 +03:00
Gregor Santner e194d2159e
Add @vanitasvitae 's unfinished image-viewer patch (deleted all test/demo branches for cleanup 2018-09-05 17:00:04 +02:00
158 changed files with 6898 additions and 1527 deletions

View File

@ -21,7 +21,4 @@
Description:
What this is about, what happens and what is expected to happen. What needs to be done for it to happen.
If a crash is happening a log is needed. Screenshots or demonstration videos are always helpful too.
About logging:
https://gsantner.net/android-contribution-guide/?packageid=com.github.dfa.diaspora_android&name=dandelion&web=https://github.com/gsantner/dandelion#logcat
-->

View File

@ -0,0 +1,68 @@
##############################################################################################################################
# # Cleanup:
#const sleep = ms => () => new Promise((resolve, reject) => window.setTimeout(resolve, ms));
#Promise.resolve()
#.then(() => { document.getElementsByClassName("details-overlay details-reset position-relative d-inline-block ")[3].children[0].click(); })
#.then(sleep(500))
#.then(() => { document.getElementsByClassName("dropdown-item btn-link menu-item-danger")[0].click(); })
#.then(sleep(1000))
#.then(() => { document.getElementsByClassName("btn btn-block btn-danger")[0].click();});
#
# while [ 1 ] ; do sleep 4; xdotool key Up; sleep 0.1; xdotool key Return; done
##############################################################################################################################
name: "CI"
on: [push, pull_request]
jobs:
build:
if: "!contains(github.event.head_commit.message, 'ci skip') && (!contains(github.event_name, 'pull_request') || (contains(github.event_name, 'pull_request') && github.event.pull_request.head.repo.full_name != github.repository))"
runs-on: ubuntu-latest
steps:
- name: "Checkout: Code"
uses: actions/checkout@v2
- name: "Checkout: Code (PR)"
uses: actions/checkout@v2
if: "contains(github.event_name, 'pull_request')"
with:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
- name: "Setup: Java"
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: "Cache: Gradle"
uses: actions/cache@v2
with:
path: |
~/.gradle
.gradle
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('gradle/wrapper/gradle-wrapper.*') }}
- name: "Build: Project with make"
run: make clean all
- name: "Build: List dist files"
if: always()
run: find dist -type f -maxdepth 2
- name: "Artifacts: All"
if: always()
uses: actions/upload-artifact@v2.2.1
with:
name: "all"
path: dist
retention-days: 5
- name: "Artifacts: Android APK"
uses: actions/upload-artifact@v2.2.1
with:
name: "android-apk"
path: |
dist/*.apk

1
.gitignore vendored
View File

@ -36,6 +36,7 @@ tmp/
### Gradle ###
.gradle
build/
dist/
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)

View File

@ -1,48 +0,0 @@
language: android
jdk: oraclejdk8
before_cache:
# Do not cache a few Gradle files/directories (see https://docs.travis-ci.com/user/languages/java/#Caching)
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache:
directories:
# Android SDK
- $HOME/android-sdk-dl
- $HOME/android-sdk
# Gradle dependencies
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
# Android build cache (see http://tools.android.com/tech-docs/build-cache)
- $HOME/.android/build-cache
install:
# Download and unzip the Android SDK tools (if not already there thanks to the cache mechanism)
# Latest version available here: https://developer.android.com/studio/index.html#downloads
- if test ! -e $HOME/android-sdk-dl/sdk-tools.zip ; then curl https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip > $HOME/android-sdk-dl/sdk-tools.zip ; fi
- unzip -qq -n $HOME/android-sdk-dl/sdk-tools.zip -d $HOME/android-sdk
# Install or update Android SDK components (will not do anything if already up to date thanks to the cache mechanism)
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'tools' > /dev/null
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'platform-tools' > /dev/null
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'build-tools;26.0.2' > /dev/null
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'platforms;android-27' > /dev/null
- echo y | $HOME/android-sdk/tools/bin/sdkmanager 'extras;google;m2repository' > /dev/null
branches:
except:
- gh-pages
- l10n_master
- crowdin
env:
global:
- ANDROID_HOME=$HOME/android-sdk
matrix:
- TASK="clean lintFlavorDefaultDebug --stacktrace"
- TASK="clean build check -x lint --stacktrace"
script: "./gradlew --no-daemon --parallel $TASK"

View File

@ -1,3 +1,20 @@
### Recent changes
- See [Discussions](https://github.com/gsantner/dandelion/discussions), [Issues](https://github.com/gsantner/dandelion/issues) and [Project page](https://github.com/gsantner/dandelion#readme) to see what is going on.
### v1.4.0
- Add seconds to 'save picture' date format
- Updated translations
- Added german F-Droid description translation
- Update to Android SDK 29
### v1.3.0
- Add option to open youtube links external/in YouTube app (optional)
- Pull to refresh
### v1.2.3
**Improved:**
- More supported languages, more complete translations!
### v1.2.1
**App release: dandelior**
- Added an (rebranded) flavor of dandelion: dandelior
@ -6,7 +23,6 @@
**New features:**
- All new Aspects and Tags, using a searchable dialog
- A new home - project blog/page: <https://gsantner.net/project/dandelion.html>
**Fixed:**
- Sometimes the Stream went white, which is due an still (>3 years) unfixed Android Support library bug. It should not occur very often anymore due less use of fragments.

View File

@ -1,6 +1,5 @@
<!--
This file contains references to people who contributed to the app.
You can also send a mail to [gsantner AT mailbox DOT org](http://gsantner.net#contact) to get included.
Schema: **[Name](Reference)**<br/>~° Text
@ -9,11 +8,11 @@ Where:
* Reference: E-Mail, Webpage
* Text: Information about / kind of contribution
## LIST OF CONTRIBUTORS
-->
* **[Gregor Santner](http://gsantner.net)**<br/>~° Current developer of dandelion
* **[Gregor Santner](http://github.com/gsantner)**<br/>~° Development of dandelion
* **[Paul Schaub](https://github.com/vanitasvitae)**<br/>~° Development of dandelion
* **[Martín Vukovic](martinvukovic AT protonmail DOT com)**<br/>~° Diaspora Native WebApp
* **[Gaukler Faun](https://github.com/scoute-dich)**<br/>~° Diaspora Native WebApp additions
@ -30,3 +29,4 @@ Where:
* **[Jean Lucas](jean AT 4ray DOT co)**<br/>~° Spanish translation
* **[asereze](https://github.com/asereze)**<br/>~° Sardinian translation
* **[Xosé M. Lamas](http://xmgz.eu)**<br />~° Galician translation
* **[massimiliano](https://framagit.org/massimiliano)**<br />~° Contributor

99
Makefile Normal file
View File

@ -0,0 +1,99 @@
# License of Makefile: Public Domain / CC0
.PHONY: $(shell sed -n -e '/^$$/ { n ; /^[^ .\#][^ ]*:/ { s/:.*$$// ; p ; } ; }' $(MAKEFILE_LIST))
.NOTPARALLEL: clean
.DEFAULT_GOAL := all
env-%:
@: $(if ${${*}},,$(error Environment variable $* not set))
####################################################################################
DIST_DIR = dist
MOVE = mv
all: $(DIST_DIR) spellcheck lint deptree test build aapt_dump_badging
####################################################################################
$(DIST_DIR):
mkdir -p ${DIST_DIR}
ANDROID_BUILD_TOOLS := $(shell test -n "$ANDROID_SDK_ROOT" && find "${ANDROID_SDK_ROOT}/build-tools" -iname "aapt" | sort -r | head -n1 | xargs dirname)
TOOL_SPELLCHECKING_ISPELL := $(shell command -v ispell 2> /dev/null)
FLAVOR := $(or ${FLAVOR},${FLAVOR},Atest)
.NOTPARALLEL: gradle gradle-analyze-log
gradle: env-ANDROID_SDK_ROOT
mkdir -p $(DIST_DIR)/log/
chmod +x gradlew
./gradlew --no-daemon --parallel --stacktrace $A 2>&1 | tee "$(DIST_DIR)/log/gradle.log"
@echo "-----------------------------------------------------------------------------------"
gradle-analyze-log:
mv "$(DIST_DIR)/log/gradle.log" "$(DIST_DIR)/log/gradle$A.log"
cat "$(DIST_DIR)/log/gradle$A.log" | grep "BUILD " | tail -n1 | grep -q "BUILD SUCCESSFUL in"
adb: env-ANDROID_SDK_ROOT
"${ANDROID_SDK_ROOT}/platform-tools/adb" $A 2>&1 | tee "$(DIST_DIR)/log/adb-$L.log"
aapt: env-ANDROID_SDK_ROOT
"${ANDROID_BUILD_TOOLS}/aapt" $A 2>&1 | grep -v 'application-label-' | tee "$(DIST_DIR)/log/aapt$L.log"
build:
rm -f $(DIST_DIR)/*.apk
$(MAKE) A="clean assembleFlavor$(FLAVOR) -x lint" gradle
find app -type f -newermt '-300 seconds' -iname '*.apk' -not -iname '*unsigned.apk' | xargs cp -R -t $(DIST_DIR)/
$(MAKE) A="-build" gradle-analyze-log
lint:
rm -Rf $(DIST_DIR)/lint
mkdir -p $(DIST_DIR)/lint/
$(MAKE) A="lintFlavorDefaultDebug" gradle
find app -type f -iname 'lint-results-*' | grep -v 'intermediates' | xargs cp -R -t $(DIST_DIR)/lint
$(MAKE) A="-lint" gradle-analyze-log
test:
rm -Rf $(DIST_DIR)/tests
$(MAKE) A="testFlavorDefaultDebugUnitTest -x lint" gradle
mkdir -p app/build/test-results/testFlavorDefaultDebugUnitTest && echo 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHRlc3RzdWl0ZSBuYW1lPSJkdW1teSIgdGVzdHM9IjEiIHNraXBwZWQ9IjAiIGZhaWx1cmVzPSIwIiBlcnJvcnM9IjAiIHRpbWVzdGFtcD0iMjAyMC0xMi0wOFQwMDowMDowMCIgaG9zdG5hbWU9ImxvY2FsaG9zdCIgdGltZT0iMC4wMSI+CiAgPHByb3BlcnRpZXMvPgogIDx0ZXN0Y2FzZSBuYW1lPSJkdW1teSIgY2xhc3NuYW1lPSJkdW1teSIgdGltZT0iMC4wMSIvPgogIDxzeXN0ZW0tb3V0PjwhW0NEQVRBW11dPjwvc3lzdGVtLW91dD4KICA8c3lzdGVtLWVycj48IVtDREFUQVtdXT48L3N5c3RlbS1lcnI+CjwvdGVzdHN1aXRlPgo=' | base64 -d > 'app/build/test-results/testFlavorDefaultDebugUnitTest/TEST-dummy.xml'
find app -type d -iname 'testFlavorDefaultDebugUnitTest' | xargs cp -R -t $(DIST_DIR)/
mv ${DIST_DIR}/testFlavorDefaultDebugUnitTest $(DIST_DIR)/tests
$(MAKE) A="-test" gradle-analyze-log
deptree:
$(MAKE) A="app:dependencies --configuration flavor$(FLAVOR)DebugRuntimeClasspath" gradle
$(MAKE) A="-dependency-tree" gradle-analyze-log
clean:
$(MAKE) A="clean" gradle
rm -Rf $(DIST_DIR) app/build app/flavor* .idea dist
find . -type f -iname "*.iml" -delete
$(MAKE) $(DIST_DIR)
@echo "-----------------------------------------------------------------------------------"
install:
$(MAKE) A="install -r $(DIST_DIR)/*.apk" L="install" adb
run:
$(MAKE) A="shell monkey -p $$(aapt dump badging $(DIST_DIR)/*.apk | grep package: | sed 's@.* name=@@' | sed 's@ .*@@' | xargs | head -n1) -c android.intent.category.LAUNCHER 1" L="run" adb
aapt_dump_badging:
$(MAKE) A="dump badging $(DIST_DIR)/*.apk" aapt
@echo "-----------------------------------------------------------------------------------"
spellcheck:
mkdir -p "$(DIST_DIR)/lint/"
ifndef TOOL_SPELLCHECKING_ISPELL
@echo "Tool ispell (spellcheck) not found in PATH. Spellcheck skipped." > "$(DIST_DIR)/lint/stringsxml-spellcheck.txt"
else
@echo "Use ispell for spellchecking the original values/strings.xml"
find . -iname "strings.xml" -path "*/main*/values/*" | head -n1 | xargs cat \
| grep "<string name=" | sed 's@.*">@@' | sed 's@</string>@@' | sed 's@\\n@ @g' | sed 's@\\@@g' \
| ispell -W3 -a | grep ^\& | sed 's@[0-9]@@g' | sort | uniq | cut -d, -f1-4 \
| sed 's@^..@- @' | column -t -s: \
> "$(DIST_DIR)/lint/stringsxml-spellcheck.txt"
@echo "\nPotential words with bad spelling:"
endif
@cat "$(DIST_DIR)/lint/stringsxml-spellcheck.txt"
@echo "-----------------------------------------------------------------------------------"

96
NEWS.md Normal file
View File

@ -0,0 +1,96 @@
# dandelion - News
## General
### Installation
You can install and update from [F-Droid](https://f-droid.org/repository/browse/?fdid=com.github.dfa.diaspora_android) or [GitHub](https://github.com/gsantner/dandelion/releases/latest).
F-Droid is a store for free & open source apps.
The *.apk's available for download are signed by the F-Droid team and guaranteed to correspond to the (open source) source code of dandelion.
Generally this is the recommended way to install dandelion & keep it updated.
### Get informed
* Check the [project readme](https://github.com/gsantner/dandelion/tree/news#readme) for general project information.
* Check the [project news](https://github.com/gsantner/dandelion/blob/master/NEWS.md#readme) for more details on what is going on.
* Check the [project git history](https://github.com/gsantner/dandelion/commits/master) for most recent code changes.
### The right place to ask
If you have questions or found an issue please head to the [dandelion project](https://github.com/gsantner/dandelion/issues/new/choose) and ask there.
[Search](https://github.com/gsantner/dandelion/issues?q=#js-issues-search) for same/similar and related issues/questions before, it might be already answered or resolved.
### Navigation
* [dandelion v1.2 - Add dandelior - Searchable Tags and Aspects](#dandelion-v12---add-dandelior---searchable-tags-and-aspects)
* [dandelion v0.1.2 - Aspekte, Pod wechseln](#dandelion-v012---aspekte-pod-wechseln)
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------
# dandelion\* v1.2 - Add dandelior\* - Searchable Tags and Aspects
_12. August 2018_
## dandelior\* is a rebranded version of dandelion\*
dandelior\* is based 100% on the same code and resources as dandelion\*. Its from the same code repository, just a different build flavor.
The main purpose of dandelior\* is the most requested feature till date - to support multiple accounts / another account at dandelion\*.
- Added an (rebranded) flavor of dandelion: dandelior
- Only differenties in use are other (black) icon and AMOLED colors by default enabled
- Already available on F-Droid
**New features:**
- All new Aspects and Tags, using a searchable dialog
**Fixed:**
- Sometimes the Stream went white, which is due an still (3+ years) unfixed Android Support library bug. It should not occur very often anymore due less use of fragments.
**Improved:**
- Various small tweaks
- Updated translation files
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------
# dandelion v0.1.2 - Aspekte, Pod wechseln
_05. Juni 2016_
In den letzten Tagen hat @gsantner viel Zeit in die inoffizielle diaspora\* Android App ([dandelion\*](https://github.com/gsantner/dandelion)) investiert.
Dabei wurden unter anderem folgende Änderungen beigesteuert:
- Allgemeines zur Usability
- Animationen für den Activity-Wechsel und Startup, WebView-Scroll-Top
- Podliste caching
- Aspekt-Liste und Aspekte hinzugefügt
- Verbessertes Sharing aus der App
- Material Progressbar
- Suche verbessert
- Collapsing top menu
- toolbar/actions/menu geändert, fab entfernt
- Refactoring layout & menu files, dialogs
- Überarbeitete Main,Splash,PodSelectionActivity
- Pod wechseln

View File

@ -1,9 +1,9 @@
[![GitHub release](https://img.shields.io/github/tag/gsantner/dandelion.svg)](https://github.com/gsantner/dandelion/releases)
[![Build Status](https://travis-ci.org/gsantner/dandelion.svg?branch=master)](https://travis-ci.org/gsantner/dandelion)
[![Translate - with Stringlate](https://img.shields.io/badge/stringlate-translate-green.svg)](https://lonamiwebs.github.io/stringlate/translate?git=https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion.git&mail=gro.xobliam@@rentnasg)
[![Chat - Matrix](https://img.shields.io/badge/chat-on%20matrix-blue.svg)](https://matrix.to/#/#dandelion:matrix.org) [![Chat - FreeNode IRC](https://img.shields.io/badge/chat-on%20irc-blue.svg)](https://kiwiirc.com/client/irc.freenode.net/?nick=dandelion-anon|?##dandelion)
[![Donate](https://img.shields.io/badge/donate-appreciation-orange.svg)](https://gsantner.net/supportme/?project=dandelion&source=readme)
[![Donate LiberaPay](https://img.shields.io/badge/donate-liberapay-orange.svg)](https://liberapay.com/gsantner/donate)
[![GitHub releases](https://img.shields.io/github/tag/gsantner/dandelion.svg)](https://github.com/gsantner/dandelion/releases)
[![GitHub downloads](https://img.shields.io/github/downloads/gsantner/dandelion/total.svg?logo=github&logoColor=lime)](https://github.com/gsantner/dandelion/releases)
[![Translate on Crowdin](https://img.shields.io/badge/translate-crowdin-green.svg)](https://crowdin.com/project/diaspora-for-android/invite)
[![Chat on Matrix](https://img.shields.io/badge/chat-matrix-blue.svg)](https://matrix.to/#/#dandelion:matrix.org)
[![GitHub CI](https://github.com/gsantner/dandelion/workflows/CI/badge.svg)](https://github.com/gsantner/dandelion/actions)
[![Codacy code quality](https://img.shields.io/codacy/grade/aff869c440bc48b7bd64680e97cbc453)](https://www.codacy.com/app/gsantner/dandelion)
# dandelion\*
<img src="/app/src/main/ic_launcher-web.png" align="left" width="100" hspace="10" vspace="10">
@ -39,12 +39,11 @@ dandelion\* requires access to the Internet and to external storage to be able t
## Contributions
The project is always open for contributions and accepts pull requests.
The project uses [AOSP Java Code Style](https://source.android.com/source/code-style#follow-field-naming-conventions), with one exception: private members are `_camelCase` instead of `mBigCamel`. You may use Android Studios _auto reformat feature_ before sending a PR. See [gsantner's android contribution guide](https://gsantner.net/android-contribution-guide/?packageid=com.github.dfa.diaspora_android&name=dandelion&web=https://github.com/gsantner/dandelion&source=readme#logcat) for more information.
The project uses [AOSP Java Code Style](https://source.android.com/source/code-style#follow-field-naming-conventions), with one exception: private members are `_camelCase` instead of `mBigCamel`. You may use Android Studios _auto reformat feature_ before sending a PR.
Translations can be contributed on GitHub or via [E-Mail](https://gsantner.net/#contact). You can use Stringlate ([![Translate - with Stringlate](https://img.shields.io/badge/stringlate-translate-green.svg)](https://lonamiwebs.github.io/stringlate/translate?git=https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion.git)) to translate the project directly on your Android phone. It allows you to export as E-Mail attachement and to post on GitHub.
Join our IRC or Matrix channel (bridged) and say hello! Don't be afraid to start talking. [![Chat - Matrix](https://img.shields.io/badge/chat-on%20matrix-blue.svg)](https://matrix.to/#/#dandelion:matrix.org) [![Chat - FreeNode IRC](https://img.shields.io/badge/chat-on%20irc-blue.svg)](https://kiwiirc.com/client/irc.freenode.net/?nick=dandelion-anon|?##dandelion)
Translations can be contributed on GitHub. You can use Stringlate ([![Translate - with Stringlate](https://img.shields.io/badge/stringlate-translate-green.svg)](https://lonamiwebs.github.io/stringlate/translate?git=https%3A%2F%2Fgithub.com%2Fgsantner%2Fdandelion.git)) to translate the project directly on your Android phone. It allows you to export as E-Mail attachement and to post on GitHub.
Join our Matrix channel and say hello! Don't be afraid to start talking. [![Chat - Matrix](https://img.shields.io/badge/chat-on%20matrix-blue.svg)](https://matrix.to/#/#dandelion:matrix.org)
Note that the main project members are working on this project for free during leisure time, are mostly busy with their job/university/school, and may not react or start coding immediately.
@ -62,23 +61,21 @@ For more licensing informations, see [`3rd party licenses`](/app/src/main/res/ra
## Screenshots
<div style="display:flex;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/01.png" width="19%" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/02.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/03.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/04.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/05.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/01.png" width="19%" >
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/02.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/03.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/04.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/05.png" width="19%" style="margin-left:10px;" >
</div>
<div style="display:flex;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/06.png" width="19%" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/07.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/08.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/09.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/06.png" width="19%" >
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/07.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/08.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/gsantner/dandelion/master/metadata/en-US/phoneScreenshots/09.png" width="19%" style="margin-left:10px;" >
</div>
### Notice
#### Maintainers
- gsantner ([GitHub](https://github.com/gsantner), [Web](https://gsantner.net/supportme/?project=dandelion&source=readme), [diaspora*](https://pod.geraspora.de/people/d1cbdd70095301341e834860008dbc6c))
- Bitcoin: [1B9ZyYdQoY9BxMe9dRUEKaZbJWsbQqfXU5](https://gsantner.net/supportme/?project=dandelion&source=readme)
- gsantner ([GitHub](https://github.com/gsantner), [diaspora*](https://pod.geraspora.de/people/d1cbdd70095301341e834860008dbc6c))
- vanitasvitae ([GitHub](https://github.com/vanitasvitae), [diaspora*](https://pod.geraspora.de/people/bbd7af90fbec013213e34860008dbc6c))
- Bitcoin: 1Ao3W6NaQv3xKppviB7RSFKjHo6PGd8RTy

View File

@ -1,16 +0,0 @@
## Screenshots
<div style="display:flex;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/01.png" width="19%" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/02.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/03.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/04.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/05.png" width="19%" style="margin-left:10px;" >
</div>
<div style="display:flex;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/06.png" width="19%" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/07.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/08.png" width="19%" style="margin-left:10px;" >
<img src="https://raw.githubusercontent.com/diaspora-for-android/dandelion-metadata-latest/master/en-US/phoneScreenshots/09.png" width="19%" style="margin-left:10px;" >
</div>

View File

@ -6,44 +6,27 @@ if (enable_plugin_kotlin) {
}
android {
compileSdkVersion version_setup_compileSdk
flavorDimensions "default"
buildToolsVersion rootProject.ext.version_buildTools
compileSdkVersion rootProject.ext.version_compileSdk
defaultConfig {
minSdkVersion version_setup_minSdk
targetSdkVersion version_setup_targetSdk
resValue "string", "manifest_package_id", "com.github.dfa.diaspora_android"
applicationId "com.github.dfa.diaspora_android"
versionName "1.3.5"
versionCode 46
vectorDrawables.useSupportLibrary = true
minSdkVersion rootProject.ext.version_minSdk
targetSdkVersion rootProject.ext.version_compileSdk
buildConfigField "boolean", "IS_TEST_BUILD", "false"
buildConfigField "boolean", "IS_GPLAY_BUILD", "false"
buildConfigField "String[]", "DETECTED_ANDROID_LOCALES", "${findUsedAndroidLocales()}"
buildConfigField "String", "BUILD_DATE", "\"${getBuildDate()}\""
buildConfigField "String", "GITHASH", "\"${getGitHash()}\""
resValue "string", "manifest_package_id", "com.github.dfa.diaspora_android"
applicationId "com.github.dfa.diaspora_android"
versionName "1.2.2"
versionCode 35
vectorDrawables.useSupportLibrary = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
if (enable_plugin_kotlin) {
main.java.srcDirs += 'src/main/kotlin'
}
setProperty("archivesBaseName", applicationId + "-v" + versionCode + "-" + versionName)
}
flavorDimensions "default"
productFlavors {
flavorDefault {
}
@ -57,15 +40,58 @@ android {
applicationId "net.gsantner.dandelior"
}
flavorTest {
flavorAtest {
applicationId "net.gsantner.secondlion"
versionCode = Integer.parseInt(new Date().format('yyMMdd'))
versionName = new Date().format('yyMMdd')
buildConfigField "boolean", "IS_TEST_BUILD", "true"
}
}
sourceSets {
main { assets.srcDirs = ['src/main/assets'] }
if (enable_plugin_kotlin) {
main.java.srcDirs += 'src/main/kotlin'
}
main.java.srcDirs += 'thirdparty/java'
main.res.srcDirs += 'thirdparty/res'
main.assets.srcDirs += 'thirdparty/assets'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
configurations.all {
resolutionStrategy {
eachDependency { details ->
if (details.requested.group == 'com.android.support') {
if (details.requested.name != 'multidex' && details.requested.name != 'multidex-instrumentation') {
details.useVersion "${rootProject.ext.version_library_appcompat}"
}
}
}
}
}
packagingOptions {
exclude 'META-INF/LICENSE-LGPL-2.1.txt'
exclude 'META-INF/LICENSE-LGPL-3.txt'
exclude 'META-INF/LICENSE-W3C-TEST'
}
compileOptions {
encoding = 'UTF-8'
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
disable 'MissingTranslation'
disable 'MissingTranslation', 'InvalidPackage', 'ObsoleteLintCustomCheck', 'DefaultLocale', 'UnusedAttribute', 'VectorRaster', 'InflateParams', 'IconLocation', 'UnusedResources', 'TypographyEllipsis'
abortOnError false
}
}
@ -75,7 +101,7 @@ dependencies {
// Jars
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
testImplementation 'junit:junit:4.13'
// Android standard libs
implementation "com.android.support:appcompat-v7:${version_library_appcompat}"
@ -83,16 +109,19 @@ dependencies {
implementation "com.android.support:support-v4:${version_library_appcompat}"
implementation "com.android.support:customtabs:${version_library_appcompat}"
implementation "com.android.support:cardview-v7:${version_library_appcompat}"
implementation "com.android.support:preference-v7:${version_library_appcompat}"
// UI libraries
implementation "com.github.DASAR:ShiftColorPicker:v0.5"
// Tool libraries
implementation 'commons-io:commons-io:2.6'
implementation "info.guardianproject.netcipher:netcipher:${version_library_netcipher}"
implementation "info.guardianproject.netcipher:netcipher-webkit:${version_library_netcipher}"
//noinspection AnnotationProcessorOnCompilePath
implementation "com.jakewharton:butterknife:${version_library_butterknife}"
if (enable_plugin_kotlin) {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$version_plugin_kotlin"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${version_plugin_kotlin}"
}
// Processors

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

View File

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -15,6 +15,7 @@
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:theme="@style/DiasporaLight">
<provider
@ -59,7 +60,8 @@
android:theme="@style/DiasporaLight.NoActionBar"
android:windowSoftInputMode="adjustResize">
<meta-data android:name="android.app.shortcuts"
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
<intent-filter>
@ -68,6 +70,7 @@
<action android:name="sc_aspects" />
<action android:name="sc_activities" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

View File

@ -36,6 +36,7 @@ import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import net.gsantner.opoc.util.AdBlock;
import net.gsantner.opoc.util.ContextUtils;
import net.gsantner.opoc.util.ShareUtil;
public class App extends Application {
private volatile static App app;
@ -51,6 +52,7 @@ public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
ShareUtil.setFileProviderAuthority(BuildConfig.APPLICATION_ID);
app = this;
final Context c = getApplicationContext();
appSettings = AppSettings.get();
@ -58,7 +60,7 @@ public class App extends Application {
String a = new ContextUtils(this).bcstr("FLAVOR", "");
a += "__";
if (appSettings.isAppFirstStart() && "flavorDandelior".equals(new ContextUtils(this).bcstr("FLAVOR", ""))){
if (appSettings.isAppFirstStart() && "flavorDandelior".equals(new ContextUtils(this).bcstr("FLAVOR", ""))) {
appSettings.setAmoledColorMode(true);
}

View File

@ -128,7 +128,7 @@ public class DiasporaStreamFragment extends BrowserFragment {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
AppLog.d(this, "StreamFragment.onOptionsItemSelected()");
ShareUtil shu = new ShareUtil(getContext()).setFileProviderAuthority(BuildConfig.APPLICATION_ID);
ShareUtil shu = new ShareUtil(getContext());
PermissionChecker permc = new PermissionChecker(getActivity());
switch (item.getItemId()) {
case R.id.action_reload: {
@ -185,7 +185,7 @@ public class DiasporaStreamFragment extends BrowserFragment {
if (permc.mkdirIfStoragePermissionGranted(fileSaveDirectory)) {
Bitmap bmp = ShareUtil.getBitmapFromWebView(webView);
String filename = "dandelion-" + ShareUtil.SDF_SHORT.format(new Date()) + ".jpg";
_cu.writeImageToFileJpeg(new File(fileSaveDirectory, filename), bmp);
_cu.writeImageToFile(new File(fileSaveDirectory, filename), bmp);
Snackbar.make(webView, getString(R.string.saving_screenshot_as)
+ " " + filename, Snackbar.LENGTH_LONG).show();
}
@ -195,7 +195,7 @@ public class DiasporaStreamFragment extends BrowserFragment {
case R.id.action_share_screenshot: {
if (permc.doIfExtStoragePermissionGranted(getString(R.string.screenshot_permission__appspecific))) {
shu.shareImage(ShareUtil.getBitmapFromWebView(webView), Bitmap.CompressFormat.JPEG);
shu.shareImage(ShareUtil.getBitmapFromWebView(webView));
}
return true;
}

View File

@ -565,12 +565,10 @@ public class MainActivity extends ThemedActivity
} else if ("sc_activities".equals(action)) {
openDiasporaUrl(urls.getActivityUrl());
return;
}
else if ("sc_contacts".equals(action)) {
} else if ("sc_contacts".equals(action)) {
onNavigationItemSelected(navView.getMenu().findItem(R.id.nav_aspects));
return;
}
else if ("sc_tags".equals(action)) {
} else if ("sc_tags".equals(action)) {
onNavigationItemSelected(navView.getMenu().findItem(R.id.nav_followed_tags));
return;
}

View File

@ -271,6 +271,8 @@ public class SettingsActivity extends ThemedActivity implements SharedPreference
@Override
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
AppSettings settings = ((App) getActivity().getApplication()).getSettings();
DiasporaUrlHelper diasporaUrlHelper = new DiasporaUrlHelper(settings);
if (isAdded() && preference.hasKey()) {
String key = preference.getKey();
if (key.equals(getString(R.string.pref_key__primary_color__preference_click))) {
@ -279,6 +281,13 @@ public class SettingsActivity extends ThemedActivity implements SharedPreference
} else if (key.equals(getString(R.string.pref_key__accent_color__preference_click))) {
showColorPickerDialog(2);
return true;
} else if (key.equals(getString(R.string.pref_key__manage_theme))) {
Intent intent = new Intent(getActivity(), MainActivity.class);
intent.setAction(MainActivity.ACTION_OPEN_URL);
intent.putExtra(MainActivity.URL_MESSAGE, diasporaUrlHelper.getThemeUrl());
startActivity(intent);
getActivity().finish();
return true;
}
}
return super.onPreferenceTreeClick(screen, preference);

View File

@ -13,7 +13,7 @@ import java.util.List;
/**
* Created by gsantner (https://gsantner.net/ on 30.09.16.
* Created by gsantner (gsantner AT mailbox DOT org on 30.09.16.
* DiasporaPodList - List container for DiasporaPod's, with methods to merge with other DiasporaPodLists
* DiasporaPod - Data container for a Pod, can include N DiasporaPodUrl's
* DiasporaPodUrl - A Url of an DiasporaPod

View File

@ -32,7 +32,7 @@ import org.json.JSONObject;
/**
* User profile
* Created by gsantner (https://gsantner.net/) on 24.03.16. Part of dandelion*.
* Created by gsantner (gsantner AT mailbox DOT org) on 24.03.16. Part of dandelion*.
*/
public class DiasporaUserProfile {
private static final int MINIMUM_USERPROFILE_LOAD_TIMEDIFF = 5000;

View File

@ -21,7 +21,7 @@ package com.github.dfa.diaspora_android.listener;
import com.github.dfa.diaspora_android.data.DiasporaUserProfile;
/**
* Created by gsantner (https://gsantner.net/) on 26.03.16.
* Created by gsantner (gsantner AT mailbox DOT org) on 26.03.16.
* Interface that needs to be implemented by classes that listen for Profile related changes
*/
public interface DiasporaUserProfileChangedListener {

View File

@ -37,7 +37,7 @@ import butterknife.OnItemSelected;
/**
* Dialog that helps the user configure a pod
* Created by gsantner (http://gsantner.net) on 06.10.16.
* Created by gsantner on 06.10.16.
*/
public class PodSelectionDialog extends ThemedAppCompatDialogFragment {
public static final String TAG = "com.github.dfa.diaspora_android.ui.PodSelectionDialog";

View File

@ -37,7 +37,7 @@ import java.util.List;
/**
* Settings
* Created by gsantner (https://gsantner.net/) on 20.03.16. Part of dandelion*.
* Created by gsantner (gsantner AT mailbox DOT org) on 20.03.16. Part of dandelion*.
*/
@SuppressWarnings("ConstantConditions")
public class AppSettings extends SharedPreferencesPropertyBackend {
@ -359,6 +359,14 @@ public class AppSettings extends SharedPreferencesPropertyBackend {
return getBool(R.string.pref_key__topbar_stream_shortcut, false);
}
public boolean isOpenYoutubeExternalEnabled() {
return getBool(R.string.pref_key__open_youtube_external_enabled, true);
}
public boolean isSwipeRefreshEnabled() {
return getBool(R.string.pref_key__swipe_refresh_enabled, true);
}
public String getScreenRotation() {
return getString(R.string.pref_key__screen_rotation, R.string.rotation_val_system);
}
@ -443,6 +451,7 @@ public class AppSettings extends SharedPreferencesPropertyBackend {
public boolean isAmoledColorMode() {
return getBool(R.string.pref_key__primary_color__amoled_mode, false);
}
public void setAmoledColorMode(boolean enable) {
setBool(R.string.pref_key__primary_color__amoled_mode, enable);
}

View File

@ -62,6 +62,7 @@ public class DiasporaUrlHelper {
public static final String SUBURL_NOTIFICATIONS_MENTIONED = "/notifications?type=mentioned";
public static final String SUBURL_NOTIFICATIONS_RESHARED = "/notifications?type=reshared";
public static final String SUBURL_NOTIFICATIONS_STARTED_SHARING = "/notifications?type=started_sharing";
public static final String SUBURL_THEME = "/user/edit";
public DiasporaUrlHelper(AppSettings settings) {
this.settings = settings;
@ -353,4 +354,13 @@ public class DiasporaUrlHelper {
}
return app.getString(R.string.aspects);
}
/**
* Return a url that points to the settings of the pod.
*
* @return https://(pod-domain.tld)/user/edit
*/
public String getThemeUrl() {
return getPodUrl() + SUBURL_THEME;
}
}

View File

@ -21,6 +21,7 @@ package com.github.dfa.diaspora_android.web;
import android.content.Context;
import android.content.MutableContextWrapper;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
@ -50,6 +51,7 @@ public class BrowserFragment extends ThemedFragment {
protected WebSettings webSettings;
protected String pendingUrl;
protected SwipeRefreshLayout swipe;//pull to refresh
@Override
protected int getLayoutResId() {
@ -90,6 +92,18 @@ public class BrowserFragment extends ThemedFragment {
webView.setParentActivity(getActivity());
this.setRetainInstance(true);
//pull to refresh
swipe = view.findViewById(R.id.swipe);
swipe.setDistanceToTriggerSync(2000);
swipe.setOnRefreshListener(() -> reloadUrl());
if (appSettings.isSwipeRefreshEnabled()) {
swipe.setEnabled(true);
} else {
swipe.setRefreshing(false);
swipe.setEnabled(false);
return;
}
}
@Override
@ -192,6 +206,7 @@ public class BrowserFragment extends ThemedFragment {
@Override
public void run() {
getWebView().reload();
swipe.setRefreshing(false);//pull to refresh
}
});

View File

@ -78,7 +78,7 @@ public class ContextMenuWebView extends NestedWebView {
public boolean onMenuItemClick(MenuItem item) {
HitTestResult result = getHitTestResult();
String url = result.getExtra();
final ShareUtil shu = new ShareUtil(context).setFileProviderAuthority(BuildConfig.APPLICATION_ID);
final ShareUtil shu = new ShareUtil(context);
final PermissionChecker permc = new PermissionChecker(parentActivity);
final AppSettings appSettings = new AppSettings(context);

View File

@ -20,6 +20,7 @@ package com.github.dfa.diaspora_android.web;
import android.annotation.TargetApi;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.support.v4.content.LocalBroadcastManager;
import android.webkit.CookieManager;
@ -38,6 +39,7 @@ public class CustomWebViewClient extends WebViewClient {
private final App app;
private String lastLoadUrl = "";
private boolean isAdBlockEnabled = false;
AppSettings appSettings = AppSettings.get();
public CustomWebViewClient(App app, WebView webView) {
this.app = app;
@ -56,6 +58,11 @@ public class CustomWebViewClient extends WebViewClient {
|| (host != null && (url.startsWith("https://" + host)
|| url.startsWith("http://" + host)))) {
return false;
}//make youtube links open external-->never customtab
else if (appSettings.isOpenYoutubeExternalEnabled() && (url.startsWith("https://youtube.com/") || url.startsWith("https://www.youtube.com/") || url.startsWith("https://m.youtube.com/") || url.startsWith("https://youtu.be/"))) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
view.getContext().startActivity(intent);
return true;
} else {
Intent i = new Intent(MainActivity.ACTION_OPEN_EXTERNAL_URL);
i.putExtra(MainActivity.EXTRA_URL, url);

View File

@ -32,7 +32,6 @@ import com.github.dfa.diaspora_android.activity.MainActivity;
/**
* Created by Gregor Santner on 07.08.16.
* http://gsantner.net
*/
public class WebHelper {

View File

@ -1,9 +1,8 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2017-
* https://gsantner.net/
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* License: Apache 2.0
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
*
@ -16,10 +15,15 @@ import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import net.gsantner.opoc.android.dummy.MenuItemDummy;
import net.gsantner.opoc.util.ContextUtils;
import butterknife.ButterKnife;
@ -33,6 +37,7 @@ public abstract class GsFragmentBase extends Fragment {
protected ContextUtils _cu;
protected Bundle _savedInstanceState = null;
protected Menu _fragmentMenu = new MenuItemDummy.Menu();
@Override
public void onCreate(Bundle savedInstanceState) {
@ -51,6 +56,9 @@ public abstract class GsFragmentBase extends Fragment {
_cu = new ContextUtils(inflater.getContext());
_cu.setAppLanguage(getAppLanguage());
_savedInstanceState = savedInstanceState;
if (getLayoutResId() == 0) {
Log.e(getClass().getCanonicalName(), "Error: GsFragmentbase.onCreateview: Returned 0 for getLayoutResId");
}
View view = inflater.inflate(getLayoutResId(), container, false);
ButterKnife.bind(this, view);
return view;
@ -126,4 +134,27 @@ public abstract class GsFragmentBase extends Fragment {
}
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
_fragmentMenu = menu;
}
public Menu getFragmentMenu() {
return _fragmentMenu;
}
/**
* Get the toolbar from activity
* Requires id to be set to @+id/toolbar
*/
@SuppressWarnings("ConstantConditions")
protected Toolbar getToolbar() {
try {
return (Toolbar) getActivity().findViewById(new ContextUtils(getActivity()).getResId(ContextUtils.ResType.ID, "toolbar"));
} catch (Exception e) {
return null;
}
}
}

View File

@ -0,0 +1,351 @@
/*
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
* License: Creative Commons Zero (CC0 1.0) / Public Domain
* http://creativecommons.org/publicdomain/zero/1.0/
*
* You can do whatever you want with this. If we meet some day, and you think it is worth it,
* you can buy me a drink in return. Provided as is without any kind of warranty. Do not blame
* or ask for support if something goes wrong. - Gregor Santner
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
package net.gsantner.opoc.android.dummy;
import android.content.ComponentName;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.view.ActionProvider;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
public class MenuItemDummy implements MenuItem {
private final int _itemId;
public MenuItemDummy(final int itemId) {
_itemId = itemId;
}
@Override
public int getItemId() {
return _itemId;
}
@Override
public int getGroupId() {
return 0;
}
@Override
public int getOrder() {
return 0;
}
@Override
public MenuItem setTitle(CharSequence title) {
return null;
}
@Override
public MenuItem setTitle(int title) {
return null;
}
@Override
public CharSequence getTitle() {
return null;
}
@Override
public MenuItem setTitleCondensed(CharSequence title) {
return null;
}
@Override
public CharSequence getTitleCondensed() {
return null;
}
@Override
public MenuItem setIcon(Drawable icon) {
return null;
}
@Override
public MenuItem setIcon(int iconRes) {
return null;
}
@Override
public Drawable getIcon() {
return null;
}
@Override
public MenuItem setIntent(Intent intent) {
return null;
}
@Override
public Intent getIntent() {
return null;
}
@Override
public MenuItem setShortcut(char numericChar, char alphaChar) {
return null;
}
@Override
public MenuItem setNumericShortcut(char numericChar) {
return null;
}
@Override
public char getNumericShortcut() {
return 0;
}
@Override
public MenuItem setAlphabeticShortcut(char alphaChar) {
return null;
}
@Override
public char getAlphabeticShortcut() {
return 0;
}
@Override
public MenuItem setCheckable(boolean checkable) {
return null;
}
@Override
public boolean isCheckable() {
return false;
}
@Override
public MenuItem setChecked(boolean checked) {
return null;
}
@Override
public boolean isChecked() {
return false;
}
@Override
public MenuItem setVisible(boolean visible) {
return null;
}
@Override
public boolean isVisible() {
return false;
}
@Override
public MenuItem setEnabled(boolean enabled) {
return null;
}
@Override
public boolean isEnabled() {
return false;
}
@Override
public boolean hasSubMenu() {
return false;
}
@Override
public SubMenu getSubMenu() {
return null;
}
@Override
public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {
return null;
}
@Override
public ContextMenu.ContextMenuInfo getMenuInfo() {
return null;
}
@Override
public void setShowAsAction(int actionEnum) {
}
@Override
public MenuItem setShowAsActionFlags(int actionEnum) {
return null;
}
@Override
public MenuItem setActionView(View view) {
return null;
}
@Override
public MenuItem setActionView(int resId) {
return null;
}
@Override
public View getActionView() {
return null;
}
@Override
public MenuItem setActionProvider(ActionProvider actionProvider) {
return null;
}
@Override
public ActionProvider getActionProvider() {
return null;
}
@Override
public boolean expandActionView() {
return false;
}
@Override
public boolean collapseActionView() {
return false;
}
@Override
public boolean isActionViewExpanded() {
return false;
}
@Override
public MenuItem setOnActionExpandListener(OnActionExpandListener listener) {
return null;
}
public static class Menu implements android.view.Menu {
@Override
public MenuItem add(CharSequence title) {
return add(0, 0, 0, "");
}
@Override
public MenuItem add(int titleRes) {
return add(0, 0, 0, "");
}
@Override
public MenuItem add(int groupId, int itemId, int order, CharSequence title) {
return new MenuItemDummy(itemId);
}
@Override
public MenuItem add(int groupId, int itemId, int order, int titleRes) {
return add(0, 0, 0, "");
}
@Override
public SubMenu addSubMenu(CharSequence title) {
return null;
}
@Override
public SubMenu addSubMenu(int titleRes) {
return null;
}
@Override
public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) {
return null;
}
@Override
public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) {
return null;
}
@Override
public int addIntentOptions(int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) {
return 0;
}
@Override
public void removeItem(int id) {
}
@Override
public void removeGroup(int groupId) {
}
@Override
public void clear() {
}
@Override
public void setGroupCheckable(int group, boolean checkable, boolean exclusive) {
}
@Override
public void setGroupVisible(int group, boolean visible) {
}
@Override
public void setGroupEnabled(int group, boolean enabled) {
}
@Override
public boolean hasVisibleItems() {
return false;
}
@Override
public MenuItem findItem(int id) {
return null;
}
@Override
public int size() {
return 0;
}
@Override
public MenuItem getItem(int index) {
return null;
}
@Override
public void close() {
}
@Override
public boolean performShortcut(int keyCode, KeyEvent event, int flags) {
return false;
}
@Override
public boolean isShortcutKey(int keyCode, KeyEvent event) {
return false;
}
@Override
public boolean performIdentifierAction(int id, int flags) {
return false;
}
@Override
public void setQwertyMode(boolean isQwerty) {
}
}
}

View File

@ -0,0 +1,58 @@
/*
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
* License: Creative Commons Zero (CC0 1.0) / Public Domain
* http://creativecommons.org/publicdomain/zero/1.0/
*
* You can do whatever you want with this. If we meet some day, and you think it is worth it,
* you can buy me a drink in return. Provided as is without any kind of warranty. Do not blame
* or ask for support if something goes wrong. - Gregor Santner
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
package net.gsantner.opoc.android.dummy;
import android.text.Editable;
import android.text.TextWatcher;
import net.gsantner.opoc.util.Callback;
@SuppressWarnings({"unused", "SpellCheckingInspection"})
public class TextWatcherDummy implements TextWatcher {
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
}
@Override
public void afterTextChanged(final Editable s) {
}
public static TextWatcher before(final Callback.a4<CharSequence, Integer, Integer, Integer> impl) {
return new TextWatcherDummy() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
impl.callback(s, start, count, after);
}
};
}
public static TextWatcher on(final Callback.a4<CharSequence, Integer, Integer, Integer> impl) {
return new TextWatcherDummy() {
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
impl.callback(s, start, before, count);
}
};
}
public static TextWatcher after(final Callback.a1<Editable> impl) {
return new TextWatcherDummy() {
public void afterTextChanged(final Editable s) {
impl.callback(s);
}
};
}
}

View File

@ -1,9 +1,8 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2018-
* https://gsantner.net/
* Maintained 2018-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* License: Apache 2.0
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
*
@ -93,8 +92,8 @@ public class SimpleMarkdownParser {
.replaceAll("!\\[(.*?)\\]\\((.*?)\\)", "<img src=\\'$2\\' alt='$1' />") // img
.replaceAll("<(http|https):\\/\\/(.*)>", "<a href='$1://$2'>$1://$2</a>") // a href (DEP: img)
.replaceAll("\\[(.*?)\\]\\((.*?)\\)", "<a href=\\'$2\\'>$1</a>") // a href (DEP: img)
.replaceAll("(?m)^([-*] )(.*)$", "<font color='#000001'>&#8226;</font> $2 ") // unordered list + end line
.replaceAll("(?m)^ (-|\\*) ([^<]*)$", "&nbsp;&nbsp;<font color='#000001'>&#8226;</font> $2 ") // unordered list2 + end line
.replaceAll("(?m)^[-*] (.*)$", "<font color='#000001'>&#8226;</font> $1 ") // unordered list + end line
.replaceAll("(?m)^ [-*] (.*)$", "&nbsp;&nbsp;<font color='#000001'>&#8226;</font> $1 ") // unordered list2 + end line
.replaceAll("`([^<]*)`", "<code>$1</code>") // code
.replace("\\*", "") // temporary replace escaped star symbol
.replaceAll("(?m)\\*\\*(.*)\\*\\*", "<b>$1</b>") // bold (DEP: temp star)
@ -111,6 +110,7 @@ public class SimpleMarkdownParser {
public String filter(String text) {
text = text
.replace("New:", "<font color='#276230'>New:</font>")
.replace("New features:", "<font color='#276230'>New:</font>")
.replace("Added:", "<font color='#276230'>Added:</font>")
.replace("Add:", "<font color='#276230'>Add:</font>")
.replace("Fixed:", "<font color='#005688'>Fixed:</font>")
@ -124,6 +124,20 @@ public class SimpleMarkdownParser {
return text;
}
};
public final static SmpFilter FILTER_H_TO_SUP = new SmpFilter() {
@Override
public String filter(String text) {
text = text
.replace("<h1>", "<sup><sup><sup>")
.replace("</h1>", "</sup></sup></sup>")
.replace("<h2>", "<sup><sup>")
.replace("</h2>", "</sup></sup>")
.replace("<h3>", "<sup>")
.replace("</h3>", "</sup>")
;
return text;
}
};
public final static SmpFilter FILTER_NONE = new SmpFilter() {
@Override
public String filter(String text) {

View File

@ -1,9 +1,8 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2018-
* https://gsantner.net/
* Maintained 2018-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* License: Apache 2.0
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
*

View File

@ -1,9 +1,8 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2016-
* https://gsantner.net/
* Maintained 2016-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* License: Apache 2.0
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
*
@ -42,8 +41,12 @@ import android.support.annotation.StringRes;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
@ -56,6 +59,8 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
protected static final String ARRAY_SEPARATOR = "%%%";
protected static final String ARRAY_SEPARATOR_SUBSTITUTE = "§§§";
public static final String SHARED_PREF_APP = "app";
private static String _debugLog = "";
//
// Members, Constructors
@ -163,6 +168,14 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
return ContextCompat.getColor(_context, resColorId);
}
public String[] rstrs(int... keyResourceIds) {
String[] ret = new String[keyResourceIds.length];
for (int i = 0; i < keyResourceIds.length; i++) {
ret[i] = rstr(keyResourceIds[i]);
}
return ret;
}
//
// Getter & Setter for String
@ -188,11 +201,15 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
}
public String getString(String key, String defaultValue, final SharedPreferences... pref) {
return gp(pref).getString(key, defaultValue);
try {
return gp(pref).getString(key, defaultValue);
} catch (ClassCastException e) {
return defaultValue;
}
}
public String getString(@StringRes int keyResourceId, String defaultValue, @StringRes int keyResourceIdDefaultValue, final SharedPreferences... pref) {
return gp(pref).getString(rstr(keyResourceId), rstr(keyResourceIdDefaultValue));
return getString(rstr(keyResourceId), rstr(keyResourceIdDefaultValue), pref);
}
private void setStringListOne(String key, List<String> values, final SharedPreferences pref) {
@ -206,9 +223,7 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
private ArrayList<String> getStringListOne(String key, final SharedPreferences pref) {
ArrayList<String> ret = new ArrayList<>();
String value = pref
.getString(key, ARRAY_SEPARATOR)
.replace(ARRAY_SEPARATOR_SUBSTITUTE, ARRAY_SEPARATOR);
String value = getString(key, ARRAY_SEPARATOR).replace(ARRAY_SEPARATOR_SUBSTITUTE, ARRAY_SEPARATOR);
if (value.equals(ARRAY_SEPARATOR) || TextUtils.isEmpty(value)) {
return ret;
}
@ -243,6 +258,7 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
return list.toArray(new String[list.size()]);
}
public ArrayList<String> getStringList(@StringRes int keyResourceId, final SharedPreferences... pref) {
return getStringListOne(rstr(keyResourceId), gp(pref));
}
@ -263,11 +279,15 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
}
public int getInt(@StringRes int keyResourceId, int defaultValue, final SharedPreferences... pref) {
return gp(pref).getInt(rstr(keyResourceId), defaultValue);
return getInt(rstr(keyResourceId), defaultValue, pref);
}
public int getInt(String key, int defaultValue, final SharedPreferences... pref) {
return gp(pref).getInt(key, defaultValue);
try {
return gp(pref).getInt(key, defaultValue);
} catch (ClassCastException e) {
return defaultValue;
}
}
public int getIntOfStringPref(@StringRes int keyResId, int defaultValue, final SharedPreferences... pref) {
@ -290,7 +310,7 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
private ArrayList<Integer> getIntListOne(String key, final SharedPreferences pref) {
ArrayList<Integer> ret = new ArrayList<>();
String value = pref.getString(key, ARRAY_SEPARATOR);
String value = getString(key, ARRAY_SEPARATOR);
if (value.equals(ARRAY_SEPARATOR)) {
return ret;
}
@ -347,11 +367,15 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
}
public long getLong(@StringRes int keyResourceId, long defaultValue, final SharedPreferences... pref) {
return gp(pref).getLong(rstr(keyResourceId), defaultValue);
return getLong(rstr(keyResourceId), defaultValue, pref);
}
public long getLong(String key, long defaultValue, final SharedPreferences... pref) {
return gp(pref).getLong(key, defaultValue);
try {
return gp(pref).getLong(key, defaultValue);
} catch (ClassCastException e) {
return defaultValue;
}
}
//
@ -366,11 +390,15 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
}
public float getFloat(@StringRes int keyResourceId, float defaultValue, final SharedPreferences... pref) {
return gp(pref).getFloat(rstr(keyResourceId), defaultValue);
return getFloat(rstr(keyResourceId), defaultValue);
}
public float getFloat(String key, float defaultValue, final SharedPreferences... pref) {
return gp(pref).getFloat(key, defaultValue);
try {
return gp(pref).getFloat(key, defaultValue);
} catch (ClassCastException e) {
return defaultValue;
}
}
//
@ -404,22 +432,26 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
}
public boolean getBool(@StringRes int keyResourceId, boolean defaultValue, final SharedPreferences... pref) {
return gp(pref).getBoolean(rstr(keyResourceId), defaultValue);
return getBool(rstr(keyResourceId), defaultValue);
}
public boolean getBool(String key, boolean defaultValue, final SharedPreferences... pref) {
return gp(pref).getBoolean(key, defaultValue);
try {
return gp(pref).getBoolean(key, defaultValue);
} catch (ClassCastException e) {
return defaultValue;
}
}
//
// Getter & Setter for Color
//
public int getColor(String key, @ColorRes int defaultColor, final SharedPreferences... pref) {
return gp(pref).getInt(key, rcolor(defaultColor));
return getInt(key, rcolor(defaultColor));
}
public int getColor(@StringRes int keyResourceId, @ColorRes int defaultColor, final SharedPreferences... pref) {
return gp(pref).getInt(rstr(keyResourceId), rcolor(defaultColor));
return getColor(rstr(keyResourceId), defaultColor);
}
//
@ -512,4 +544,74 @@ public class SharedPreferencesPropertyBackend implements PropertyBackend<String,
setStringListOne(key, value, _prefApp);
return this;
}
public boolean contains(String key, final SharedPreferences... pref) {
return gp(pref).contains(key);
}
/**
* A method to determine if current hour is between begin and end.
* This is especially useful for time-based light/dark mode
*/
public static boolean isCurrentHourOfDayBetween(int begin, int end) {
begin = (begin >= 23 || begin < 0) ? 0 : begin;
end = (end >= 23 || end < 0) ? 0 : end;
int h = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
return h >= begin && h <= end;
}
/**
* Substract current datetime by given amount of days
*/
public Date getDateOfDaysAgo(int days) {
Calendar cal = new GregorianCalendar();
cal.add(Calendar.DATE, -days);
return cal.getTime();
}
/**
* Substract current datetime by given amount of days and check if the given date passed
*/
public boolean didDaysPassedSince(Date date, int days) {
if (date == null || days < 0) {
return false;
}
return date.before(getDateOfDaysAgo(days));
}
public boolean afterDaysTrue(String key, int daysSinceLastTime, int firstTime, final SharedPreferences... pref) {
Date d = new Date(System.currentTimeMillis());
if (!contains(key)) {
d = getDateOfDaysAgo(daysSinceLastTime - firstTime);
setLong(key, d.getTime());
return firstTime < 1;
} else {
d = new Date(getLong(key, d.getTime()));
}
boolean trigger = didDaysPassedSince(d, daysSinceLastTime);
if (trigger) {
setLong(key, new Date(System.currentTimeMillis()).getTime());
}
return trigger;
}
public static void clearDebugLog() {
_debugLog = "";
}
public static String getDebugLog() {
return _debugLog;
}
public static synchronized void appendDebugLog(String text) {
_debugLog += "[" + new Date().toString() + "] " + text + "\n";
}
public static boolean ne(final String str) {
return str != null && !str.trim().isEmpty();
}
public static boolean fexists(final String fp) {
return ne(fp) && (new File(fp)).exists();
}
}

View File

@ -1,7 +1,6 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2017-
* https://gsantner.net/
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0
* https://github.com/gsantner/opoc/#licensing

View File

@ -1,7 +1,6 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2017-
* https://gsantner.net/
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0
* https://github.com/gsantner/opoc/#licensing
@ -10,42 +9,87 @@
#########################################################*/
package net.gsantner.opoc.ui;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.support.annotation.DrawableRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.AppCompatEditText;
import android.text.Editable;
import android.support.v7.widget.TooltipCompat;
import android.text.InputType;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Checkable;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import net.gsantner.opoc.android.dummy.TextWatcherDummy;
import net.gsantner.opoc.util.Callback;
import net.gsantner.opoc.util.ContextUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.regex.Pattern;
@SuppressWarnings("WeakerAccess")
@SuppressLint("SetTextI18n")
public class SearchOrCustomTextDialog {
public static class DialogOptions {
public Callback.a1<String> callback;
public List<? extends CharSequence> data = new ArrayList<>();
public List<? extends CharSequence> highlightData = new ArrayList<>();
// Callback for search text or text of single item
@Nullable
public Callback.a1<String> callback = null;
// Callback for indices of selected items.
// List will contain single item if isMultiSelectEnabled == false;
@Nullable
public Callback.a1<List<Integer>> positionCallback = null;
public boolean isMultiSelectEnabled = false;
public List<? extends CharSequence> data = null;
public List<? extends CharSequence> highlightData = null;
public List<Integer> iconsForData;
public String messageText = "";
public String defaultText = "";
public boolean isSearchEnabled = true;
public boolean isDarkDialog = false;
public int dialogWidthDp = WindowManager.LayoutParams.MATCH_PARENT;
public int dialogHeightDp = WindowManager.LayoutParams.WRAP_CONTENT;
public int gravity = Gravity.NO_GRAVITY;
public int searchInputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
public boolean searchIsRegex = false;
public Callback.a1<Spannable> highlighter = null;
public String extraFilter = null;
public List<Integer> preSelected = null;
public Callback.a0 neutralButtonCallback = null;
@ColorInt
public int textColor = 0xFF000000;
@ -54,124 +98,219 @@ public class SearchOrCustomTextDialog {
@StringRes
public int cancelButtonText = android.R.string.cancel;
@StringRes
public int neutralButtonText = 0;
@StringRes
public int okButtonText = android.R.string.ok;
@StringRes
public int titleText = android.R.string.untitled;
public int titleText = 0;
@StringRes
public int searchHintText = android.R.string.search_go;
@DrawableRes
public int clearInputIcon = android.R.drawable.ic_input_delete;
}
private static class Adapter extends ArrayAdapter<Integer> {
@LayoutRes
private final int _layout;
private final int _layoutHeight;
private final LayoutInflater _inflater;
private final DialogOptions _dopt;
private final List<Integer> _filteredItems;
private final Set<Integer> _selectedItems;
private final Pattern _extraPattern;
public static Adapter create(final Context context, final DialogOptions dopt) {
return new Adapter(context, dopt, dopt.isMultiSelectEnabled ? android.R.layout.simple_list_item_multiple_choice : android.R.layout.simple_list_item_1, new ArrayList<>());
}
private Adapter(final Context context, final DialogOptions dopt, final int layout, final List<Integer> filteredItems) {
super(context, layout, filteredItems);
_layout = layout;
_filteredItems = filteredItems;
_inflater = LayoutInflater.from(context);
_dopt = dopt;
_extraPattern = (_dopt.extraFilter == null ? null : Pattern.compile(_dopt.extraFilter));
_selectedItems = new HashSet<>(_dopt.preSelected != null ? _dopt.preSelected : Collections.emptyList());
ContextUtils cu = new ContextUtils(context);
_layoutHeight = (int) cu.convertDpToPx(36);
cu.freeContextRef();
}
@NonNull
@Override
public View getView(int pos, @Nullable View convertView, @NonNull ViewGroup parent) {
final int index = getItem(pos);
final TextView textView;
if (convertView == null) {
textView = (TextView) _inflater.inflate(_layout, parent, false);
textView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
textView.setMinHeight(_layoutHeight);
} else {
textView = (TextView) convertView;
}
if (textView instanceof Checkable) {
((Checkable) textView).setChecked(_selectedItems.contains(index));
}
if (index >= 0 && _dopt.iconsForData != null && index < _dopt.iconsForData.size() && _dopt.iconsForData.get(index) != 0) {
textView.setCompoundDrawablesWithIntrinsicBounds(_dopt.iconsForData.get(index), 0, 0, 0);
textView.setCompoundDrawablePadding(32);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setCompoundDrawableTintList(ColorStateList.valueOf(_dopt.isDarkDialog ? Color.WHITE : Color.BLACK));
}
} else {
textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}
final CharSequence text = _dopt.data.get(index).toString();
if (_dopt.highlightData != null) {
final boolean hl = _dopt.highlightData.contains(text);
textView.setTextColor(hl ? _dopt.highlightColor : _dopt.textColor);
textView.setTypeface(null, hl ? Typeface.BOLD : Typeface.NORMAL);
}
if (_dopt.highlighter != null) {
Spannable s = new SpannableString(text);
_dopt.highlighter.callback(s);
textView.setText(s);
} else {
textView.setText(text);
}
return textView;
}
@NonNull
@Override
public Filter getFilter() {
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(final CharSequence constraint, final FilterResults results) {
_filteredItems.clear();
_filteredItems.addAll((List<Integer>) results.values);
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(final CharSequence constraint) {
final List<Integer> resList = new ArrayList<>();
if (_dopt.data != null) {
final String fil = constraint.toString();
final boolean emptySearch = fil.isEmpty();
for (int i = 0; i < _dopt.data.size(); i++) {
final String str = _dopt.data.get(i).toString();
final boolean matchExtra = (_extraPattern == null) || _extraPattern.matcher(str).find();
final Locale locale = Locale.getDefault();
final boolean matchNormal = str.toLowerCase(locale).contains(fil.toLowerCase(locale));
final boolean matchRegex = _dopt.searchIsRegex && (str.matches(fil));
if (matchExtra && (matchNormal || matchRegex || emptySearch)) {
resList.add(i);
}
}
}
final FilterResults res = new FilterResults();
res.values = resList;
res.count = resList.size();
return res;
}
};
}
}
public static void showMultiChoiceDialogWithSearchFilterUI(final Activity activity, final DialogOptions dopt) {
final List<CharSequence> allItems = new ArrayList<>(dopt.data);
final List<CharSequence> filteredItems = new ArrayList<>(allItems);
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity, dopt.isDarkDialog
? android.support.v7.appcompat.R.style.Theme_AppCompat_Dialog
: android.support.v7.appcompat.R.style.Theme_AppCompat_Light_Dialog
);
final ArrayAdapter<CharSequence> listAdapter = new ArrayAdapter<CharSequence>(activity, android.R.layout.simple_list_item_1, filteredItems) {
@NonNull
@Override
public View getView(int pos, @Nullable View convertView, @NonNull ViewGroup parent) {
TextView textView = (TextView) super.getView(pos, convertView, parent);
String text = textView.getText().toString();
textView.setTextColor(dopt.textColor);
if (dopt.highlightData.contains(text)) {
textView.setTextColor(dopt.highlightColor);
}
return textView;
}
@Override
public Filter getFilter() {
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(final CharSequence constraint, final FilterResults results) {
filteredItems.clear();
filteredItems.addAll((List<String>) results.values);
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(final CharSequence constraint) {
final FilterResults res = new FilterResults();
final ArrayList<CharSequence> resList = new ArrayList<>();
final String fil = constraint.toString();
for (final CharSequence str : allItems) {
if ("".equals(fil) || str.toString().toLowerCase(Locale.getDefault()).contains(fil.toLowerCase(Locale.getDefault()))) {
resList.add(str);
}
}
res.values = resList;
res.count = resList.size();
return res;
}
};
}
};
final Adapter listAdapter = Adapter.create(activity, dopt);
final AppCompatEditText searchEditText = new AppCompatEditText(activity);
searchEditText.setText(dopt.defaultText);
searchEditText.setSingleLine(true);
searchEditText.setMaxLines(1);
searchEditText.setTextColor(dopt.textColor);
searchEditText.setHintTextColor((dopt.textColor & 0x00FFFFFF) | 0x99000000);
searchEditText.setHint(dopt.searchHintText);
searchEditText.setInputType(dopt.searchInputType == 0 ? searchEditText.getInputType() : dopt.searchInputType);
searchEditText.addTextChangedListener(TextWatcherDummy.after((cbEditable) -> listAdapter.getFilter().filter(cbEditable)));
searchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(final Editable arg0) {
listAdapter.getFilter().filter(searchEditText.getText());
}
final ContextUtils cu = new ContextUtils(activity);
final int margin = (int) cu.convertDpToPx(8);
cu.freeContextRef();
@Override
public void onTextChanged(final CharSequence arg0, final int arg1, final int arg2, final int arg3) {
}
final LinearLayout searchLayout = new LinearLayout(activity);
searchLayout.setOrientation(LinearLayout.HORIZONTAL);
@Override
public void beforeTextChanged(final CharSequence arg0, final int arg1, final int arg2, final int arg3) {
}
});
LinearLayout.LayoutParams lp;
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1);
lp.gravity = Gravity.START | Gravity.BOTTOM;
searchLayout.addView(searchEditText, lp);
// 'Button to clear the search box'
final ImageView clearButton = new ImageView(activity);
clearButton.setImageResource(dopt.clearInputIcon);
TooltipCompat.setTooltipText(clearButton, activity.getString(android.R.string.cancel));
clearButton.setColorFilter(dopt.isDarkDialog ? Color.WHITE : Color.parseColor("#ff505050"));
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 0);
lp.gravity = Gravity.END | Gravity.CENTER_VERTICAL;
lp.setMargins(margin, 0, (int) (margin * 1.5), 0);
searchLayout.addView(clearButton, lp);
clearButton.setOnClickListener((v) -> searchEditText.setText(""));
final ListView listView = new ListView(activity);
final LinearLayout linearLayout = new LinearLayout(activity);
listView.setAdapter(listAdapter);
listView.setVisibility(dopt.data != null && !dopt.data.isEmpty() ? View.VISIBLE : View.GONE);
linearLayout.setOrientation(LinearLayout.VERTICAL);
if (dopt.isSearchEnabled) {
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
ContextUtils cu = new net.gsantner.opoc.util.ContextUtils(listView.getContext());
int px = (int) (new net.gsantner.opoc.util.ContextUtils(listView.getContext()).convertDpToPx(8));
lp.setMargins(px, px / 2, px, px / 2);
linearLayout.addView(searchEditText, lp);
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(margin, margin / 2, margin, margin / 2);
linearLayout.addView(searchLayout, lp);
}
final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);
layoutParams.weight = 1;
linearLayout.addView(listView, layoutParams);
if (!TextUtils.isEmpty(dopt.messageText)) {
dialogBuilder.setMessage(dopt.messageText);
}
dialogBuilder.setView(linearLayout)
.setTitle(dopt.titleText)
.setOnCancelListener(null)
.setNegativeButton(dopt.cancelButtonText, null);
if (dopt.isSearchEnabled) {
.setNegativeButton(dopt.cancelButtonText, (dialogInterface, i) -> dialogInterface.dismiss());
if (dopt.titleText != 0) {
dialogBuilder.setTitle(dopt.titleText);
}
// Ok button action
if ((dopt.isSearchEnabled && dopt.callback != null) || (dopt.isMultiSelectEnabled)) {
dialogBuilder.setPositiveButton(dopt.okButtonText, (dialogInterface, i) -> {
dialogInterface.dismiss();
if (dopt.callback != null && !TextUtils.isEmpty(searchEditText.getText().toString())) {
dopt.callback.callback(searchEditText.getText().toString());
final String searchText = dopt.isSearchEnabled ? searchEditText.getText().toString() : null;
if (dopt.positionCallback != null && !listAdapter._selectedItems.isEmpty()) {
final List<Integer> sel = new ArrayList<>(listAdapter._selectedItems);
Collections.sort(sel);
dopt.positionCallback.callback(sel);
} else if (dopt.callback != null && !TextUtils.isEmpty(searchText)) {
dopt.callback.callback(searchText);
}
});
}
// Setup neutralbutton
if (dopt.neutralButtonCallback != null && dopt.neutralButtonText != 0) {
dialogBuilder.setNeutralButton(dopt.neutralButtonText, (dialogInterface, i) -> {
dopt.neutralButtonCallback.callback();
});
}
final AlertDialog dialog = dialogBuilder.create();
listView.setOnItemClickListener((parent, view, position, id) -> {
dialog.dismiss();
if (dopt.callback != null) {
dopt.callback.callback(filteredItems.get(position).toString());
}
});
searchEditText.setOnKeyListener((keyView, keyCode, keyEvent) -> {
if ((keyEvent.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
@ -184,6 +323,72 @@ public class SearchOrCustomTextDialog {
return false;
});
Window w;
if ((w = dialog.getWindow()) != null && dopt.isSearchEnabled) {
w.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
dialog.show();
if ((w = dialog.getWindow()) != null) {
int ds_w = dopt.dialogWidthDp < 100 ? dopt.dialogWidthDp : ((int) (dopt.dialogWidthDp * activity.getResources().getDisplayMetrics().density));
int ds_h = dopt.dialogHeightDp < 100 ? dopt.dialogHeightDp : ((int) (dopt.dialogHeightDp * activity.getResources().getDisplayMetrics().density));
w.setLayout(ds_w, ds_h);
}
if ((w = dialog.getWindow()) != null && dopt.gravity != Gravity.NO_GRAVITY) {
WindowManager.LayoutParams wlp = w.getAttributes();
wlp.gravity = dopt.gravity;
w.setAttributes(wlp);
}
if (dopt.isSearchEnabled) {
searchEditText.requestFocus();
}
if (dopt.defaultText != null) {
listAdapter.getFilter().filter(searchEditText.getText());
}
// Helper function to trigger callback with single item
final Callback.b1<Integer> directActivate = (position) -> {
final int index = listAdapter._filteredItems.get(position);
dialog.dismiss();
if (dopt.callback != null) {
dopt.callback.callback(dopt.data.get(index).toString());
}
if (dopt.positionCallback != null) {
dopt.positionCallback.callback(Collections.singletonList(index));
}
return true;
};
// Helper function to append selection count to OK button
final Button okButton = dialog.getButton(Dialog.BUTTON_POSITIVE);
final String okText = activity.getString(dopt.okButtonText) + (dopt.isMultiSelectEnabled ? " (%d)" : "");
final Callback.a0 setOkButtonState = () -> {
okButton.setText(okText.replace("%d", Integer.toString(listAdapter._selectedItems.size())));
};
// Set ok button text initially
setOkButtonState.callback();
// Item click action
listView.setOnItemClickListener((parent, textView, pos, id) -> {
if (dopt.isMultiSelectEnabled) {
final int index = listAdapter._filteredItems.get(pos);
if (listAdapter._selectedItems.contains(index)) {
listAdapter._selectedItems.remove(index);
} else {
listAdapter._selectedItems.add(index);
}
if (textView instanceof Checkable) {
((Checkable) textView).setChecked(listAdapter._selectedItems.contains(index));
}
setOkButtonState.callback();
} else {
directActivate.callback(pos);
}
});
// long click always activates
listView.setOnItemLongClickListener((parent, view, pos, id) -> directActivate.callback(pos));
}
}

View File

@ -1,21 +1,27 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2016-
* https://gsantner.net/
* Maintained 2016-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
* License of this file: Apache 2.0
* https://www.apache.org/licenses/LICENSE-2.0
* https://github.com/gsantner/opoc/#licensing
*
#########################################################*/
package net.gsantner.opoc.util;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.TypedArray;
import android.net.Uri;
import android.os.Build;
import android.provider.CalendarContract;
import android.support.annotation.ColorInt;
import android.support.annotation.StringRes;
import android.support.design.widget.Snackbar;
import android.support.v4.content.ContextCompat;
@ -26,12 +32,16 @@ import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
import android.util.TypedValue;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebView;
import android.widget.ScrollView;
import java.util.List;
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection"})
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection", "rawtypes", "UnusedReturnValue"})
public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
//########################
//## Members, Constructors
@ -43,6 +53,12 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
_activity = activity;
}
@Override
public void freeContextRef() {
super.freeContextRef();
_activity = null;
}
//########################
//## Methods
//########################
@ -81,9 +97,11 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
}
public void showSnackBar(@StringRes int stringResId, boolean showLong) {
Snackbar.make(_activity.findViewById(android.R.id.content), stringResId,
showLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT).show();
public Snackbar showSnackBar(@StringRes int stringResId, boolean showLong) {
Snackbar s = Snackbar.make(_activity.findViewById(android.R.id.content), stringResId,
showLong ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
s.show();
return s;
}
public void showSnackBar(@StringRes int stringResId, boolean showLong, @StringRes int actionResId, View.OnClickListener listener) {
@ -93,18 +111,58 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
.show();
}
public void hideSoftKeyboard() {
InputMethodManager imm = (InputMethodManager) _activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm != null && _activity.getCurrentFocus() != null && _activity.getCurrentFocus().getWindowToken() != null) {
imm.hideSoftInputFromWindow(_activity.getCurrentFocus().getWindowToken(), 0);
public ActivityUtils setSoftKeyboardVisibile(boolean visible, View... editView) {
final Activity activity = _activity;
if (activity != null) {
final View v = (editView != null && editView.length > 0) ? (editView[0]) : (activity.getCurrentFocus() != null && activity.getCurrentFocus().getWindowToken() != null ? activity.getCurrentFocus() : null);
final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (v != null && imm != null) {
Runnable r = () -> {
if (visible) {
v.requestFocus();
imm.showSoftInput(v, InputMethodManager.SHOW_FORCED);
} else {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
};
r.run();
for (int d : new int[]{100, 350}) {
v.postDelayed(r, d);
}
}
}
return this;
}
public void showSoftKeyboard() {
InputMethodManager imm = (InputMethodManager) _activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm != null && _activity.getCurrentFocus() != null && _activity.getCurrentFocus().getWindowToken() != null) {
imm.showSoftInput(_activity.getCurrentFocus(), InputMethodManager.SHOW_FORCED);
public ActivityUtils hideSoftKeyboard() {
if (_activity != null) {
InputMethodManager imm = (InputMethodManager) _activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm != null && _activity.getCurrentFocus() != null && _activity.getCurrentFocus().getWindowToken() != null) {
imm.hideSoftInputFromWindow(_activity.getCurrentFocus().getWindowToken(), 0);
}
}
return this;
}
public ActivityUtils showSoftKeyboard() {
if (_activity != null) {
InputMethodManager imm = (InputMethodManager) _activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm != null && _activity.getCurrentFocus() != null && _activity.getCurrentFocus().getWindowToken() != null) {
showSoftKeyboard(_activity.getCurrentFocus());
}
}
return this;
}
public ActivityUtils showSoftKeyboard(View textInputView) {
if (_activity != null) {
InputMethodManager imm = (InputMethodManager) _activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm != null && textInputView != null) {
imm.showSoftInput(textInputView, InputMethodManager.SHOW_FORCED);
}
}
return this;
}
public void showDialogWithHtmlTextView(@StringRes int resTitleId, String html) {
@ -112,19 +170,23 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
}
public void showDialogWithHtmlTextView(@StringRes int resTitleId, String text, boolean isHtml, DialogInterface.OnDismissListener dismissedListener) {
ScrollView scroll = new ScrollView(_context);
AppCompatTextView textView = new AppCompatTextView(_context);
int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16,
_context.getResources().getDisplayMetrics());
textView.setMovementMethod(new LinkMovementMethod());
textView.setPadding(padding, 0, padding, 0);
int padding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, _context.getResources().getDisplayMetrics());
scroll.setPadding(padding, 0, padding, 0);
scroll.addView(textView);
textView.setMovementMethod(new LinkMovementMethod());
textView.setText(isHtml ? new SpannableString(Html.fromHtml(text)) : text);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17);
AlertDialog.Builder dialog = new AlertDialog.Builder(_context)
.setPositiveButton(android.R.string.ok, null)
.setOnDismissListener(dismissedListener)
.setTitle(resTitleId)
.setView(textView);
dialog.show();
.setPositiveButton(android.R.string.ok, null).setOnDismissListener(dismissedListener)
.setView(scroll);
if (resTitleId != 0) {
dialog.setTitle(resTitleId);
}
dialogFullWidth(dialog.show(), true, false);
}
public void showDialogWithRawFileInWebView(String fileInRaw, @StringRes int resTitleId) {
@ -134,11 +196,11 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
.setPositiveButton(android.R.string.ok, null)
.setTitle(resTitleId)
.setView(wv);
dialog.show();
dialogFullWidth(dialog.show(), true, false);
}
// Toggle with no param, else set visibility according to first bool
public void toggleStatusbarVisibility(boolean... optionalForceVisible) {
public ActivityUtils toggleStatusbarVisibility(boolean... optionalForceVisible) {
WindowManager.LayoutParams attrs = _activity.getWindow().getAttributes();
int flag = WindowManager.LayoutParams.FLAG_FULLSCREEN;
if (optionalForceVisible.length == 0) {
@ -149,9 +211,10 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
attrs.flags |= flag;
}
_activity.getWindow().setAttributes(attrs);
return this;
}
public void showGooglePlayEntryForThisApp() {
public ActivityUtils showGooglePlayEntryForThisApp() {
String pkgId = "details?id=" + _activity.getPackageName();
Intent goToMarket = new Intent(Intent.ACTION_VIEW, Uri.parse("market://" + pkgId));
goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY |
@ -161,11 +224,12 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
_activity.startActivity(goToMarket);
} catch (ActivityNotFoundException e) {
_activity.startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("http://play.google.com/store/apps/" + pkgId)));
Uri.parse("https://play.google.com/store/apps/" + pkgId)));
}
return this;
}
public void setStatusbarColor(int color, boolean... fromRes) {
public ActivityUtils setStatusbarColor(int color, boolean... fromRes) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (fromRes != null && fromRes.length > 0 && fromRes[0]) {
color = ContextCompat.getColor(_context, color);
@ -173,5 +237,110 @@ public class ActivityUtils extends net.gsantner.opoc.util.ContextUtils {
_activity.getWindow().setStatusBarColor(color);
}
return this;
}
public ActivityUtils setLauncherActivityEnabled(Class activityClass, boolean enable) {
try {
ComponentName component = new ComponentName(_context, activityClass);
_context.getPackageManager().setComponentEnabledSetting(component, enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
} catch (Exception ignored) {
}
return this;
}
public boolean isLauncherEnabled(Class activityClass) {
try {
ComponentName component = new ComponentName(_context, activityClass);
return _context.getPackageManager().getComponentEnabledSetting(component) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
} catch (Exception ignored) {
}
return false;
}
@ColorInt
public Integer getCurrentPrimaryColor() {
TypedValue typedValue = new TypedValue();
_context.getTheme().resolveAttribute(getResId(ResType.ATTR, "colorPrimary"), typedValue, true);
return typedValue.data;
}
@ColorInt
public Integer getCurrentPrimaryDarkColor() {
TypedValue typedValue = new TypedValue();
_context.getTheme().resolveAttribute(getResId(ResType.ATTR, "colorPrimaryDark"), typedValue, true);
return typedValue.data;
}
@ColorInt
public Integer getCurrentAccentColor() {
TypedValue typedValue = new TypedValue();
_context.getTheme().resolveAttribute(getResId(ResType.ATTR, "colorAccent"), typedValue, true);
return typedValue.data;
}
@ColorInt
public Integer getActivityBackgroundColor() {
TypedArray array = _activity.getTheme().obtainStyledAttributes(new int[]{
android.R.attr.colorBackground,
});
int c = array.getColor(0, 0xFF0000);
array.recycle();
return c;
}
public ActivityUtils startCalendarApp() {
Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
builder.appendPath("time");
builder.appendPath(Long.toString(System.currentTimeMillis()));
Intent intent = new Intent(Intent.ACTION_VIEW, builder.build());
_activity.startActivity(intent);
return this;
}
/**
* Detect if the activity is currently in splitscreen/multiwindow mode
*/
public boolean isInSplitScreenMode() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return _activity.isInMultiWindowMode();
}
return false;
}
/**
* Show dialog in full width / show keyboard
*
* @param dialog Get via dialog.show()
*/
public void dialogFullWidth(AlertDialog dialog, boolean fullWidth, boolean showKeyboard) {
try {
Window w;
if (dialog != null && (w = dialog.getWindow()) != null) {
if (fullWidth) {
w.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
}
if (showKeyboard) {
w.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
} catch (Exception ignored) {
}
}
// Make activity/app not show up in the recents history - call before finish / System.exit
public ActivityUtils removeActivityFromHistory() {
try {
ActivityManager am = (ActivityManager) _activity.getSystemService(Context.ACTIVITY_SERVICE);
if (am != null && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
List<ActivityManager.AppTask> tasks = am.getAppTasks();
if (tasks != null && !tasks.isEmpty()) {
tasks.get(0).setExcludeFromRecents(true);
}
}
} catch (Exception ignored) {
}
return this;
}
}

View File

@ -1,7 +1,6 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2017-
* https://gsantner.net/
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0
* https://github.com/gsantner/opoc/#licensing
@ -46,8 +45,9 @@ import java.util.Set;
/**
* Simple Host-Based AdBlocker
*/
@SuppressWarnings({"WeakerAccess", "SpellCheckingInspection", "unused"})
@SuppressWarnings({"WeakerAccess", "SpellCheckingInspection", "unused", "TryFinallyCanBeTryWithResources"})
public class AdBlock {
private static final Object synchronizeObj = new Object();
private static final AdBlock instance = new AdBlock();
public static AdBlock getInstance() {
@ -61,7 +61,9 @@ public class AdBlock {
//########################
private final Set<String> _adblockHostsFromRaw = new HashSet<>();
private final Set<String> _adblockHosts = new HashSet<>();
private boolean _isLoaded;
private final List<Callback.b3<URI, String, String>> _customBlockCallbacks = new ArrayList<>();
private boolean _isLoaded = false;
private boolean _isAdblockLogging = false;
//########################
//##
@ -72,25 +74,47 @@ public class AdBlock {
}
public boolean isAdHost(String urlS) {
boolean block = false;
if (urlS != null && !urlS.isEmpty() && urlS.startsWith("http")) {
try {
URI url = new URI(urlS);
URI url;
try {
url = new URI(urlS);
} catch (Exception e) {
url = new URI(urlS.replaceFirst("[?].*", ""));
}
String host = url.getHost().trim();
if (host.startsWith("www.") && host.length() >= 4) {
host = host.substring(4);
}
return _adblockHosts.contains(host) || _adblockHosts.contains("www." + host);
block = _adblockHosts.contains(host) || _adblockHosts.contains("www." + host);
for (Callback.b3<URI, String, String> cb : _customBlockCallbacks) {
if (block) {
break;
}
try {
block = cb.callback(url, urlS, host);
} catch (Exception ignored) {
}
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
return false;
if (_isAdblockLogging) {
Log.d(getClass().getSimpleName(), "UrlAllowed-" + (block ? "N" : "Y") + " " + urlS);
}
return block;
}
public AdBlock reset() {
_adblockHosts.clear();
_adblockHosts.addAll(_adblockHostsFromRaw);
synchronized (synchronizeObj) {
_adblockHosts.clear();
_adblockHosts.addAll(_adblockHostsFromRaw);
_customBlockCallbacks.clear();
}
return this;
}
@ -102,7 +126,7 @@ public class AdBlock {
return new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream("".getBytes()));
}
public void addBlockedHosts(String... hosts) {
public AdBlock addBlockedHosts(String... hosts) {
for (String host : hosts) {
if (host != null) {
host = host.trim();
@ -110,23 +134,29 @@ public class AdBlock {
host = host.substring(4);
}
if (!host.startsWith("#") && !host.startsWith("\"")) {
_adblockHosts.add(host);
synchronized (synchronizeObj) {
_adblockHosts.add(host);
}
}
}
}
return this;
}
public void loadHostsFromRawAssetsAsync(final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
try {
public void loadHostsFromRawAssetsAsync(final Context context, final boolean... debugIgnoreAssets) {
if (debugIgnoreAssets != null && debugIgnoreAssets.length > 0 && debugIgnoreAssets[0]) {
_isLoaded = true;
return;
}
new Thread(() -> {
try {
synchronized (synchronizeObj) {
loadHostsFromRawAssets(context);
_isLoaded = true;
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
@ -172,4 +202,17 @@ public class AdBlock {
}
return adblockResIds;
}
// URI uri, String url, String host
public AdBlock addCustomBlockCallback(Callback.b3<URI, String, String> cb) {
synchronized (synchronizeObj) {
_customBlockCallbacks.add(cb);
}
return this;
}
public AdBlock setLogEnabled(boolean isAdblockLogging) {
_isAdblockLogging = isAdblockLogging;
return this;
}
}

View File

@ -1,17 +1,21 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2018-
* https://gsantner.net/
* Maintained 2018-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
* License of this file: Apache 2.0
* https://www.apache.org/licenses/LICENSE-2.0
* https://github.com/gsantner/opoc/#licensing
*
#########################################################*/
package net.gsantner.opoc.util;
@SuppressWarnings("unused")
public class Callback {
public interface a0 {
void callback();
}
public interface a1<A> {
void callback(A arg1);
}
@ -31,4 +35,52 @@ public class Callback {
public interface a5<A, B, C, D, E> {
void callback(A arg1, B arg2, C arg3, D arg4, E arg5);
}
public interface b0 {
boolean callback();
}
public interface b1<A> {
boolean callback(A arg1);
}
public interface b2<A, B> {
boolean callback(A arg1, B arg2);
}
public interface b3<A, B, C> {
boolean callback(A arg1, B arg2, C arg3);
}
public interface b4<A, B, C, D> {
boolean callback(A arg1, B arg2, C arg3, D arg4);
}
public interface b5<A, B, C, D, E> {
boolean callback(A arg1, B arg2, C arg3, D arg4, E arg5);
}
public interface s0 {
String callback();
}
public interface s1<A> {
String callback(A arg1);
}
public interface s2<A, B> {
String callback(A arg1, B arg2);
}
public interface s3<A, B, C> {
String callback(A arg1, B arg2, C arg3);
}
public interface s4<A, B, C, D> {
String callback(A arg1, B arg2, C arg3, D arg4);
}
public interface s5<A, B, C, D, E> {
String callback(A arg1, B arg2, C arg3, D arg4, E arg5);
}
}

View File

@ -1,20 +1,21 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2016-
* https://gsantner.net/
* Maintained 2016-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
* License of this file: Apache 2.0
* https://www.apache.org/licenses/LICENSE-2.0
* https://github.com/gsantner/opoc/#licensing
*
#########################################################*/
package net.gsantner.opoc.util;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
@ -37,6 +38,10 @@ import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.SystemClock;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.support.annotation.ColorInt;
import android.support.annotation.ColorRes;
import android.support.annotation.DrawableRes;
@ -44,9 +49,14 @@ import android.support.annotation.Nullable;
import android.support.annotation.RawRes;
import android.support.annotation.StringRes;
import android.support.graphics.drawable.VectorDrawableCompat;
import android.support.v4.app.ActivityManagerCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.text.TextUtilsCompat;
import android.support.v4.util.Pair;
import android.support.v4.view.ViewCompat;
import android.text.Html;
import android.text.InputFilter;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
@ -55,6 +65,11 @@ import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.WindowManager;
import android.webkit.MimeTypeMap;
import android.widget.ImageView;
import android.widget.TextView;
@ -62,17 +77,21 @@ import net.gsantner.opoc.format.markdown.SimpleMarkdownParser;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import static android.content.Context.VIBRATOR_SERVICE;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.graphics.Bitmap.CompressFormat;
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "ObsoleteSdkInt", "deprecation", "SpellCheckingInspection"})
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "ObsoleteSdkInt", "deprecation", "SpellCheckingInspection", "TryFinallyCanBeTryWithResources", "UnusedAssignment", "UnusedReturnValue"})
public class ContextUtils {
//
// Members, Constructors
@ -87,6 +106,9 @@ public class ContextUtils {
return _context;
}
public void freeContextRef() {
_context = null;
}
//
// Class Methods
@ -101,39 +123,55 @@ public class ContextUtils {
*
* @return A valid id if the id could be found, else 0
*/
public int getResId(ResType resType, final String name) {
return _context.getResources().getIdentifier(name, resType.name().toLowerCase(), _context.getPackageName());
public int getResId(final ResType resType, final String name) {
try {
return _context.getResources().getIdentifier(name, resType.name().toLowerCase(), _context.getPackageName());
} catch (Exception e) {
return 0;
}
}
/**
* Get String by given string ressource id (nuermic)
*/
public String rstr(@StringRes int strResId) {
return _context.getString(strResId);
public String rstr(@StringRes final int strResId) {
try {
return _context.getString(strResId);
} catch (Exception e) {
return null;
}
}
/**
* Get String by given string ressource identifier (textual)
*/
public String rstr(String strResKey) {
public String rstr(final String strResKey, Object... a0getResKeyAsFallback) {
try {
return rstr(getResId(ResType.STRING, strResKey));
} catch (Resources.NotFoundException e) {
return null;
return a0getResKeyAsFallback != null && a0getResKeyAsFallback.length > 0 ? strResKey : null;
}
}
/**
* Get drawable from given ressource identifier
*/
public Drawable rdrawable(@DrawableRes int resId) {
return ContextCompat.getDrawable(_context, resId);
public Drawable rdrawable(@DrawableRes final int resId) {
try {
return ContextCompat.getDrawable(_context, resId);
} catch (Exception e) {
return null;
}
}
/**
* Get color by given color ressource id
*/
public int rcolor(@ColorRes int resId) {
public int rcolor(@ColorRes final int resId) {
if (resId == 0) {
Log.e(getClass().getName(), "ContextUtils::rcolor: resId is 0!");
return Color.BLACK;
}
return ContextCompat.getColor(_context, resId);
}
@ -159,29 +197,37 @@ public class ContextUtils {
* @param intColor The color coded in int
* @param withAlpha Optional; Set first bool parameter to true to also include alpha value
*/
public String colorToHexString(int intColor, boolean... withAlpha) {
public static String colorToHexString(final int intColor, final boolean... withAlpha) {
boolean a = withAlpha != null && withAlpha.length >= 1 && withAlpha[0];
return String.format(a ? "#%08X" : "#%06X", (a ? 0xFFFFFFFF : 0xFFFFFF) & intColor);
}
public static String getAndroidVersion() {
return Build.VERSION.RELEASE + " (" + Build.VERSION.SDK_INT + ")";
}
public String getAppVersionName() {
PackageManager manager = _context.getPackageManager();
try {
PackageManager manager = _context.getPackageManager();
PackageInfo info = manager.getPackageInfo(getPackageName(), 0);
PackageInfo info = manager.getPackageInfo(getPackageIdManifest(), 0);
return info.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return "?";
try {
PackageInfo info = manager.getPackageInfo(getPackageIdReal(), 0);
return info.versionName;
} catch (PackageManager.NameNotFoundException ignored) {
}
}
return "?";
}
public String getAppInstallationSource() {
String src = null;
try {
src = _context.getPackageManager().getInstallerPackageName(getPackageName());
src = _context.getPackageManager().getInstallerPackageName(getPackageIdManifest());
} catch (Exception ignored) {
}
if (TextUtils.isEmpty(src)) {
if (src == null || src.trim().isEmpty()) {
return "Sideloaded";
} else if (src.toLowerCase().contains(".amazon.")) {
return "Amazon Appstore";
@ -189,7 +235,7 @@ public class ContextUtils {
switch (src) {
case "com.android.vending":
case "com.google.android.feedback": {
return "Google Play Store";
return "Google Play";
}
case "org.fdroid.fdroid.privileged":
case "org.fdroid.fdroid": {
@ -212,23 +258,31 @@ public class ContextUtils {
* Send a {@link Intent#ACTION_VIEW} Intent with given paramter
* If the parameter is an string a browser will get triggered
*/
public void openWebpageInExternalBrowser(final String url) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
public ContextUtils openWebpageInExternalBrowser(final String url) {
try {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(intent);
} catch (ActivityNotFoundException e) {
} catch (Exception e) {
e.printStackTrace();
}
return this;
}
/**
* Get this apps package name. The builtin method may fail when used with flavors
* Get the apps base packagename, which is equal with all build flavors and variants
*/
public String getPackageName() {
public String getPackageIdManifest() {
String pkg = rstr("manifest_package_id");
return pkg != null ? pkg : _context.getPackageName();
return !TextUtils.isEmpty(pkg) ? pkg : _context.getPackageName();
}
/**
* Get this apps package name, returns the flavor specific package name.
*/
public String getPackageIdReal() {
return _context.getPackageName();
}
/**
@ -239,23 +293,36 @@ public class ContextUtils {
* of the package set in manifest (root element).
* Falls back to applicationId of the app which may differ from manifest.
*/
public Object getBuildConfigValue(String fieldName) {
String pkg = getPackageName() + ".BuildConfig";
public Object getBuildConfigValue(final String fieldName) {
final String pkg = getPackageIdManifest() + ".BuildConfig";
try {
Class<?> c = Class.forName(pkg);
return c.getField(fieldName).get(null);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return null;
}
public List<String> getBuildConfigFields() {
final String pkg = getPackageIdManifest() + ".BuildConfig";
final List<String> fields = new ArrayList<>();
try {
for (Field f : Class.forName(pkg).getFields()) {
fields.add(f.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
return fields;
}
/**
* Get a BuildConfig bool value
*/
public Boolean bcbool(String fieldName, Boolean defaultValue) {
public Boolean bcbool(final String fieldName, final Boolean defaultValue) {
Object field = getBuildConfigValue(fieldName);
if (field != null && field instanceof Boolean) {
if (field instanceof Boolean) {
return (Boolean) field;
}
return defaultValue;
@ -264,9 +331,9 @@ public class ContextUtils {
/**
* Get a BuildConfig string value
*/
public String bcstr(String fieldName, String defaultValue) {
public String bcstr(final String fieldName, final String defaultValue) {
Object field = getBuildConfigValue(fieldName);
if (field != null && field instanceof String) {
if (field instanceof String) {
return (String) field;
}
return defaultValue;
@ -275,9 +342,9 @@ public class ContextUtils {
/**
* Get a BuildConfig string value
*/
public Integer bcint(String fieldName, int defaultValue) {
public Integer bcint(final String fieldName, final int defaultValue) {
Object field = getBuildConfigValue(fieldName);
if (field != null && field instanceof Integer) {
if (field instanceof Integer) {
return (Integer) field;
}
return defaultValue;
@ -297,26 +364,6 @@ public class ContextUtils {
return bcbool("IS_FOSS_BUILD", false);
}
/**
* Request a bitcoin donation with given details.
* All parameters are awaited as string resource ids
*/
public void showDonateBitcoinRequest(@StringRes final int srBitcoinId, @StringRes final int srBitcoinAmount, @StringRes final int srBitcoinMessage, @StringRes final int srAlternativeDonateUrl) {
if (!isGooglePlayBuild()) {
String btcUri = String.format("bitcoin:%s?amount=%s&label=%s&message=%s",
rstr(srBitcoinId), rstr(srBitcoinAmount),
rstr(srBitcoinMessage), rstr(srBitcoinMessage));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(btcUri));
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
try {
_context.startActivity(intent);
} catch (ActivityNotFoundException e) {
openWebpageInExternalBrowser(rstr(srAlternativeDonateUrl));
}
}
}
public String readTextfileFromRawRes(@RawRes int rawResId, String linePrefix, String linePostfix) {
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
@ -365,8 +412,8 @@ public class ContextUtils {
* Check if app with given {@code packageName} is installed
*/
public boolean isAppInstalled(String packageName) {
PackageManager pm = _context.getApplicationContext().getPackageManager();
try {
PackageManager pm = _context.getApplicationContext().getPackageManager();
pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
@ -378,17 +425,17 @@ public class ContextUtils {
* Restart the current app. Supply the class to start on startup
*/
public void restartApp(Class classToStart) {
Intent inte = new Intent(_context, classToStart);
PendingIntent inteP = PendingIntent.getActivity(_context, 555, inte, PendingIntent.FLAG_CANCEL_CURRENT);
Intent intent = new Intent(_context, classToStart);
PendingIntent pendi = PendingIntent.getActivity(_context, 555, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) _context.getSystemService(Context.ALARM_SERVICE);
if (_context instanceof Activity) {
((Activity) _context).finish();
}
if (mgr != null) {
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, inteP);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendi);
} else {
inte.addFlags(FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(inte);
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(intent);
}
Runtime.getRuntime().exit(0);
}
@ -457,19 +504,25 @@ public class ContextUtils {
* {@code androidLC} may be in any of the forms: en, de, de-rAt
* If given an empty string, the default (system) locale gets loaded
*/
public void setAppLanguage(String androidLC) {
public void setAppLanguage(final String androidLC) {
Locale locale = getLocaleByAndroidCode(androidLC);
locale = (locale != null && !androidLC.isEmpty()) ? locale : Resources.getSystem().getConfiguration().locale;
setLocale(locale);
}
public ContextUtils setLocale(final Locale locale) {
Configuration config = _context.getResources().getConfiguration();
config.locale = (locale != null && !androidLC.isEmpty())
? locale : Resources.getSystem().getConfiguration().locale;
config.locale = (locale != null ? locale : Resources.getSystem().getConfiguration().locale);
_context.getResources().updateConfiguration(config, null);
Locale.setDefault(locale);
return this;
}
/**
* Try to guess if the color on top of the given {@code colorOnBottomInt}
* should be light or dark. Returns true if top color should be light
*/
public boolean shouldColorOnTopBeLight(@ColorInt int colorOnBottomInt) {
public boolean shouldColorOnTopBeLight(@ColorInt final int colorOnBottomInt) {
return 186 > (((0.299 * Color.red(colorOnBottomInt))
+ ((0.587 * Color.green(colorOnBottomInt))
+ (0.114 * Color.blue(colorOnBottomInt)))));
@ -478,7 +531,7 @@ public class ContextUtils {
/**
* Convert a html string to an android {@link Spanned} object
*/
public Spanned htmlToSpanned(String html) {
public Spanned htmlToSpanned(final String html) {
Spanned result;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
result = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
@ -502,12 +555,87 @@ public class ContextUtils {
return dp * _context.getResources().getDisplayMetrics().density;
}
/**
* Get the private directory for the current package (usually /data/data/package.name/)
*/
@SuppressWarnings("StatementWithEmptyBody")
public File getAppDataPrivateDir() {
File filesDir;
try {
filesDir = new File(new File(_context.getPackageManager().getPackageInfo(getPackageIdReal(), 0).applicationInfo.dataDir), "files");
} catch (PackageManager.NameNotFoundException e) {
filesDir = _context.getFilesDir();
}
if (!filesDir.exists() && filesDir.mkdirs()) ;
return filesDir;
}
/**
* Get public (accessible) appdata folders
*/
@SuppressWarnings("StatementWithEmptyBody")
public List<Pair<File, String>> getAppDataPublicDirs(boolean internalStorageFolder, boolean sdcardFolders, boolean storageNameWithoutType) {
List<Pair<File, String>> dirs = new ArrayList<>();
for (File externalFileDir : ContextCompat.getExternalFilesDirs(_context, null)) {
if (externalFileDir == null || Environment.getExternalStorageDirectory() == null) {
continue;
}
boolean isInt = externalFileDir.getAbsolutePath().startsWith(Environment.getExternalStorageDirectory().getAbsolutePath());
boolean add = (internalStorageFolder && isInt) || (sdcardFolders && !isInt);
if (add) {
dirs.add(new Pair<>(externalFileDir, getStorageName(externalFileDir, storageNameWithoutType)));
if (!externalFileDir.exists() && externalFileDir.mkdirs()) ;
}
}
return dirs;
}
public String getStorageName(final File externalFileDir, final boolean storageNameWithoutType) {
boolean isInt = externalFileDir.getAbsolutePath().startsWith(Environment.getExternalStorageDirectory().getAbsolutePath());
String[] split = externalFileDir.getAbsolutePath().split("/");
if (split.length > 2) {
return isInt ? (storageNameWithoutType ? "Internal Storage" : "") : (storageNameWithoutType ? split[2] : ("SD Card (" + split[2] + ")"));
} else {
return "Storage";
}
}
public List<Pair<File, String>> getStorages(final boolean internalStorageFolder, final boolean sdcardFolders) {
List<Pair<File, String>> storages = new ArrayList<>();
for (Pair<File, String> pair : getAppDataPublicDirs(internalStorageFolder, sdcardFolders, true)) {
if (pair.first != null && pair.first.getAbsolutePath().lastIndexOf("/Android/data") > 0) {
try {
storages.add(new Pair<>(new File(pair.first.getCanonicalPath().replaceFirst("/Android/data.*", "")), pair.second));
} catch (IOException ignored) {
}
}
}
return storages;
}
public File getStorageRootFolder(final File file) {
String filepath;
try {
filepath = file.getCanonicalPath();
} catch (Exception ignored) {
return null;
}
for (Pair<File, String> storage : getStorages(false, true)) {
//noinspection ConstantConditions
if (filepath.startsWith(storage.first.getAbsolutePath())) {
return storage.first;
}
}
return null;
}
/**
* Request the givens paths to be scanned by MediaScanner
*
* @param files Files and folders to scan
*/
public void mediaScannerScanFile(File... files) {
public void mediaScannerScanFile(final File... files) {
if (android.os.Build.VERSION.SDK_INT > 19) {
String[] paths = new String[files.length];
for (int i = 0; i < files.length; i++) {
@ -556,8 +684,12 @@ public class ContextUtils {
/**
* Get a {@link Bitmap} out of a {@link DrawableRes}
*/
public Bitmap drawableToBitmap(@DrawableRes int drawableId) {
return drawableToBitmap(ContextCompat.getDrawable(_context, drawableId));
public Bitmap drawableToBitmap(@DrawableRes final int drawableId) {
try {
return drawableToBitmap(ContextCompat.getDrawable(_context, drawableId));
} catch (Exception e) {
return null;
}
}
/**
@ -565,7 +697,7 @@ public class ContextUtils {
* Specifying a {@code maxDimen} is also possible and a value below 2000
* is recommended, otherwise a {@link OutOfMemoryError} may occur
*/
public Bitmap loadImageFromFilesystem(File imagePath, int maxDimen) {
public Bitmap loadImageFromFilesystem(final File imagePath, final int maxDimen) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath.getAbsolutePath(), options);
@ -581,7 +713,7 @@ public class ContextUtils {
* @param maxDimen Max size of the Bitmap (width or height)
* @return the scaling factor that needs to be applied to the bitmap
*/
public int calculateInSampleSize(BitmapFactory.Options options, int maxDimen) {
public int calculateInSampleSize(final BitmapFactory.Options options, final int maxDimen) {
// Raw height and width of image
int height = options.outHeight;
int width = options.outWidth;
@ -597,7 +729,7 @@ public class ContextUtils {
* Scale the bitmap so both dimensions are lower or equal to {@code maxDimen}
* This keeps the aspect ratio
*/
public Bitmap scaleBitmap(Bitmap bitmap, int maxDimen) {
public Bitmap scaleBitmap(final Bitmap bitmap, final int maxDimen) {
int picSize = Math.min(bitmap.getHeight(), bitmap.getWidth());
float scale = 1.f * maxDimen / picSize;
Matrix matrix = new Matrix();
@ -605,44 +737,27 @@ public class ContextUtils {
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
/**
* Write the given {@link Bitmap} to {@code imageFile}, in {@link CompressFormat#JPEG} format
*/
public boolean writeImageToFileJpeg(File imageFile, Bitmap image) {
return writeImageToFile(imageFile, image, Bitmap.CompressFormat.JPEG, 95);
}
/**
* Write the given {@link Bitmap} to filesystem
*
* @param targetFile The file to be written in
* @param image The image as android {@link Bitmap}
* @param format One format of {@link CompressFormat}, null will determine based on filename
* @param quality Quality level, defaults to 95
* @param image Android {@link Bitmap}
* @return True if writing was successful
*/
public boolean writeImageToFile(File targetFile, Bitmap image, CompressFormat format, Integer quality) {
public boolean writeImageToFile(final File targetFile, final Bitmap image, Integer... a0quality) {
final int quality = (a0quality != null && a0quality.length > 0 && a0quality[0] >= 0 && a0quality[0] <= 100) ? a0quality[0] : 70;
final String lc = targetFile.getAbsolutePath().toLowerCase(Locale.ROOT);
final CompressFormat format = lc.endsWith(".webp") ? CompressFormat.WEBP : (lc.endsWith(".png") ? CompressFormat.PNG : CompressFormat.JPEG);
boolean ok = false;
File folder = new File(targetFile.getParent());
if (quality == null || quality < 0 || quality > 100) {
quality = 95;
}
if (format == null) {
format = CompressFormat.JPEG;
String lc = targetFile.getAbsolutePath().toLowerCase(Locale.ROOT);
if (lc.endsWith(".png")) {
format = CompressFormat.PNG;
}
if (lc.endsWith(".webp")) {
format = CompressFormat.WEBP;
}
}
if (folder.exists() || folder.mkdirs()) {
FileOutputStream stream = null;
try {
stream = new FileOutputStream(targetFile); // overwrites this image every time
stream = new FileOutputStream(targetFile);
image.compress(format, quality, stream);
return true;
} catch (FileNotFoundException ignored) {
ok = true;
} catch (Exception ignored) {
} finally {
try {
if (stream != null) {
@ -652,14 +767,18 @@ public class ContextUtils {
}
}
}
return false;
try {
image.recycle();
} catch (Exception ignored) {
}
return ok;
}
/**
* Draw text in the center of the given {@link DrawableRes}
* This may be useful for e.g. badge counts
*/
public Bitmap drawTextOnDrawable(@DrawableRes int drawableRes, String text, int textSize) {
public Bitmap drawTextOnDrawable(@DrawableRes final int drawableRes, final String text, final int textSize) {
Resources resources = _context.getResources();
float scale = resources.getDisplayMetrics().density;
Bitmap bitmap = drawableToBitmap(drawableRes);
@ -684,12 +803,16 @@ public class ContextUtils {
* Try to tint all {@link Menu}s {@link MenuItem}s with given color
*/
@SuppressWarnings("ConstantConditions")
public void tintMenuItems(Menu menu, boolean recurse, @ColorInt int iconColor) {
public void tintMenuItems(final Menu menu, final boolean recurse, @ColorInt final int iconColor) {
for (int i = 0; i < menu.size(); i++) {
MenuItem item = menu.getItem(i);
tintDrawable(item.getIcon(), iconColor);
if (item.hasSubMenu() && recurse) {
tintMenuItems(item.getSubMenu(), recurse, iconColor);
try {
tintDrawable(item.getIcon(), iconColor);
if (item.hasSubMenu() && recurse) {
tintMenuItems(item.getSubMenu(), recurse, iconColor);
}
} catch (Exception ignored) {
// This should not happen at all, but may in bad menu.xml configuration
}
}
}
@ -697,14 +820,14 @@ public class ContextUtils {
/**
* Loads {@link Drawable} by given {@link DrawableRes} and applies a color
*/
public Drawable tintDrawable(@DrawableRes int drawableRes, @ColorInt int color) {
public Drawable tintDrawable(@DrawableRes final int drawableRes, @ColorInt final int color) {
return tintDrawable(rdrawable(drawableRes), color);
}
/**
* Tint a {@link Drawable} with given {@code color}
*/
public Drawable tintDrawable(@Nullable Drawable drawable, @ColorInt int color) {
public Drawable tintDrawable(@Nullable Drawable drawable, @ColorInt final int color) {
if (drawable != null) {
drawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(drawable.mutate(), color);
@ -716,7 +839,10 @@ public class ContextUtils {
* Try to make icons in Toolbar/ActionBars SubMenus visible
* This may not work on some devices and it maybe won't work on future android updates
*/
public void setSubMenuIconsVisiblity(Menu menu, boolean visible) {
public void setSubMenuIconsVisiblity(final Menu menu, final boolean visible) {
if (TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL) {
return;
}
if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
try {
@SuppressLint("PrivateApi") Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
@ -727,4 +853,165 @@ public class ContextUtils {
}
}
}
public String getLocalizedDateFormat() {
return ((SimpleDateFormat) android.text.format.DateFormat.getDateFormat(_context)).toPattern();
}
public String getLocalizedTimeFormat() {
return ((SimpleDateFormat) android.text.format.DateFormat.getTimeFormat(_context)).toPattern();
}
public String getLocalizedDateTimeFormat() {
return getLocalizedDateFormat() + " " + getLocalizedTimeFormat();
}
/**
* A {@link InputFilter} for filenames
*/
@SuppressWarnings("Convert2Lambda")
public static final InputFilter INPUTFILTER_FILENAME = new InputFilter() {
public CharSequence filter(CharSequence src, int start, int end, Spanned dest, int dstart, int dend) {
if (src.length() < 1) return null;
char last = src.charAt(src.length() - 1);
String illegal = "|\\?*<\":>[]/'";
if (illegal.indexOf(last) > -1) return src.subSequence(0, src.length() - 1);
return null;
}
};
/**
* A simple {@link Runnable} which does a touch event on a view.
* This pops up e.g. the keyboard on a {@link android.widget.EditText}
* <p>
* Example: new Handler().postDelayed(new DoTouchView(editView), 200);
*/
public static class DoTouchView implements Runnable {
View _view;
public DoTouchView(View view) {
_view = view;
}
@Override
public void run() {
_view.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 0, 0, 0));
_view.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 0, 0, 0));
}
}
public String getMimeType(final File file) {
return getMimeType(Uri.fromFile(file));
}
/**
* Detect MimeType of given file
* Android/Java's own MimeType map is very very small and detection barely works at all
* Hence use custom map for some file extensions
*/
public String getMimeType(final Uri uri) {
String mimeType = null;
if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
ContentResolver cr = _context.getContentResolver();
mimeType = cr.getType(uri);
} else {
String filename = uri.toString();
if (filename.endsWith(".jenc")) {
filename = filename.replace(".jenc", "");
}
String ext = MimeTypeMap.getFileExtensionFromUrl(filename);
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext.toLowerCase());
// Try to guess if the recommended methods fail
if (TextUtils.isEmpty(mimeType)) {
switch (ext) {
case "md":
case "markdown":
case "mkd":
case "mdown":
case "mkdn":
case "mdwn":
case "rmd":
mimeType = "text/markdown";
break;
case "yaml":
case "yml":
mimeType = "text/yaml";
break;
case "json":
mimeType = "text/json";
break;
case "txt":
mimeType = "text/plain";
break;
}
}
}
if (TextUtils.isEmpty(mimeType)) {
mimeType = "*/*";
}
return mimeType;
}
public Integer parseColor(final String colorstr) {
if (colorstr == null || colorstr.trim().isEmpty()) {
return null;
}
try {
return Color.parseColor(colorstr);
} catch (IllegalArgumentException ignored) {
return null;
}
}
public boolean isDeviceGoodHardware() {
try {
ActivityManager activityManager = (ActivityManager) _context.getSystemService(Context.ACTIVITY_SERVICE);
return !ActivityManagerCompat.isLowRamDevice(activityManager) &&
Runtime.getRuntime().availableProcessors() >= 4 &&
activityManager.getMemoryClass() >= 128;
} catch (Exception ignored) {
return true;
}
}
// Vibrate device one time by given amount of time, defaulting to 50ms
// Requires <uses-permission android:name="android.permission.VIBRATE" /> in AndroidManifest to work
@SuppressWarnings("UnnecessaryReturnStatement")
@SuppressLint("MissingPermission")
public void vibrate(final int... ms) {
int ms_v = ms != null && ms.length > 0 ? ms[0] : 50;
Vibrator vibrator = ((Vibrator) _context.getSystemService(VIBRATOR_SERVICE));
if (vibrator == null) {
return;
} else if (Build.VERSION.SDK_INT >= 26) {
vibrator.vibrate(VibrationEffect.createOneShot(ms_v, VibrationEffect.DEFAULT_AMPLITUDE));
} else {
vibrator.vibrate(ms_v);
}
}
/*
Check if Wifi is connected. Requires these permissions in AndroidManifest:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
*/
@SuppressLint("MissingPermission")
public boolean isWifiConnected(boolean... enabledOnly) {
final boolean doEnabledCheckOnly = enabledOnly != null && enabledOnly.length > 0 && enabledOnly[0];
final ConnectivityManager connectivityManager = (ConnectivityManager) _context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return wifiInfo != null && (doEnabledCheckOnly ? wifiInfo.isAvailable() : wifiInfo.isConnected());
}
// Returns if the device is currently in portrait orientation (landscape=false)
public boolean isDeviceOrientationPortrait() {
final int rotation = ((WindowManager) _context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
return (rotation == Surface.ROTATION_0) || (rotation == Surface.ROTATION_180);
}
}

View File

@ -1,21 +1,23 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2017-
* https://gsantner.net/
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
* License of this file: Apache 2.0
* https://www.apache.org/licenses/LICENSE-2.0
* https://github.com/gsantner/opoc/#licensing
*
#########################################################*/
package net.gsantner.opoc.util;
import android.text.TextUtils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@ -28,6 +30,7 @@ import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@ -35,20 +38,29 @@ import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern;
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection", "deprecation"})
@SuppressWarnings({"WeakerAccess", "unused", "SameParameterValue", "SpellCheckingInspection", "deprecation", "TryFinallyCanBeTryWithResources"})
public class FileUtils {
// Used on methods like copyFile(src, dst)
private static final int BUFFER_SIZE = 4096;
public static String readTextFileFast(final File file) {
try {
return new String(readCloseBinaryStream(new FileInputStream(file)));
return new String(readCloseStreamWithSize(new FileInputStream(file), (int) file.length()));
} catch (FileNotFoundException e) {
System.err.println("readTextFileFast: File " + file + " not found.");
}
return "";
}
public static byte[] readCloseStreamWithSize(final InputStream stream, int size) {
byte[] data = new byte[size];
try (DataInputStream dis = new DataInputStream(stream)) {
dis.readFully(data);
} catch (IOException ignored) {
}
return data;
}
public static String readTextFile(final File file) {
try {
return readCloseTextStream(new FileInputStream(file));
@ -230,6 +242,30 @@ public class FileUtils {
}
}
public static boolean copyFile(final File src, final FileOutputStream os) {
InputStream is = null;
try {
try {
is = new FileInputStream(src);
byte[] buf = new byte[BUFFER_SIZE];
int len;
while ((len = is.read(buf)) > 0) {
os.write(buf, 0, len);
}
return true;
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
} catch (IOException ex) {
return false;
}
}
// Returns -1 if the file did not contain any of the needles, otherwise,
// the index of which needle was found in the contents of the file.
//
@ -356,55 +392,70 @@ public class FileUtils {
*/
public static String getMimeType(File file) {
String guess = null;
if (file != null && file.exists() && file.isFile()) {
InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(file));
guess = URLConnection.guessContentTypeFromStream(is);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException ignored) {
if (file != null) {
if (file.exists() && file.isFile()) {
InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(file));
guess = URLConnection.guessContentTypeFromStream(is);
} catch (Exception ignored) {
} finally {
if (is != null) {
try {
is.close();
} catch (Exception ignored) {
}
}
}
}
if (guess == null || guess.isEmpty()) {
guess = "*/*";
int dot = file.getName().lastIndexOf(".") + 1;
if (dot > 0 && dot < file.getName().length()) {
switch (file.getName().substring(dot)) {
case "md":
case "markdown":
case "mkd":
case "mdown":
case "mkdn":
case "mdwn":
case "rmd":
guess = "text/markdown";
break;
case "txt":
guess = "text/plain";
break;
}
String filename = file.getName().replace(".jenc", "");
int dot = filename.lastIndexOf(".") + 1;
if (dot > 0 && dot < filename.length()) {
switch (filename.substring(dot)) {
case "md":
case "markdown":
case "mkd":
case "mdown":
case "mkdn":
case "mdwn":
case "rmd":
guess = "text/markdown";
break;
case "txt":
guess = "text/plain";
break;
case "webp":
guess = "image/webp";
break;
case "jpg":
case "jpeg":
guess = "image/jpeg";
break;
case "png":
guess = "image/png";
break;
}
}
if (TextUtils.isEmpty(guess)) {
guess = URLConnection.guessContentTypeFromName(filename);
}
}
return guess;
return TextUtils.isEmpty(guess) ? "*/*" : guess;
}
public static boolean isTextFile(File file) {
return getMimeType(file).startsWith("text/");
String mime = getMimeType(file);
return mime != null && mime.startsWith("text/");
}
/**
* Analyze given textfile and retrieve multiple information from it
* Information is written back to the {@link AtomicInteger} parameters
*/
public static void retrieveTextFileSummary(File file, AtomicInteger numCharacters, AtomicInteger numLines) {
public static void retrieveTextFileSummary(File file, AtomicInteger numCharacters, AtomicInteger numLines, AtomicInteger numWords) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
@ -412,11 +463,15 @@ public class FileUtils {
while ((line = br.readLine()) != null) {
numLines.getAndIncrement();
numCharacters.getAndSet(numCharacters.get() + line.length());
if (!line.equals("")) {
numWords.getAndSet(numWords.get() + line.split("\\s+").length);
}
}
} catch (Exception e) {
e.printStackTrace();
numCharacters.set(-1);
numLines.set(-1);
numWords.set(-1);
} finally {
if (br != null) {
try {
@ -437,7 +492,36 @@ public class FileUtils {
}
String[] units = abbreviation ? new String[]{"B", "kB", "MB", "GB", "TB"} : new String[]{"Bytes", "Kilobytes", "Megabytes", "Gigabytes", "Terabytes"};
int unit = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, unit))
+ " " + units[unit];
return new DecimalFormat("#,##0.#", DecimalFormatSymbols.getInstance(Locale.ENGLISH)).format(size / Math.pow(1024, unit)) + " " + units[unit];
}
public static int[] getTimeDiffHMS(long now, long past) {
int[] ret = new int[3];
long diff = Math.abs(now - past);
ret[0] = (int) (diff / (1000 * 60 * 60)); // hours
ret[1] = (int) (diff / (1000 * 60)) % 60; // min
ret[2] = (int) (diff / 1000) % 60; // sec
return ret;
}
public static String getHumanReadableByteCountSI(final long bytes) {
if (bytes < 1000) {
return String.format(Locale.getDefault(), "%d%s", bytes, "B");
} else if (bytes < 1000000) {
return String.format(Locale.getDefault(), "%.2f%s", (bytes / 1000f), "KB");
} else if (bytes < 1000000000) {
return String.format(Locale.getDefault(), "%.2f%s", (bytes / 1000000f), "MB");
} else if (bytes < 1000000000000L) {
return String.format(Locale.getDefault(), "%.2f%s", (bytes / 1000000000f), "GB");
} else {
return String.format(Locale.getDefault(), "%.2f%s", (bytes / 1000000000000f), "TB");
}
}
public static File join(File file, String... childSegments) {
for (final String s : childSegments != null ? childSegments : new String[0]) {
file = new File(file, s);
}
return file;
}
}

View File

@ -1,11 +1,10 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2017-
* https://gsantner.net/
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
* License of this file: Apache 2.0
* https://www.apache.org/licenses/LICENSE-2.0
* https://github.com/gsantner/opoc/#licensing
*
#########################################################*/
package net.gsantner.opoc.util;
@ -77,7 +76,7 @@ public class NetworkUtils {
int written = 0;
final float invLength = 1f / connection.getContentLength();
byte data[] = new byte[BUFFER_SIZE];
byte[] data = new byte[BUFFER_SIZE];
while ((count = input.read(data)) != -1) {
output.write(data, 0, count);
if (invLength != -1f && progressCallback != null) {
@ -150,6 +149,7 @@ public class NetworkUtils {
return performCall(url, method, data, null);
}
@SuppressWarnings("CharsetObjectCanBeUsed")
private static String performCall(final URL url, final String method, final String data, final HttpURLConnection existingConnection) {
try {
final HttpURLConnection connection = existingConnection != null
@ -160,7 +160,7 @@ public class NetworkUtils {
if (data != null && !data.isEmpty()) {
connection.setDoOutput(true);
final OutputStream output = connection.getOutputStream();
output.write(data.getBytes(Charset.forName(UTF8)));
output.write(data.getBytes(Charset.forName("UTF-8")));
output.flush();
output.close();
}
@ -220,4 +220,14 @@ public class NetworkUtils {
return result;
}
public static void httpGetAsync(final String url, final Callback.a1<String> callback) {
new Thread(() -> {
try {
String c = NetworkUtils.performCall(url, GET);
callback.callback(c);
} catch (Exception ignored) {
}
}).start();
}
}

View File

@ -1,11 +1,10 @@
/*#######################################################
*
* Maintained by Gregor Santner, 2017-
* https://gsantner.net/
* Maintained 2017-2023 by Gregor Santner <gsantner AT mailbox DOT org>
*
* License: Apache 2.0 / Commercial
* https://github.com/gsantner/opoc/#licensing
* https://www.apache.org/licenses/LICENSE-2.0
* License of this file: Apache 2.0
* https://www.apache.org/licenses/LICENSE-2.0
* https://github.com/gsantner/opoc/#licensing
*
#########################################################*/
package net.gsantner.opoc.util;

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:viewportHeight="48"
android:viewportWidth="48" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000"
android:pathData="M19.0447,29.8394 L32.0088,23.143 19.0447,16.3663ZM24,6.7503c10.0981,0 16.7945,0.4821 16.7945,0.4821 0.9375,0.1071 3,0.1071 4.8214,2.0357 0,0 1.4732,1.4464 1.9018,4.7678 0.5089,3.8839 0.4821,7.7678 0.4821,7.7678v3.6428c0,0 0.0268,3.8839 -0.4821,7.7678 -0.4286,3.2946 -1.9018,4.7678 -1.9018,4.7678 -1.8214,1.9018 -3.8839,1.9018 -4.8214,2.0089C40.7945,39.9911 34.0981,40.5 24,40.5 11.518,40.3929 7.6877,40.0179 7.6877,40.0179 6.6162,39.8304 4.2056,39.8839 2.3841,37.9822c0,0 -1.4732,-1.4732 -1.9018,-4.7678C-0.0265,29.3305 0.0002,25.4466 0.0002,25.4466v-3.6428c0,0 -0.0268,-3.8839 0.4821,-7.7678C0.9109,10.7146 2.3841,9.2682 2.3841,9.2682 4.2056,7.3396 6.268,7.3396 7.2055,7.2325c0,0 6.6964,-0.4821 16.7945,-0.4821z" android:strokeWidth="0.02678544"/>
</vector>

View File

@ -5,11 +5,16 @@
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.github.dfa.diaspora_android.activity.MainActivity">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.github.dfa.diaspora_android.web.ContextMenuWebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
<ProgressBar
android:id="@+id/progressBar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
@ -18,4 +23,4 @@
android:indeterminate="false"
android:progressDrawable="@drawable/progressbar" />
</RelativeLayout>
</RelativeLayout>

View File

@ -1,5 +1,5 @@
* Gregor Santner (gsantner)
~° http://gsantner.net
~° https://github.com/gsantner
* Paul Schaub (vanitasvitae)
~° https://github.com/vanitasvitae

View File

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<string name="open_navdrawer">Maak navigasie balk oop</string>
<string name="close_navdrawer">Sluit navigasie balk</string>
<string name="reload">Herlaai</string>
<string name="close">Sluit</string>
<string name="cancel">Kanselleer</string>
<!-- Common Words -->
<string name="settings">Instellings</string>
<string name="notifications">Kennisgewings</string>
<string name="conversations">Gesprekke</string>
<string name="stream">Stroom</string>
<string name="profile">Profiel</string>
<string name="aspects">Aspekte</string>
<string name="activities">Aktiwiteite</string>
<string name="liked">Hou van</string>
<string name="commented">Opgemerk</string>
<string name="mentions">Aantal keer genoem</string>
<string name="public_">Publiek</string>
<string name="search">Soek</string>
<string name="contacts">Kontakte</string>
<string name="changelog">Verandering-log</string>
<string name="statistics">Statistiek</string>
<!-- Notifications dropdown menu -->
<string name="all_notifications">Alle kennisgewings</string>
<string name="also_commented">Ook Opgemerk</string>
<string name="comment_on_post">Lewer kommentaar op hierdie plasing</string>
<string name="deleteme_____1">Hou van</string>
<string name="mentioned">Aantal keer genoem</string>
<string name="reshared">Herdeel</string>
<string name="started_sharing">Begin deel</string>
<!-- Pod Activity -->
<string name="could_not_retrieve_list_of_pods__appspecific">Fout: Kon nie lys van pods verkry nie!</string>
<string name="confirmation">Bevestiging</string>
<string name="do_you_want_to_exit">Wil jy uitgaan?</string>
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<string name="more">Meer</string>
<string name="help_license">Omtrent | Hulp</string>
<string name="followed_tags">Gevolgde merkers</string>
<string name="public_activities">Publieke aktiwiteite</string>
<string name="reports">Verslae</string>
<string name="share_link_as_text">Deel skakel as teks</string>
<string name="share_screenshot_of_webpage">Deel vriesbeeld van webbladsy</string>
<string name="take_screenshot_of_webpage">Neem vriesbeeld van webbladsy</string>
<string name="saving_image_to">Stoor beeld na</string>
<string name="saving_screenshot_as">Stoor vriesbeeld as:</string>
<string name="link_adress_copied">Skakel adres gekopieer…</string>
<string name="new_post">Nuwe Plasing</string>
<string name="go_to_top">Gaan tot bo</string>
<string name="search_by_tags_or_persons__appspecific">Soek met merkers of persone</string>
<string name="exit_app">Verlaat toep</string>
<string name="toggle_mobile_desktop_view">Wissel Mobiele/Monitor oogpunt</string>
<string name="share_dotdotdot">Deel…</string>
<string name="by_tags">met merkers</string>
<string name="by_people">met mense</string>
<string name="please_add_a_name">Voer asseblief \'n naam in</string>
<string name="share_link_address">Deel skakel adres</string>
<string name="save_image">Stoor beeld</string>
<string name="share_image">Deel beeld</string>
<string name="open_in_external_browser">Maak in eksterne webleser oop…</string>
<string name="copy_link_adress_to_clipboard">Kopieer skakel adres na knipbord</string>
<string name="copy_image_address_to_clipboard">Kopieer beeld adres na knipbord</string>
<!-- More from MainActivity -->
<string name="unable_to_load_image">Kon nie beeld laai nie</string>
<!-- Permissions -->
<string name="permission_denied">Toestemming geweier.</string>
<string name="pod_name">Pod naam</string>
<string name="protocol">Protokol</string>
<string name="pod_address">Pod adres</string>
<string name="missing_value">Vermiste waarde</string>
<string name="hide_statusbar">Versteek status balk</string>
<string name="show_title">Wys titel</string>
<!-- Operability -->
<!-- Category Titles -->
<string name="appearance">Voorkoms</string>
<string name="network">Netwerk</string>
<string name="pod_settings__appspecfic">Pod verstellings</string>
<!-- Visuals -->
<!-- Navigiation Slider -->
<string name="user">Gebruiker</string>
<string name="general">Algemeen</string>
<string name="admin">Admin</string>
<!-- Themes -->
<string name="theme_and_colors">Tema en kleure</string>
<string name="primary_colors">Primêre kleur</string>
<string name="colors_of_toolbars">Kleur van die nutsbalke</string>
<string name="accent_color">Kontras kleur</string>
<string name="color_of_progressbar">Kleur van die vorderingsbalk</string>
<string name="amoled_mode">AMOLED modus</string>
<!-- Notifications dropdown -->
<string name="extended_notifications">Uitgebreide Kennisgewings</string>
<string name="language">Taal</string>
<!-- Font size -->
<string name="font_size">Fontgrootte</string>
<string name="normal">Normaal</string>
<string name="large">Groot</string>
<string name="huge">Masief</string>
<!-- Load images -->
<string name="load_images">Laai beelde</string>
<!-- Screen rotation -->
<string name="screen_rotation">Skerm Rotasie</string>
<string name="control_screen_rotation">Beheer outomatiese skermrotasie</string>
<string name="default_">Verstek</string>
<string name="portrait">Portret</string>
<string name="landscape">Landskap</string>
<!-- Proxy -->
<string name="load_tor_preset">Laai Tor voorkeure</string>
<string name="proxy">Volmag</string>
<string name="host">Gasheer</string>
<string name="port">Poort</string>
<string name="app_needs_restart_to_disable_proxy_usage">Toep moet herlaai om volmag te deaktiveer</string>
<string name="orbot_proxy_preset_loaded">Orbot volmag voorkeure gelaai</string>
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="personal_settings">Persoonlike instellings</string>
<string name="manage_hashtags">Bestuur Hutsmerke</string>
<string name="unfollow_already_followed_hashtags__appspecific">Onvolg Hutsmerke</string>
<string name="change_account">Verander rekening</string>
<string name="clear_cache">Vee Buffer</string>
<string name="clear_webview_cache">Vee WebBuffer skoon</string>
<!-- More -->
<string name="miscellaneous">Diverse</string>
<string name="full_reset">Volle herstel</string>
<string name="block_advertisments">Blok advertensies</string>
<string name="about">Omtrent</string>
<string name="license">Lisensie</string>
<string name="debugging">Ontfouting</string>
<string name="application">Toepassing</string>
<string name="device">Toestel</string>
<string name="diaspora_pod__appspecific">diaspora * Pod</string>
<string name="app_version_with_arg">Tope weergawe: %1$s</string>
<string name="android_version_witharg">Android Weergawe%1$s</string>
<string name="device_name_witharg">Toestel naam%1$s</string>
<string name="code_name_witharg">Kodenaam: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Pod profiel naam: %1$s</string>
<string name="pod_domain_witharg__appspecific">Pod domein: %1$s</string>
<string name="get_the_source">Verkry die bron</string>
<string name="translate_the_app">Vertaal hierdie Toep!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Die toepassing is nie in jou taal beskikbaar? Jy kan dit verander! Hoekom help jy ons nie met die vertaling nie? Ons gebruik Stringlate om enigiemand te help om toepassing te vertaal.</string>
<string name="let_me_translate">Laat ek vertaal</string>
<string name="give_feedback">Gee terugvoer!</string>
<string name="dandelion_still_in_development__appspecific">dandelion * is nog in ontwikkeling, so as jy voorstelle of enige soort terugvoer het, gebruik asseblief ons probleem volger laat ons weet!</string>
<string name="report_bugs">Raporteer foute</string>
<string name="share_the_app">Deel die toep</string>
<string name="hey_checkout_dandelion_tag__appspecific">Haai! Loer na #dandelion! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Handhawers</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;baie dankie!</string>
<string name="gnu_gplv3_license">GNU GPLv3+ Lisensie</string>
<string name="show_third_party_licenses">Derdeparty biblioteke</string>
<string name="tell_me_more">Vertel my meer</string>
<string name="enable_to_open_youtube_links_on_external_app">Bemagtig om Youtube links oop te maak in eksterne Toeps</string>
<string name="youtube_links">Youtube links</string>
<string name="change_the_theme_of_your_account">Verander die tema van jou rekening</string>
<string name="pull_to_refresh">Trek om te verfris</string>
</resources>

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<string name="settings">إعدادات</string>
<string name="search">بحث</string>
<string name="changelog">سِجل التغييرات</string>
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<string name="more">المزيد</string>
<string name="share_dotdotdot">مشاركة</string>
<!-- More from MainActivity -->
<!-- Permissions -->
<string name="hide_statusbar">اخفاء شريط الاشعارات</string>
<string name="show_title">إظهار العنوان</string>
<!-- Operability -->
<!-- Category Titles -->
<string name="appearance">المظهر</string>
<!-- Visuals -->
<!-- Navigiation Slider -->
<string name="general">عام</string>
<!-- Themes -->
<!-- Notifications dropdown -->
<string name="language_change_restart_description">تغيير لغة التطبيق. اعد فتح التطبيق لتفعيل التغيير</string>
<string name="language">اللّغة</string>
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<string name="default_">افتراضي</string>
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="clear_cache">مسح ذاكرة التخزين المؤقت</string>
<!-- More -->
<string name="miscellaneous">أخرى</string>
<string name="about">عن التطبيق</string>
<string name="license">ترخيص</string>
<!-- License & help (large amount of text) -->
<string name="contributors">المساهمون</string>
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<string name="open_navdrawer">Otvori navigacijsku ladicu</string>
<string name="close_navdrawer">Zatvorite navigacijsku ladicu</string>
<string name="close">Zatvori</string>
<string name="cancel">Otkaži</string>
<!-- Common Words -->
<string name="settings">Podešavanja</string>
<string name="search">Traži</string>
<string name="changelog">Popis izmjena</string>
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<string name="more">Više</string>
<!-- More from MainActivity -->
<!-- Permissions -->
<string name="hide_statusbar">Sakrij statusnu traku</string>
<!-- Operability -->
<!-- Category Titles -->
<string name="appearance">Izgled</string>
<!-- Visuals -->
<!-- Navigiation Slider -->
<string name="general">Opće</string>
<!-- Themes -->
<!-- Notifications dropdown -->
<string name="language_change_restart_description">Promijeni jezik programa. Iznova pokrenite program da aktivirate promjenu</string>
<string name="language">Jezik</string>
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<string name="default_">Osnovni</string>
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<string name="miscellaneous">Razno</string>
<string name="about">O programu</string>
<!-- License & help (large amount of text) -->
<string name="contributors">Saradnici</string>
</resources>

View File

@ -0,0 +1,209 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<string name="open_navdrawer">Obre el calaix de navegació</string>
<string name="close_navdrawer">Tanca el calaix de navegació</string>
<string name="reload">Recarrega</string>
<string name="close">Tanca</string>
<string name="cancel">Cancel·la</string>
<!-- Common Words -->
<string name="settings">Configuració</string>
<string name="notifications">Notificacions</string>
<string name="conversations">Conversacions</string>
<string name="stream">Transmissió</string>
<string name="profile">Perfil</string>
<string name="aspects">Aspectes</string>
<string name="activities">Activitats</string>
<string name="liked">M\'ha agradat</string>
<string name="commented">Comentat</string>
<string name="mentions">Mencions</string>
<string name="public_">Públic</string>
<string name="search">Cerca</string>
<string name="contacts">Contactes</string>
<string name="changelog">Novetats</string>
<string name="statistics">Estadí­stiques</string>
<!-- Notifications dropdown menu -->
<string name="all_notifications">Totes les notificacions</string>
<string name="also_commented">També s\'ha comentat</string>
<string name="comment_on_post">Comenta sobre la publicació</string>
<string name="deleteme_____1">M\'ha agradat</string>
<string name="mentioned">Mencionat</string>
<string name="reshared">Recompartit</string>
<string name="started_sharing">S\'ha iniciat la compartició</string>
<!-- Pod Activity -->
<string name="could_not_retrieve_list_of_pods__appspecific">Error: No s\'ha pogut recuperar la llista de pods!</string>
<string name="sorry_need_to_be_connected_to_internet">Cal que us connecteu a Internet per continuar</string>
<string name="confirmation">Confirmació</string>
<string name="do_you_want_to_exit">Voleu sortir?</string>
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<string name="more">Més</string>
<string name="help_license">Quant a | Ajuda</string>
<string name="followed_tags">Etiquetes seguides</string>
<string name="public_activities">Activitats públiques</string>
<string name="reports">Informes</string>
<string name="share_link_as_text">Comparteix l\'enllaç com a text</string>
<string name="share_screenshot_of_webpage">Comparteix la captura de pantalla de la pàgina web</string>
<string name="take_screenshot_of_webpage">Feu una captura de pantalla de la pàgina web</string>
<string name="saving_image_to">S\'està desant la imatge per a</string>
<string name="saving_screenshot_as">S\'està desant la captura de pantalla com:</string>
<string name="link_adress_copied">S\'ha copiat l\'adreça de l\'enllaç…</string>
<string name="new_post">Nova publicació</string>
<string name="go_to_top">Vés a l\'inici</string>
<string name="search_by_tags_or_persons__appspecific">Cerca per etiquetes o persones</string>
<string name="exit_app">Surt de l\'aplicació</string>
<string name="toggle_mobile_desktop_view">Commuta la vista de mòbils/escriptori</string>
<string name="share_dotdotdot">Comparteix…</string>
<string name="by_tags">per etiquetes</string>
<string name="by_people">per persones</string>
<string name="please_add_a_name">Afegiu un nom</string>
<string name="share_link_address">Comparteix l\'adreça de l\'enllaç</string>
<string name="save_image">Desa la imatge</string>
<string name="share_image">Comparteix la imatge</string>
<string name="open_in_external_browser">Obre en un navegador extern…</string>
<string name="copy_link_adress_to_clipboard">Copia l\'adreça de l\'enllaç al porta-retalls</string>
<string name="copy_image_address_to_clipboard">Copia l\'adreça de la imatge al porta-retalls</string>
<!-- More from MainActivity -->
<string name="unable_to_load_image">No s\'ha pogut carregar la imatge</string>
<!-- Permissions -->
<string name="screenshot_permission__appspecific">Cal que concediu «Accés al permís d\'emmagatzematge» per desar captures de pantalla. Després, hauríeu de tancar l\'aplicació completament o reiniciar el dispositiu. Si no concediu l\'accés a l\'emmagatzematge, però voleu utilitzar la funció de captura de pantalla més endavant, podeu concedir el permís més endavant.
Aneu a: Configuració del sistema - Aplicacions - dandelion*. A la secció de permisos podeu concedir el «permís d\'emmagatzematge d\'escriptura».</string>
<string name="image_permission_description__appspecific">Cal que concediu «Accés al permís d\'emmagatzematge» per desar/penjar imatges. Després, hauríeu de tancar l\'aplicació completament o reiniciar el dispositiu. Si no concediu l\'accés a l\'emmagatzematge, però voleu desar imatges més endavant, podeu concedir el permís més endavant. Aneu a: Configuració del sistema - Aplicacions - dandelion*. A la secció de permisos podeu concedir el «permís d\'emmagatzematge d\'escriptura».</string>
<string name="permission_denied">Permís denegat.</string>
<string name="permission_granted_try_again">Permís concedit. Torneu-ho a provar.</string>
<string name="custom_pod">Pod personalitzat</string>
<string name="pod_name">Nom del pod</string>
<string name="protocol">Protocol</string>
<string name="pod_address">Adreça del pod</string>
<string name="missing_value">Falta el valor</string>
<string name="jump_to_last_visited_page_in_stream__appspecific">Voleu saltar a la última pàgina visitada?</string>
<string name="hide_statusbar_in_mainview">Amaga la barra d\'estat a la vista principal</string>
<string name="hide_statusbar">Amaga la barra d\'estat</string>
<string name="show_title_in_main_view">Mostra el títol a la vista principal</string>
<string name="show_title">Mostra el títol</string>
<string name="launcher_shortcut">Drecera del llançador</string>
<!-- Operability -->
<string name="top_toolbar_loads_stream__appsp">La barra d\'eines superior carrega la transmissió</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Feu clic a un espai buit a la barra d\'eines superior per obrir la transmissió</string>
<!-- Category Titles -->
<string name="appearance">Aparença</string>
<string name="network">Xarxa</string>
<string name="pod_settings__appspecfic">Configuració del pod</string>
<string name="operability">Operabilitat</string>
<!-- Visuals -->
<!-- Navigiation Slider -->
<string name="navigation_drawer">Control lliscant de navegació</string>
<string name="control_visibility_of_entries_nav_drawer">Controleu la visibilitat de les entrades al calaix de navegació</string>
<string name="user">Usuari</string>
<string name="general">General</string>
<string name="admin">Administrador/a</string>
<!-- Themes -->
<string name="theme_and_colors">Tema i colors</string>
<string name="control_which_colors_are_used_in_app">Controleu quins colors s\'utilitzen a tota l\'aplicació</string>
<string name="primary_colors">Color primari</string>
<string name="colors_of_toolbars">Color de les barres d\'eines</string>
<string name="accent_color">Color d\'èmfasi</string>
<string name="color_of_progressbar">Color de la barra de progrés</string>
<string name="amoled_mode">Mode AMOLED</string>
<string name="amoled_mode_description__app_specific">Substitueix el color amb la pantalla AMOLED compatible amb el negre en moltes parts de l\'aplicació. Cal reiniciar per canviar aquesta configuració. Per explorar diaspora* en la foscor, també heu d\'activar el tema fosc, que es pot trobar en la configuració del compte personal de diaspora*.</string>
<!-- Notifications dropdown -->
<string name="extended_notifications">Notificacions ampliades</string>
<string name="extendend_notifications_bell_description__appspecific">Amplieu la campana de notificacions amb un menú desplegable que mostra les categories de notificacions</string>
<string name="language_change_restart_description">Canvieu l\'idioma d\'aquesta aplicació. Reinicieu l\'aplicació perquè els canvis tinguin efecte</string>
<string name="language">Idioma</string>
<string name="system_language">Idioma del sistema</string>
<!-- Font size -->
<string name="control_textsize_of_webview">Controla la mida del text de WebView</string>
<string name="font_size">Mida de la lletra</string>
<string name="normal">Normal</string>
<string name="large">Gran</string>
<string name="huge">Enorme</string>
<!-- Load images -->
<string name="load_images">Carrega imatges</string>
<string name="toggle_image_loading_to_save_mobile_data">Commuta la càrrega d\'imatges a p. ex. estalvia dades mòbils</string>
<!-- Screen rotation -->
<string name="screen_rotation">Rotació de pantalla</string>
<string name="control_screen_rotation">Control automàtic de la rotació de la pantalla</string>
<string name="default_">Per defecte</string>
<string name="sensor_ignore_system_settings">Sensor\n(ignora la configuració del sistema)</string>
<string name="portrait">Vertical</string>
<string name="landscape">Horitzontal</string>
<!-- Proxy -->
<string name="load_tor_preset">Carrega Tor per defecte</string>
<string name="load_proxy_settins_for_tor">Carrega la configuració del servidor intermediari per a Proxy HTTP (Orbot)</string>
<string name="proxy">Servidor intermediari</string>
<string name="enable_proxy">Activa el servidor intermediari</string>
<string name="proxy_dandelion_traffic__appspecific">Trànsit del servidor intermediari de dandelion* evadint el tallafocs.\nPot requerir reinici. Això podria no funcionar en alguns telèfons.</string>
<string name="host">Amfitrió</string>
<string name="port">Port</string>
<string name="app_needs_restart_to_disable_proxy_usage">L\'aplicació necessita reiniciar-se per desactivar l\'ús del servidor intermediari</string>
<string name="orbot_proxy_preset_loaded">S\'ha carregat la configuració per defecte de l\'Orbot</string>
<!-- Chrome custom tabs -->
<string name="open_external_links_with_chrome_custom_tabs_description">Obre els enllaços externs amb les pestanyes personalitzades de Chrome. S\'ha d\'instal·lar Chromium, Firefox o Google Chrome per poder utilitzar aquesta funció. \nNOTA IMPORTANT: Les pestanyes personalitzades de Chrome no utilitzen servidors intermediaris configurats!</string>
<!-- Diaspora Settings -->
<string name="personal_settings">Configuració personal</string>
<string name="open_diaspora_account_settings__appspecific">Obre la configuració del compte diaspora*</string>
<string name="manage_your_contact_list">Gestioneu la vostra llista de contactes</string>
<string name="manage_hashtags">Gestioneu les etiquetes</string>
<string name="unfollow_already_followed_hashtags__appspecific">Deixa de seguir les etiquetes seguides</string>
<string name="change_account">Canvia de compte</string>
<string name="loug_warning_description__appspecific">Esborra les dades locals de la sessió i canvia a un altre pod /compte diaspora*</string>
<string name="logout_warning_description">Això esborrarà totes les galetes i les dades de sessió. Esteu segur que voleu canviar el vostre compte?</string>
<string name="clear_cache">Esborra la memòria cau</string>
<string name="clear_webview_cache">Esborra la memòria cau de WebView</string>
<string name="intellihide_toolbars__appspecific">Amaga automàticament les barres d\'eines superior i inferior mentre es desplaça</string>
<string name="intellihide_toolbars">Barra d\'eines «Intellihide»</string>
<string name="append_shared_by_notice">Afegeix compartit per avís</string>
<string name="append_shared_by_notice__appspecific">Afegiu una referència a aquesta aplicació als textos compartits: [via #dandelion]</string>
<!-- More -->
<string name="miscellaneous">Divers</string>
<string name="full_reset">Reinici complet</string>
<string name="wipe_settings_and_logout">Esborra localment totes les configuracions relacionades amb l\'aplicació i tanca les sessions de tots els comptes</string>
<string name="wipe_settings_warning__appspecific">Això restablirà tots els paràmetres modificats de l\'aplicació als valors per defecte i es desconnectarà de tots els pods. Les vostres imatges baixades romandran intactes. Esteu segur que voleu continuar?</string>
<string name="enable_basic_adblocker_description">Activa el bloqueig d\'anuncis bàsic. Anuncis que es poden incloure p. ex. en vistes integrades</string>
<string name="block_advertisments">Bloqueja anuncis</string>
<string name="about">Quant a</string>
<string name="license">Llicècia</string>
<string name="debugging">Depuració</string>
<string name="application">Aplicació</string>
<string name="device">Dispositiu</string>
<string name="diaspora_pod__appspecific">Pod de diaspora*</string>
<string name="debug_log">Registre de depuració</string>
<string name="debug_log_verbose">Registre de depuració (detallat)</string>
<string name="app_version_with_arg">Versió de l\'aplicació: %1$s</string>
<string name="android_version_witharg">Versió d\'Android: %1$s</string>
<string name="device_name_witharg">Nom del dispositiu: %1$s</string>
<string name="code_name_witharg">Nom en clau: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Nom de perfil del pod: %1$s</string>
<string name="pod_domain_witharg__appspecific">Domini del pod: %1$s</string>
<string name="debug_log_copied_to_clipboard">S\'ha copiat el registre de depuració al porta-retalls</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* és el seu complement per a navegar per la xarxa social diapora*. Afegeix característiques com útils barres d\'eines i suport per a servidors intermediaris com la xarxa Tor a la seva experiència social.</string>
<string name="contribute_code">Contribuïu amb codi!</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* es desenvolupa lliurement, en el sentit de llibertat, i segueix les idees del projecte
diaspora*. Si voleu contribuir, endavant! Actualment som un equip molt petit, de manera que us agrairíem molt qualsevol tipus d\'ajuda!</string>
<string name="get_the_source">Obtén el codi font</string>
<string name="translate_the_app">Traduïu l\'aplicació!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">L\'aplicació no està disponible en el vostre idioma? Podeu canviar això! Per què no ens ajudeu a traduir-la? Utilitzem Stringlate perquè qualsevol persona pugui traduir l\'aplicació.</string>
<string name="let_me_translate">Permeteu-me traduir</string>
<string name="give_feedback">Valoreu-nos!</string>
<string name="dandelion_still_in_development__appspecific">dandelion* encara està en desenvolupament, així que si teniu suggeriments o qualsevol tipus de comentari, feu servir el nostre gestor d\'errors per informar-nos-en!</string>
<string name="report_bugs">Informe d\'errors</string>
<string name="spread_the_word">Difoneu aquest projecte</string>
<string name="tell_your_friends_about_diaspora__appspecific">Parleu als vostres amics i familiars sobre diaspora* i #dandelion! Per què no difoneu les vostres experiències? Ens encantaria escoltar-les!</string>
<string name="share_the_app">Comparteix l\'aplicació</string>
<string name="hey_checkout_dandelion_tag__appspecific">Ep! Doneu un cop d\'ull a #dandelion! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Mantenidors</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Aquesta aplicació està sent desenvolupada i mantinguda per &lt;br&gt;&lt;br&gt;%1$s</string>
<string name="contributors">Col·laboradors</string>
<string name="thank_you_witharg">¡%1$s &lt; br &gt;&lt; br &gt; Gràcies!</string>
<string name="gnu_gplv3_license">Llicència GNU GPLv3+</string>
<string name="show_third_party_licenses">Biblioteques de tercers</string>
<string name="the_following_libraries_are_used">S\'utilitzen les següents biblioteques:</string>
<string name="inspiration_from_leafpic__appspecific">Prenem alguna inspiració i codi de LeafPic. Aneu a comprovar-ho, també és programari gratuït!</string>
<string name="tell_me_more">Expliqueu-me més</string>
<string name="enable_to_open_youtube_links_on_external_app">Activeu-ho per obrir enllaços de Youtube en aplicacions externes</string>
<string name="youtube_links">Enllaços de YouTube</string>
<string name="change_the_theme_of_your_account">Canvia el tema del vostre compte</string>
<string name="pull_to_refresh">Feu lliscar per actualitzar</string>
<string name="pulling_down_on_top_of_page_to_refresh">S\'està lliscant cap avall a la part superior de la pàgina per actualitzar.\nCal que reinicieu l\'aplicació perquè els canvis tinguin efecte.</string>
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -0,0 +1,203 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<string name="open_navdrawer">Otevøít navigaèní panel</string>
<string name="close_navdrawer">Zavøít navigaèní panel</string>
<string name="reload">Aktualizovat</string>
<string name="close">Konec</string>
<string name="cancel">Rakovina</string>
<!-- Common Words -->
<string name="settings">Nastavení</string>
<string name="notifications">Oznámení</string>
<string name="conversations">Konverzace</string>
<string name="stream">Stream</string>
<string name="profile">Profil</string>
<string name="aspects">Aspekty</string>
<string name="activities">Aktivity</string>
<string name="liked">Líbilo se</string>
<string name="commented">Okomentované příspěvky</string>
<string name="mentions">Zmínky</string>
<string name="public_">Veřejné</string>
<string name="search">Hledat</string>
<string name="contacts">Kontakty</string>
<string name="changelog">Seznam změn</string>
<string name="statistics">Statistika</string>
<!-- Notifications dropdown menu -->
<string name="all_notifications">Všechna oznámení</string>
<string name="also_commented">Také komentováno</string>
<string name="comment_on_post">Okomentoval/a Tvůj příspěvek</string>
<string name="deleteme_____1">Líbilo se</string>
<string name="mentioned">Zmíněn</string>
<string name="reshared">Sdílen</string>
<string name="started_sharing">Začalo sdílení</string>
<!-- Pod Activity -->
<string name="could_not_retrieve_list_of_pods__appspecific">Error: Nemohl získat seznam podů!</string>
<string name="sorry_need_to_be_connected_to_internet">Omlouvám se, musíte být připojeni k internetu, abyste mohli pokračovat dál</string>
<string name="confirmation">Potvrzení</string>
<string name="do_you_want_to_exit">Chceš opustit aplikaci?</string>
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<string name="more">Více</string>
<string name="help_license">O aplikaci | Pomoc</string>
<string name="followed_tags">Zlaté rány</string>
<string name="public_activities">Veřejné aktivity</string>
<string name="reports">Nahlášení</string>
<string name="share_link_as_text">Sdílejte odkaz jako text</string>
<string name="share_screenshot_of_webpage">Šablony obrázku webových stránek</string>
<string name="take_screenshot_of_webpage">Podívejte se na snímek webové stránky</string>
<string name="saving_image_to">Uložit obrázek</string>
<string name="saving_screenshot_as">Uložit snímky jako:</string>
<string name="link_adress_copied">Zapnutá adresa …</string>
<string name="new_post">Nový příspěvek</string>
<string name="go_to_top">Jít nahoru</string>
<string name="search_by_tags_or_persons__appspecific">Hledat štítky nebo osoby</string>
<string name="exit_app">Ukončit aplikaci</string>
<string name="toggle_mobile_desktop_view">Pohled na pracovní plochu</string>
<string name="share_dotdotdot">Sdílet…</string>
<string name="by_tags">tagy</string>
<string name="by_people">lidmi</string>
<string name="please_add_a_name">Prosím přidejte jméno</string>
<string name="share_link_address">Sdílejte adresu odkazu</string>
<string name="save_image">Uložit obrázek</string>
<string name="share_image">Sdílet obrázek</string>
<string name="open_in_external_browser">Otevřít v externím prohlížeči…</string>
<string name="copy_link_adress_to_clipboard">Zkopírovat link do schránky</string>
<string name="copy_image_address_to_clipboard">Kopírovat adresu obrázku do schránky</string>
<!-- More from MainActivity -->
<string name="unable_to_load_image">Nemohl být načten obrázek</string>
<!-- Permissions -->
<string name="image_permission_description__appspecific">Abys mohl ukládat/nahrávat obrázky, musíš nejprve aplikaci povolit přístup k datovému úložišti. Poté by měla být aplikace uzavřena, případně restartován celý přístroj. Pokud přístupu zabráníš, ale časem se rozhodneš obrázky ukládat, můžeš toto oprávnění povolit později. Otevři: Systémové nastavení - Aplikace - dandelion*. V oblasti oprávnění poté můžeš změnit vybraná nastavení.</string>
<string name="permission_denied">Oprávnění odepřeno.</string>
<string name="permission_granted_try_again">Oprávnění povoleno. Prosím, zkus to znovu.</string>
<string name="custom_pod">Použij definovaný Pod</string>
<string name="pod_name">Název Podu</string>
<string name="protocol">Protokol</string>
<string name="pod_address">Adresa Podu</string>
<string name="missing_value">Chybějící hodnota</string>
<string name="jump_to_last_visited_page_in_stream__appspecific">Zavolat poslední navštívenou stránku ve streamu?</string>
<string name="hide_statusbar_in_mainview">Hide bar at the main view at the view.</string>
<string name="hide_statusbar">Schovat statusbar</string>
<string name="show_title_in_main_view">Zobrazit titul v hlavním pohledu</string>
<string name="show_title">Zobrazit titul</string>
<string name="launcher_shortcut">Launcher shortcut</string>
<!-- Operability -->
<string name="top_toolbar_loads_stream__appsp">Horní nástrojová lišta načítá stream</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Pro otevření streamu klikni na práznou plochu v horní nástrojové liště</string>
<!-- Category Titles -->
<string name="appearance">Vzhled</string>
<string name="network">Síť</string>
<string name="pod_settings__appspecfic">Nastavení Podu</string>
<string name="operability">Obsluha</string>
<!-- Visuals -->
<!-- Navigiation Slider -->
<string name="navigation_drawer">Navigační šprýmař</string>
<string name="control_visibility_of_entries_nav_drawer">Ovládejte viditelnost položek v navigačním šuplíku</string>
<string name="user">Uživatel</string>
<string name="general">Obecné</string>
<string name="admin">Administrátor</string>
<!-- Themes -->
<string name="theme_and_colors">Téma a zmatek</string>
<string name="control_which_colors_are_used_in_app">Ovládání, které barvy jsou používány v průběhu aplikace</string>
<string name="primary_colors">Primární barva</string>
<string name="colors_of_toolbars">Barva nástrojové lišty</string>
<string name="accent_color">Akcentová barva</string>
<string name="color_of_progressbar">Barva detailů</string>
<string name="amoled_mode">AMOLED model</string>
<string name="amoled_mode_description__app_specific">Pro procházení barvy s AMOLED zobrazujeme příjemnou černou barvu v mnoha částech aplikace.</string>
<!-- Notifications dropdown -->
<string name="extended_notifications">Rozšířené oznámení</string>
<string name="extendend_notifications_bell_description__appspecific">Rozšiř oznámení zvonku pomocí výběrového menu, které zobrazuje kategorie oznámení</string>
<string name="language_change_restart_description">Pokud chcete zmìnit jazyk této aplikace, bude vyžadován její restart.</string>
<string name="language">Jazyk</string>
<string name="system_language">Jazyk systému</string>
<!-- Font size -->
<string name="control_textsize_of_webview">Konfigurovat velikost textu WebViewu</string>
<string name="font_size">Velikost písma</string>
<string name="normal">Normální</string>
<string name="large">Velké</string>
<string name="huge">Obrovské</string>
<!-- Load images -->
<string name="load_images">Načítej obrázky</string>
<string name="toggle_image_loading_to_save_mobile_data">Útok obrázku na např. uložte mobilní data</string>
<!-- Screen rotation -->
<string name="screen_rotation">Rotace obrazovky</string>
<string name="control_screen_rotation">Kontroluj automatickou rotaci</string>
<string name="default_">Standardní</string>
<string name="sensor_ignore_system_settings">Senzor\n(ignorovat systémové nastavení)</string>
<string name="portrait">Na výšku</string>
<string name="landscape">Na šířku</string>
<!-- Proxy -->
<string name="load_tor_preset">Načti přednastavení Toru</string>
<string name="load_proxy_settins_for_tor">Načti proxy nastavení pro Tor (Orbot) HTTP Proxy</string>
<string name="proxy">Proxy</string>
<string name="enable_proxy">Aktivovat proxy</string>
<string name="proxy_dandelion_traffic__appspecific">Veď datovou cestu dandelion*, aby se obešla brána Firewall.\nMůže být vyžadován restart. Toto nemusí fungovat na všech přístrojích.</string>
<string name="host">Host</string>
<string name="port">Port</string>
<string name="app_needs_restart_to_disable_proxy_usage">Při restartu musíte zakázat používání proxy serveru</string>
<string name="orbot_proxy_preset_loaded">načtený panel proxy</string>
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="personal_settings">Osobní nastavení</string>
<string name="open_diaspora_account_settings__appspecific">Otevřte nastavení účtu diaspory</string>
<string name="manage_your_contact_list">Spravte Váš seznam kontaktů</string>
<string name="manage_hashtags">Řídit Hashtagy</string>
<string name="unfollow_already_followed_hashtags__appspecific">Unfollow již následoval hashts</string>
<string name="change_account">Změna konta</string>
<string name="loug_warning_description__appspecific">Erase local session data and switch to another diaspora* pod/účet</string>
<string name="logout_warning_description">Chcete změnit svůj účet?</string>
<string name="clear_cache">Vyprázdnit cache</string>
<string name="clear_webview_cache">Smazat cache WebView</string>
<string name="intellihide_toolbars__appspecific">Automaticky skryjí horní a dolní lišty při každém hodnocení.</string>
<string name="intellihide_toolbars">Lity rozumových nástrojů</string>
<string name="append_shared_by_notice">Konečný společný přístup</string>
<string name="append_shared_by_notice__appspecific">Přidat referenci této aplikace ke sdílenému textu: [via #dandelion]</string>
<!-- More -->
<string name="miscellaneous">Různé</string>
<string name="full_reset">Celkový reset</string>
<string name="wipe_settings_and_logout">Podařilo se vám smazat všechna nastavení související s aplikací a přihlásit se ze všech účtů.</string>
<string name="wipe_settings_warning__appspecific">Toto přepíše všechna změněná nastavení aplikace do výchozích hodnot a vymaže vás ze všech podů.</string>
<string name="enable_basic_adblocker_description">Uživatelné základní Adcker může být součástí např. v embedded views.</string>
<string name="block_advertisments">Blokové reklamy</string>
<string name="about">Informace</string>
<string name="license">Licence</string>
<string name="debugging">Debugging</string>
<string name="application">Aplikace</string>
<string name="device">Přístroj</string>
<string name="diaspora_pod__appspecific">Pod diaspora*</string>
<string name="debug_log">Protokol odstraňování chyb</string>
<string name="debug_log_verbose">Protokol odstraňování chyb (detailně)</string>
<string name="app_version_with_arg">Verze aplikace: %1$s</string>
<string name="android_version_witharg">Android verze: %1$s</string>
<string name="device_name_witharg">Název přístroje: %1$s</string>
<string name="code_name_witharg">Kódový název: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Profilový název Podu: %1$s</string>
<string name="pod_domain_witharg__appspecific">Doména Podu: %1$s</string>
<string name="debug_log_copied_to_clipboard">Protokol odstraňování chyb byl zkopírován do schránky</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* je Tvoje doprovodná aplikace pro procházení sociální sítí diaspora*. Nabízí features jako užitečné nástrojové lišty nebo podporu pro proxy servery (např. Tor Network).</string>
<string name="contribute_code">Spolupracuj!</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* je svobodný software (free as in Freedom) a řídí se myšlenkami projektu diaspora*. Pokud chceš přispívat, jen do toho! Momentálně jsme velmi malý tým, takže jsme velmi vděční za jakýkoli druh pomoci!</string>
<string name="get_the_source">Ke zdrojovému kódu</string>
<string name="translate_the_app">Přelož aplikaci!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Pokud si nejste jistí, že jste se rozhodli pro něco, co potřebujete?</string>
<string name="let_me_translate">Chci překládat</string>
<string name="give_feedback">Dej zpětnou vazbu!</string>
<string name="dandelion_still_in_development__appspecific">dandelion* je stále ve vývoji, takže pokud máš jakékoli návrhy, neváhej nám zanechat zpětnou vazbu pomocí užití našeho bug trackeru!</string>
<string name="report_bugs">Nahlásit chybu</string>
<string name="spread_the_word">Řekni o aplikaci ostatním!</string>
<string name="tell_your_friends_about_diaspora__appspecific">Řekni svým přátelům a rodině o diaspora* a #dadelion! Proč nezačít blogovat o Tvých zkušenostech? Rádi o Tobě uslyšíme!</string>
<string name="share_the_app">Sdílejte chuť</string>
<string name="hey_checkout_dandelion_tag__appspecific">Hey! Podívejte se na #dandelion! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Vývojáři</string>
<string name="contributors">Spolupracovníci</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;Děkujeme!</string>
<string name="gnu_gplv3_license">GNU GPLv3+ Licence</string>
<string name="show_third_party_licenses">Knihovny třetí strany</string>
<string name="the_following_libraries_are_used">Následující knihovny jsou využívány:</string>
<string name="inspiration_from_leafpic__appspecific">We took some inspiration and code from LeafPic.</string>
<string name="tell_me_more">Řekni mi více</string>
<string name="enable_to_open_youtube_links_on_external_app">Umožnit otevřít Youtube odkazy na externí aplikace</string>
<string name="youtube_links">Youtube odkazy</string>
<string name="change_the_theme_of_your_account">Změňte téma vašeho účtu</string>
<string name="pull_to_refresh">Pull osvěžit</string>
</resources>

View File

@ -27,12 +27,40 @@
<string name="reshared">Gendelte</string>
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<string name="more">Mere</string>
<string name="share_dotdotdot">Del…</string>
<string name="share_image">Del billede</string>
<string name="open_in_external_browser">Åben i ekstern browser&#8230;</string>
<string name="copy_link_adress_to_clipboard">Kopier link-adresse til udklipsholder</string>
<!-- More from MainActivity -->
<!-- Permissions -->
<string name="hide_statusbar">Gem statusbar</string>
<!-- Operability -->
<string name="top_toolbar_loads_stream__appsp">Øverste værktøjslinje indlæser strøm</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Klik på tom plads i den øverste værktøjslinje for at åbne strømme</string>
<!-- Category Titles -->
<string name="appearance">Udseende</string>
<string name="network">Netværk</string>
<!-- Visuals -->
<!-- Navigiation Slider -->
<string name="general">Generelt</string>
<!-- Themes -->
<string name="primary_colors">Primær farve</string>
<string name="colors_of_toolbars">Værktøjslinjers farver</string>
<string name="accent_color">Markeringsfarve</string>
<!-- Notifications dropdown -->
<string name="language_change_restart_description">Ændre applikationens sprog. Genstart for at ændringen træder i kraft</string>
<string name="language">Sprog</string>
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<string name="default_">Standard</string>
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="clear_cache">Ryd cache</string>
<!-- More -->
<string name="miscellaneous">Diverse</string>
<string name="about">Om</string>
<string name="license">Licens</string>
<string name="debugging">Fejlsøgning</string>
@ -60,24 +88,6 @@
<string name="report_bugs">Rapporter fejl</string>
<string name="spread_the_word">Spred ordet!</string>
<!-- License & help (large amount of text) -->
<!-- Key Names (Untranslatable) -->
<!-- Operability -->
<string name="top_toolbar_loads_stream__appsp">Øverste værktøjslinje indlæser strøm</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Klik på tom plads i den øverste værktøjslinje for at åbne strømme</string>
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<string name="primary_colors">Primær farve</string>
<string name="colors_of_toolbars">Værktøjslinjers farver</string>
<string name="accent_color">Markeringsfarve</string>
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<string name="maintainers">Udviklere</string>
<string name="contributors">Bidragsydere</string>
</resources>

View File

@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<string name="open_navdrawer">NavDrawer öffnen</string>
<string name="close_navdrawer">NavDrawer schließen</string>
<string name="reload">Aktualisieren</string>
<string name="close">Schließen</string>
<string name="cancel">Abbrechen</string>
<!-- Common Words -->
<string name="settings">Einstellungen</string>
<string name="notifications">Benachrichtigungen</string>
@ -49,7 +52,7 @@
<string name="search_by_tags_or_persons__appspecific">Suche nach Tags oder Personen…</string>
<string name="exit_app">App beenden</string>
<string name="toggle_mobile_desktop_view">Mobil-/Desktopansicht umschalten</string>
<string name="share_dotdotdot">Teilen&#8230;</string>
<string name="share_dotdotdot">Teilen</string>
<string name="by_tags">nach Tags</string>
<string name="by_people">nach Personen</string>
<string name="please_add_a_name">Füge einen Namen ein.</string>
@ -79,48 +82,9 @@ nachträglich erteilen. Öffne dafür: Systemeinstellungen - Apps - dandelion*.
<string name="jump_to_last_visited_page_in_stream__appspecific">Zuletzt besuchte Seite im Stream aufrufen?</string>
<string name="hide_statusbar_in_mainview">Statusleiste in Hauptansicht verstecken</string>
<string name="hide_statusbar">Statusleiste verstecken</string>
<string name="about">Über</string>
<string name="license">Lizenz</string>
<string name="debugging">Debugging</string>
<string name="application">Anwendung</string>
<string name="device">Gerät</string>
<string name="diaspora_pod__appspecific">diaspora* Pod</string>
<string name="debug_log">Debug-Protokoll</string>
<string name="debug_log_verbose">Debug-Protokoll (Verbose)</string>
<string name="app_version_with_arg">App Version: %1$s</string>
<string name="android_version_witharg">Android Version: %1$s</string>
<string name="device_name_witharg">Gerätename: %1$s</string>
<string name="code_name_witharg">Codename: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Pod Profil Name: %1$s</string>
<string name="pod_domain_witharg__appspecific">Pod Domain: %1$s</string>
<string name="debug_log_copied_to_clipboard">Debug-Protokoll in Zwischenablage kopiert</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* ist dein Begleiter auf deinen Streifzügen durch das soziale Netzwerk diaspora*. Es bietet dir zusätzliche Funktionen wie nützliche Werkzeugleisten und Unterstützung für Proxyserver wie das Tor-Netzwerk.</string>
<string name="contribute_code">Mach mit!</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* wird frei wie in Freiheit entwickelt und folgt den Ideen des diaspora* Projektes. Wenn du mithelfen willst, nur zu! Wir sind momentan nur ein sehr kleines Team und sind froh über jede Unterstützung!</string>
<string name="get_the_source">Zum Quellcode</string>
<string name="translate_the_app">Übersetze die App!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Die Anwendung ist nicht in deiner Sprache verfügbar? Das kannst du ändern! Warum hilfst du uns nicht, indem du übersetzt? Wir benutzen die Plattform crowdin, um es jedem zu ermöglichen, die App zu übersetzen.</string>
<string name="let_me_translate">Ich möchte übersetzen</string>
<string name="give_feedback">Feedback geben!</string>
<string name="dandelion_still_in_development__appspecific">dandelion* befindet sich noch in Entwicklung, wenn du also Vorschläge oder etwas anderes auf dem Herzen hast besuche doch unseren Bug Tracker und lass es uns wissen!</string>
<string name="report_bugs">Fehler melden</string>
<string name="spread_the_word">Anderen davon erzählen!</string>
<string name="tell_your_friends_about_diaspora__appspecific">Erzähl deiner Familie und deinen Freunden von diaspora* und #dandelion! Warum bloggst du nicht über deine Erfahrungen mit der App? Wir würden gerne davon erfahren!</string>
<string name="share_the_app">Weitersagen</string>
<string name="hey_checkout_dandelion_tag__appspecific">Hallo! Schau dir #dandelion an! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Entwickler</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Diese Anwendung wird momentan entwickelt und betreut von &lt;br&gt;&lt;br&gt;%1$s</string>
<string name="contributors">Mitwirkende</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;Vielen Dank!</string>
<string name="gnu_gplv3_license">GNU GPLv3+ Lizenz</string>
<string name="show_third_party_licenses">Drittanbieter-Bibliotheken</string>
<string name="the_following_libraries_are_used">Die folgenden Bibliotheken werden genutzt:</string>
<string name="inspiration_from_leafpic__appspecific">Wir haben ein wenig bei LeafPic gespickt. Schaut euch das mal an, es handelt sich dabei auch um freie Software!</string>
<string name="tell_me_more">Erzähl mir mehr</string>
<!-- Key Names (Untranslatable) -->
<string name="show_title_in_main_view">Titel in der Hauptansicht anzeigen</string>
<string name="show_title">Titel anzeigen</string>
<string name="launcher_shortcut">Launcher Verknüpfung</string>
<!-- Operability -->
<string name="top_toolbar_loads_stream__appsp">Obere Werkzeugleiste lädt Stream</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Klicks auf leere Flächen der oberen Werkzeugleiste öffnen den Stream</string>
@ -201,4 +165,48 @@ nachträglich erteilen. Öffne dafür: Systemeinstellungen - Apps - dandelion*.
<string name="wipe_settings_warning__appspecific">Dies wird alle geänderten Einstellungen der Anwendung auf die Standardwerte zurücksetzen und alle Konten abmelden. Deine heruntergeladenen Medien bleiben unberührt. Bist du sicher, dass du fortfahren willst?</string>
<string name="enable_basic_adblocker_description">Einfachen Werbeblocker aktivieren. Werbung könnte z.B. in eingebetteten Anzeigen enthalten sein</string>
<string name="block_advertisments">Werbung blockieren</string>
<string name="about">Über</string>
<string name="license">Lizenz</string>
<string name="debugging">Debugging</string>
<string name="application">Anwendung</string>
<string name="device">Gerät</string>
<string name="diaspora_pod__appspecific">diaspora* Pod</string>
<string name="debug_log">Debug-Protokoll</string>
<string name="debug_log_verbose">Debug-Protokoll (Verbose)</string>
<string name="app_version_with_arg">App Version: %1$s</string>
<string name="android_version_witharg">Android Version: %1$s</string>
<string name="device_name_witharg">Gerätename: %1$s</string>
<string name="code_name_witharg">Codename: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Pod Profil Name: %1$s</string>
<string name="pod_domain_witharg__appspecific">Pod Domain: %1$s</string>
<string name="debug_log_copied_to_clipboard">Debug-Protokoll in Zwischenablage kopiert</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* ist dein Begleiter auf deinen Streifzügen durch das soziale Netzwerk diaspora*. Es bietet dir zusätzliche Funktionen wie nützliche Werkzeugleisten und Unterstützung für Proxyserver wie das Tor-Netzwerk.</string>
<string name="contribute_code">Mach mit!</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* wird frei wie in Freiheit entwickelt und folgt den Ideen des diaspora* Projektes. Wenn du mithelfen willst, nur zu! Wir sind momentan nur ein sehr kleines Team und sind froh über jede Unterstützung!</string>
<string name="get_the_source">Zum Quellcode</string>
<string name="translate_the_app">Übersetze die App!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Die Anwendung ist nicht in deiner Sprache verfügbar? Das kannst du ändern! Warum hilfst du uns nicht, indem du übersetzt? Wir benutzen die Plattform crowdin, um es jedem zu ermöglichen, die App zu übersetzen.</string>
<string name="let_me_translate">Ich möchte übersetzen</string>
<string name="give_feedback">Feedback geben!</string>
<string name="dandelion_still_in_development__appspecific">dandelion* befindet sich noch in Entwicklung, wenn du also Vorschläge oder etwas anderes auf dem Herzen hast besuche doch unseren Bug Tracker und lass es uns wissen!</string>
<string name="report_bugs">Fehler melden</string>
<string name="spread_the_word">Anderen davon erzählen!</string>
<string name="tell_your_friends_about_diaspora__appspecific">Erzähl deiner Familie und deinen Freunden von diaspora* und #dandelion! Warum bloggst du nicht über deine Erfahrungen mit der App? Wir würden gerne davon erfahren!</string>
<string name="share_the_app">Weitersagen</string>
<string name="hey_checkout_dandelion_tag__appspecific">Hallo! Schau dir #dandelion an! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Entwickler</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Diese Anwendung wird momentan entwickelt und betreut von &lt;br&gt;&lt;br&gt;%1$s</string>
<string name="contributors">Beitragende</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;Vielen Dank!</string>
<string name="gnu_gplv3_license">GNU GPLv3+ Lizenz</string>
<string name="show_third_party_licenses">Drittanbieter-Bibliotheken</string>
<string name="the_following_libraries_are_used">Die folgenden Bibliotheken werden genutzt:</string>
<string name="inspiration_from_leafpic__appspecific">Wir haben ein wenig bei LeafPic gespickt. Schaut euch das mal an, es handelt sich dabei auch um freie Software!</string>
<string name="tell_me_more">Erzähl mir mehr</string>
<string name="enable_to_open_youtube_links_on_external_app">Einschalten um YouTube Links in einer externen App zu öffnen</string>
<string name="youtube_links">YouTube Links</string>
<string name="change_the_theme_of_your_account">Thema des Accounts ändern</string>
<string name="pull_to_refresh">Pull-To-Refresh</string>
<string name="pulling_down_on_top_of_page_to_refresh">In der Website von ganz oben nach unten ziehen um zu aktualisieren.\nDu musst die App neu starten damit die Änderungen wirksam werden.</string>
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<string name="open_navdrawer">Abrir el panel de navegación</string>
<string name="close_navdrawer">Cerrar el panel de navegación</string>
<string name="reload">Refrescar</string>
<string name="close">Cerrar</string>
<string name="cancel">Cancelar</string>
<!-- Common Words -->
<string name="settings">Ajustes</string>
<string name="notifications">Notificaciones</string>
@ -48,7 +52,7 @@
<string name="search_by_tags_or_persons__appspecific">Buscar por etiquetas o por personas</string>
<string name="exit_app">Salir de la aplicación</string>
<string name="toggle_mobile_desktop_view">Alternar vista de móvil/escritorio</string>
<string name="share_dotdotdot">Compartir&#8230;</string>
<string name="share_dotdotdot">Compartir</string>
<string name="by_tags">por etiquetas</string>
<string name="by_people">por personas</string>
<string name="please_add_a_name">Por favor, añade un nombre</string>
@ -75,48 +79,7 @@
<string name="hide_statusbar">Ocultar barra de estado</string>
<string name="show_title_in_main_view">Mostrar título en la vista princial</string>
<string name="show_title">Mostrar título</string>
<string name="about">Acerca de</string>
<string name="license">Licencia</string>
<string name="debugging">Depurando</string>
<string name="application">Aplicación</string>
<string name="device">Dispositivo</string>
<string name="diaspora_pod__appspecific">Pod de diaspora*</string>
<string name="debug_log">Depurar registro</string>
<string name="debug_log_verbose">Depurar registro (Detallado)</string>
<string name="app_version_with_arg">Versión aplicación:%1$s</string>
<string name="android_version_witharg">Versión de Android: %1$s</string>
<string name="device_name_witharg">Nombre del dispositivo: %1$s</string>
<string name="code_name_witharg">Nombre clave: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Nombre de perfil del pod: %1$s</string>
<string name="pod_domain_witharg__appspecific">Dominio del pod:%1$s</string>
<string name="debug_log_copied_to_clipboard">Registro de depuración copiado al portapapeles</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* es su complemento para navegar por la red social diapora*. Añade características como útiles barras de herramientas y soporte para servidores proxy como la red Tor a su experiencia social.</string>
<string name="contribute_code">¡Contribuir con código!</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* se desarrolla libre, en el sentido de libertad, y sigue las ideas del proyecto diaspora*. Si usted quiere contribuir, ¡adelante! Actualmente somos un equipo muy pequeño, por lo que ¡agradeceríamos mucho cualquier tipo de ayuda!</string>
<string name="get_the_source">Obtener el código fuente</string>
<string name="translate_the_app">¡Traducir la aplicación!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">¿La aplicación no está disponible en su idioma? ¡Usted puede cambiar eso! ¿Por qué no nos ayuda traduciéndola? Utilizamos la plataforma crowdin para permitir a cualquiera traducir la aplicación.</string>
<string name="let_me_translate">Permítanme traducir</string>
<string name="give_feedback">Danos tu opinión!</string>
<string name="dandelion_still_in_development__appspecific">dandelion* todavía está en desarrollo, así que si tiene sugerencias o cualquier tipo de comentarios, ¡utilice nuestro gestor de errores para hacérnoslo saber!</string>
<string name="report_bugs">Reporte de errores</string>
<string name="spread_the_word">¡Corre la voz!</string>
<string name="tell_your_friends_about_diaspora__appspecific">¡Hable a sus amigos y familiares acerca de diaspora* y #dandelion! ¿Por qué no difunde sus experiencias? ¡Nos encantaría escucharle!</string>
<string name="share_the_app">Compartir la aplicación</string>
<string name="hey_checkout_dandelion_tag__appspecific">¡Hey! ¡Mira #dandelion! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Mantenimiento</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Esta aplicación está siendo desarrollada y mantenida por &lt; br &gt;&lt; br &gt;%1$s</string>
<string name="contributors">Colaboradores</string>
<string name="thank_you_witharg">¡%1$s &lt; br &gt;&lt; br &gt; Gracias!</string>
<string name="gnu_gplv3_license">Licencia GNU GPLv3 +</string>
<string name="show_third_party_licenses">Bibliotecas de terceros</string>
<string name="the_following_libraries_are_used">Se utilizan las siguientes bibliotecas:</string>
<string name="inspiration_from_leafpic__appspecific">Tomamos algo de inspiración y código de LeafPic. ¡Venga, tomad prestado, es software libre también!</string>
<string name="tell_me_more">Saber más</string>
<!-- Key Names (Untranslatable) -->
<string name="launcher_shortcut">Atajo de lanzador</string>
<!-- Operability -->
<string name="top_toolbar_loads_stream__appsp">Barra de herramientas superior carga la portada</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Haga clic en un espacio vacío en la barra de herramientas superior para abrir portada</string>
@ -144,7 +107,7 @@
<!-- Notifications dropdown -->
<string name="extended_notifications">Notificaciones extendidas</string>
<string name="extendend_notifications_bell_description__appspecific">Extender la campana de notificaciones con un menú desplegable que muestra categorías de notificación</string>
<string name="language_change_restart_description">Cambiar el idioma de esta aplicación. Reinicie la aplicación para que los cambios surtan efecto</string>
<string name="language_change_restart_description">Cambiar el idioma de esta aplicación. Reiniciar la aplicación para que se apliquen los cambios</string>
<string name="language">Idioma</string>
<string name="system_language">Idioma del sistema</string>
<!-- Font size -->
@ -197,4 +160,48 @@
<string name="wipe_settings_warning__appspecific">Esto restablecerá todas las modificaciones en la configuración a sus valores predeterminados y se desconectará de todos los pods. Las imágenes descargadas permanecerán intactas. ¿Está seguro de que desea continuar?</string>
<string name="enable_basic_adblocker_description">Habilitar bloqueador de publicidad básico. Publicidad podrá ser incluida p.ej. en vistas incrustadas</string>
<string name="block_advertisments">Bloquear publicidad</string>
<string name="about">Acerca de</string>
<string name="license">Licencia</string>
<string name="debugging">Depurando</string>
<string name="application">Aplicación</string>
<string name="device">Dispositivo</string>
<string name="diaspora_pod__appspecific">Pod de diaspora*</string>
<string name="debug_log">Depurar registro</string>
<string name="debug_log_verbose">Depurar registro (Detallado)</string>
<string name="app_version_with_arg">Versión aplicación:%1$s</string>
<string name="android_version_witharg">Versión de Android: %1$s</string>
<string name="device_name_witharg">Nombre del dispositivo: %1$s</string>
<string name="code_name_witharg">Nombre clave: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Nombre de perfil del pod: %1$s</string>
<string name="pod_domain_witharg__appspecific">Dominio del pod:%1$s</string>
<string name="debug_log_copied_to_clipboard">Registro de depuración copiado al portapapeles</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* es su complemento para navegar por la red social diapora*. Añade características como útiles barras de herramientas y soporte para servidores proxy como la red Tor a su experiencia social.</string>
<string name="contribute_code">¡Contribuir con código!</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* se desarrolla libre, en el sentido de libertad, y sigue las ideas del proyecto diaspora*. Si usted quiere contribuir, ¡adelante! Actualmente somos un equipo muy pequeño, por lo que ¡agradeceríamos mucho cualquier tipo de ayuda!</string>
<string name="get_the_source">Obtener el código fuente</string>
<string name="translate_the_app">¡Traducir la aplicación!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">¿La aplicación no está disponible en su idioma? ¡Usted puede cambiar eso! ¿Por qué no nos ayuda traduciéndola? Utilizamos la plataforma crowdin para permitir a cualquiera traducir la aplicación.</string>
<string name="let_me_translate">Permítanme traducir</string>
<string name="give_feedback">Danos tu opinión!</string>
<string name="dandelion_still_in_development__appspecific">dandelion* todavía está en desarrollo, así que si tiene sugerencias o cualquier tipo de comentarios, ¡utilice nuestro gestor de errores para hacérnoslo saber!</string>
<string name="report_bugs">Reporte de errores</string>
<string name="spread_the_word">¡Corre la voz!</string>
<string name="tell_your_friends_about_diaspora__appspecific">¡Hable a sus amigos y familiares acerca de diaspora* y #dandelion! ¿Por qué no difunde sus experiencias? ¡Nos encantaría escucharle!</string>
<string name="share_the_app">Compartir la aplicación</string>
<string name="hey_checkout_dandelion_tag__appspecific">¡Hey! ¡Mira #dandelion! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Mantenimiento</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Esta aplicación está siendo desarrollada y mantenida por &lt; br &gt;&lt; br &gt;%1$s</string>
<string name="contributors">Contribuidores</string>
<string name="thank_you_witharg">¡%1$s &lt; br &gt;&lt; br &gt; Gracias!</string>
<string name="gnu_gplv3_license">Licencia GNU GPLv3 +</string>
<string name="show_third_party_licenses">Bibliotecas de terceros</string>
<string name="the_following_libraries_are_used">Se utilizan las siguientes bibliotecas:</string>
<string name="inspiration_from_leafpic__appspecific">Tomamos algo de inspiración y código de LeafPic. ¡Venga, tomad prestado, es software libre también!</string>
<string name="tell_me_more">Saber más</string>
<string name="enable_to_open_youtube_links_on_external_app">Habilitar para abrir enlaces de Youtube en aplicaciones externas</string>
<string name="youtube_links">Enlaces de YouTube</string>
<string name="change_the_theme_of_your_account">Cambiar el tema de tu cuenta</string>
<string name="pull_to_refresh">Tirar para refrescar</string>
<string name="pulling_down_on_top_of_page_to_refresh">Deslizar hacia abajo la parte superior de la página para refrescar.\n Necesita reiniciar la aplicación para que los cambios surtan efecto.</string>
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<string name="settings">تنظیمات</string>
<string name="search">جستجو</string>
<string name="changelog">لاگ تغییرات</string>
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<string name="more">بیشتر</string>
<!-- More from MainActivity -->
<!-- Permissions -->
<string name="hide_statusbar">مخفی کردن نوار وضعیت</string>
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<string name="general">عمومی</string>
<!-- Themes -->
<!-- Notifications dropdown -->
<string name="language_change_restart_description">تغییر زبان برنامه. لازم است برنامه را از نو اجرا کنید تا تغییرات را ببینید</string>
<string name="language">زبان</string>
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<string name="default_">پیش‌فرض</string>
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<string name="about">درباره مارکور</string>
<!-- License & help (large amount of text) -->
<string name="contributors">همکاران</string>
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<string name="settings">Mga Tanawin</string>
<string name="search">Hanapin</string>
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<string name="appearance">Ayos</string>
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<string name="open_navdrawer">Ouvrir le tiroir de navigation</string>
<string name="close_navdrawer">Fermer le tiroir de navigation</string>
<string name="reload">Rafraîchir</string>
<string name="close">Fermer</string>
<string name="cancel">Annuler</string>
<!-- Common Words -->
<string name="settings">Paramètres</string>
<string name="notifications">Notifications</string>
@ -48,7 +52,7 @@
<string name="search_by_tags_or_persons__appspecific">Recherche par tags ou par personnes</string>
<string name="exit_app">Quitter l\'application</string>
<string name="toggle_mobile_desktop_view">Activer/désactiver la vue bureau/mobile</string>
<string name="share_dotdotdot">Partager&#8230;</string>
<string name="share_dotdotdot">Partager</string>
<string name="by_tags">par tags</string>
<string name="by_people">par personne</string>
<string name="please_add_a_name">Veuillez ajouter un nom</string>
@ -75,51 +79,7 @@
<string name="hide_statusbar">Cacher la barre de statut</string>
<string name="show_title_in_main_view">Afficher le titre dans la vue principale</string>
<string name="show_title">Afficher le titre</string>
<string name="open_navdrawer">Ouvrir le tiroir de navigation</string>
<string name="close_navdrawer">Fermer le tiroir de navigation</string>
<string name="launcher_shortcut">Raccourci de l\'écran d\'accueil</string>
<string name="about">À propos</string>
<string name="license">Licence</string>
<string name="debugging">Déboguer</string>
<string name="application">Application</string>
<string name="device">Appareil</string>
<string name="diaspora_pod__appspecific">Pod diaspora*</string>
<string name="debug_log">Journal de débogage</string>
<string name="debug_log_verbose">Log de débogage (Verbeux)</string>
<string name="app_version_with_arg">Version app : %1$s</string>
<string name="android_version_witharg">Version Android : %1$s</string>
<string name="device_name_witharg">Nom de l\'appareil : %1$s</string>
<string name="code_name_witharg">Nom de code : %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Pod alias : %1$s</string>
<string name="pod_domain_witharg__appspecific">Adresse du pod : %1$s</string>
<string name="debug_log_copied_to_clipboard">Journal de débogage copié dans le presse-papiers</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* est votre application compagnon pour naviguer sur le réseau social diaspora*. Il ajoute des fonctionnalités telles que des barres doutils utiles et la prise en charge pour les serveurs proxy comme le réseau Tor à votre expérience sociale.</string>
<string name="contribute_code">Contribuez au code !</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* est libre, et suit les idées du projet diaspora*. Si vous voulez contribuer, allez-y ! Actuellement, nous sommes une toute petite équipe, donc nous apprécierions tout type d\'aide !</string>
<string name="get_the_source">Obtenir la source</string>
<string name="translate_the_app">Traduire l\'application !</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Lapplication nest pas disponible dans votre langue ? Vous pouvez changer cela ! Pourquoi ne pas nous aider à la traduire ? Nous utilisons la plate-forme crowdin pour permettre à quiconque de traduire lapplication.</string>
<string name="let_me_translate">Je voudrais traduire</string>
<string name="give_feedback">Donnez votre avis !</string>
<string name="dandelion_still_in_development__appspecific">dandelion* est encore en développement, donc si vous avez des suggestions ou nimporte quel genre de retour, veuillez utiliser notre traqueur de bogues pour nous le faire savoir !</string>
<string name="report_bugs">Signaler un bug</string>
<string name="spread_the_word">Faîtes passer le mot !</string>
<string name="tell_your_friends_about_diaspora__appspecific">Parlez de diaspora* et #dandelion à vos amis et votre famille ! Pourquoi ne pas bloguer à propos de votre expérience ? Nous aimerions la lire !</string>
<string name="share_the_app">Partager cette application</string>
<string name="hey_checkout_dandelion_tag__appspecific"> ! Découvrez #dandelion ! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Mainteneurs</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Cette application est actuellement développée et maintenue par &lt;br&gt;&lt;br&gt;%1$s</string>
<string name="contributors">Contributeurs</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;Merci !</string>
<string name="gnu_gplv3_license">Licence GNU GPLv3+</string>
<string name="show_third_party_licenses">Bibliothèques tierces</string>
<string name="the_following_libraries_are_used">Les bibliothèques suivantes sont utilisées :</string>
<string name="inspiration_from_leafpic__appspecific">Nous avons pris des inspirations et du code de LeafPic. Allez voir, c\'est aussi un logiciel libre !</string>
<string name="tell_me_more">En savoir plus</string>
<!-- Key Names (Untranslatable) -->
<!-- Operability -->
<string name="top_toolbar_loads_stream__appsp">La barre du haut charge le flux</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Cliquez sur un espace vide sur la barre du haut pour ouvrir le flux</string>
@ -147,7 +107,7 @@
<!-- Notifications dropdown -->
<string name="extended_notifications">Notifications étendues</string>
<string name="extendend_notifications_bell_description__appspecific">Étendre la cloche de notifications avec un menu déroulant qui affiche les catégories de notification</string>
<string name="language_change_restart_description">Change la langue de l\'application. Redémarrez l\'application pour que les changements prennent effet</string>
<string name="language_change_restart_description">Changer la langue de l\'interface. Vous devrez redémarrer l\'application pour que ce changement soit pris en compte</string>
<string name="language">Langue</string>
<string name="system_language">Langue du système</string>
<!-- Font size -->
@ -200,4 +160,48 @@
<string name="wipe_settings_warning__appspecific">Ceci va réinitialiser tous les changements à leurs valeurs par défaut et vous déconnecter de tous les pods. Vos images téléchargées resteront intactes. Êtes-vous sûr de vouloir continuer ?</string>
<string name="enable_basic_adblocker_description">Activer un bloqueur de pub. Des pubs peuvent être incluses, dans des vues embarquées par exemple</string>
<string name="block_advertisments">Bloquer les publicités</string>
<string name="about">À propos</string>
<string name="license">Licence</string>
<string name="debugging">Déboguer</string>
<string name="application">Application</string>
<string name="device">Appareil</string>
<string name="diaspora_pod__appspecific">Pod diaspora*</string>
<string name="debug_log">Journal de débogage</string>
<string name="debug_log_verbose">Log de débogage (Verbeux)</string>
<string name="app_version_with_arg">Version app : %1$s</string>
<string name="android_version_witharg">Version Android : %1$s</string>
<string name="device_name_witharg">Nom de l\'appareil : %1$s</string>
<string name="code_name_witharg">Nom de code : %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Pod alias : %1$s</string>
<string name="pod_domain_witharg__appspecific">Adresse du pod : %1$s</string>
<string name="debug_log_copied_to_clipboard">Journal de débogage copié dans le presse-papiers</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* est votre application compagnon pour naviguer sur le réseau social diaspora*. Il ajoute des fonctionnalités telles que des barres doutils utiles et la prise en charge pour les serveurs proxy comme le réseau Tor à votre expérience sociale.</string>
<string name="contribute_code">Contribuez au code !</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* est libre, et suit les idées du projet diaspora*. Si vous voulez contribuer, allez-y ! Actuellement, nous sommes une toute petite équipe, donc nous apprécierions tout type d\'aide !</string>
<string name="get_the_source">Obtenir la source</string>
<string name="translate_the_app">Traduire l\'application !</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Lapplication nest pas disponible dans votre langue ? Vous pouvez changer cela ! Pourquoi ne pas nous aider à la traduire ? Nous utilisons la plate-forme crowdin pour permettre à quiconque de traduire lapplication.</string>
<string name="let_me_translate">Je voudrais traduire</string>
<string name="give_feedback">Donnez votre avis !</string>
<string name="dandelion_still_in_development__appspecific">dandelion* est encore en développement, donc si vous avez des suggestions ou nimporte quel genre de retour, veuillez utiliser notre traqueur de bogues pour nous le faire savoir !</string>
<string name="report_bugs">Signaler un bug</string>
<string name="spread_the_word">Faîtes passer le mot !</string>
<string name="tell_your_friends_about_diaspora__appspecific">Parlez de diaspora* et #dandelion à vos amis et votre famille ! Pourquoi ne pas bloguer à propos de votre expérience ? Nous aimerions la lire !</string>
<string name="share_the_app">Partager cette application</string>
<string name="hey_checkout_dandelion_tag__appspecific"> ! Découvrez #dandelion ! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Mainteneurs</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Cette application est actuellement développée et maintenue par &lt;br&gt;&lt;br&gt;%1$s</string>
<string name="contributors">Contributeurs</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;Merci !</string>
<string name="gnu_gplv3_license">Licence GNU GPLv3+</string>
<string name="show_third_party_licenses">Bibliothèques tierces</string>
<string name="the_following_libraries_are_used">Les bibliothèques suivantes sont utilisées :</string>
<string name="inspiration_from_leafpic__appspecific">Nous avons pris des inspirations et du code de LeafPic. Allez voir, c\'est aussi un logiciel libre !</string>
<string name="tell_me_more">En savoir plus</string>
<string name="enable_to_open_youtube_links_on_external_app">Autoriser l\'ouverture des liens Youtube par une appli externe</string>
<string name="youtube_links">Liens Youtube</string>
<string name="change_the_theme_of_your_account">Changer le thème de votre compte</string>
<string name="pull_to_refresh">Tirer vers le bas pour mettre à jour</string>
<string name="pulling_down_on_top_of_page_to_refresh">Tirez depuis le haut de la page vers le bas pour l\'actualiser.\nVous devez redémarrer l\'application pour que ces changements prennent effet.</string>
</resources>

View File

@ -1,15 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Editado con nano-->
<resources>
<!-- Application -->
<string name="open_navdrawer">Abrir cadro de navegación</string>
<string name="close_navdrawer">Pechar cadro de navegación</string>
<string name="open_navdrawer">Abrir cadro de navegación</string>
<string name="close_navdrawer">Pechar cadro de navegación</string>
<string name="reload">Actualizar</string>
<string name="close">Pechar</string>
<string name="cancel">Cancelar</string>
<!-- Common Words -->
<string name="settings">Axustes</string>
<string name="notifications">Notificacións</string>
<string name="conversations">Conversa</string>
<string name="stream">Fío de comentarios</string>
<string name="conversations">Conversas</string>
<string name="stream">Cronoloxía</string>
<string name="profile">Perfil</string>
<string name="aspects">Aspecto</string>
<string name="activities">Actividades</string>
@ -28,10 +29,10 @@
<string name="deleteme_____1">Gústame</string>
<string name="mentioned">Mencionado</string>
<string name="reshared">Compartido</string>
<string name="started_sharing">Comezou a compartir</string>
<string name="started_sharing">Xa compartes</string>
<!-- Pod Activity -->
<string name="could_not_retrieve_list_of_pods__appspecific">Problema: non se obtivo a lista de nodos!</string>
<string name="sorry_need_to_be_connected_to_internet">Desculpe, precisa unha conexión a internet para esa tarefa</string>
<string name="sorry_need_to_be_connected_to_internet">Desculpa, tes que ter conexión a internet para esto</string>
<string name="confirmation">Confirmación</string>
<string name="do_you_want_to_exit">Quere saír?</string>
<!-- Drawer, Menu, Toolbar, ContextMenu -->
@ -49,12 +50,12 @@
<string name="new_post">Nova mensaxe</string>
<string name="go_to_top">Ir arriba</string>
<string name="search_by_tags_or_persons__appspecific">Buscar persoas ou etiquetas</string>
<string name="exit_app">Saír do app</string>
<string name="exit_app">Saír da app</string>
<string name="toggle_mobile_desktop_view">Vista móbil/escritorio</string>
<string name="share_dotdotdot">Compartir&#8230;</string>
<string name="share_dotdotdot">Compartir</string>
<string name="by_tags">Etiquetas</string>
<string name="by_people">Persoas</string>
<string name="please_add_a_name">Por favor, engada un nome</string>
<string name="please_add_a_name">Por favor, engade un nome</string>
<string name="share_link_address">Compartir ligazón</string>
<string name="save_image">Gardar imaxe</string>
<string name="share_image">Compartir imaxe</string>
@ -64,69 +65,27 @@
<!-- More from MainActivity -->
<string name="unable_to_load_image">Non se cargou a imaxe</string>
<!-- Permissions -->
<string name="screenshot_permission__appspecific">Debe permitir \"Permiso de acceso a almacenamento\" para gardar capturas. Pode
pechar a aplicación ou reiniciar o dispositivo. Si non permite acceder ao almacenamento pero que utilizar máis tarde a captura de pantalla, poderá permitir posteriormente o acceso na sección de permisos do dispositivo onde pode activar o \"permiso de acceso a almacenamento\" para dandelion*.</string>
<string name="image_permission_description__appspecific">Ten que permitir \"Permiso de acceso a almacenamento\" para gardar/subir imaxes. Despois de iso debería
pechar a aplicación ou reiniciar o dispositivo. Se non permite acceder ao almacenamento, para poder gardar imaxes posteriormente, deberá abrir: preferencias do sistema - apps - dandelion* no dispositivo.
Na sección de permisos pode activar o \"permiso de escritura no almacenamento\".</string>
<string name="screenshot_permission__appspecific">Debes permitir \"Permiso de acceso a almacenamento\" para gardar capturas. Podes
pechar a aplicación ou reiniciar o dispositivo. Se non permites acceder ao almacenamento pero queres utilizar máis tarde a captura de pantalla, poderás permitir posteriormente o acceso na sección de permisos do dispositivo onde podes activar o \"permiso de acceso a almacenamento\" para dandelion*.</string>
<string name="image_permission_description__appspecific">Tes que permitir \"Permiso de acceso a almacenamento\" para gardar/subir imaxes. Despois de iso deberías
pechar a aplicación ou reiniciar o dispositivo. Se non permites acceder ao almacenamento, para poder gardar imaxes posteriormente, deberás abrir: preferencias do sistema - apps - dandelion* no dispositivo.
Na sección de permisos podes activar o \"permiso de escritura no almacenamento\".</string>
<string name="permission_denied">Permiso denegado.</string>
<string name="permission_granted_try_again">Permiso concedido. Inténteo de novo.</string>
<string name="permission_granted_try_again">Permiso concedido. Inténtao de novo.</string>
<string name="custom_pod">Nodo personalizado</string>
<string name="pod_name">Nome do nodo</string>
<string name="protocol">Protocolo</string>
<string name="pod_address">Enderezo do nodo</string>
<string name="missing_value">Faltan datos</string>
<string name="jump_to_last_visited_page_in_stream__appspecific">Ir a última paxina lida na conversa?</string>
<string name="jump_to_last_visited_page_in_stream__appspecific">Ir a última páxina lida na conversa?</string>
<string name="hide_statusbar_in_mainview">Agochar a barra de estado na vista principal</string>
<string name="hide_statusbar">Agochar barra de estado</string>
<string name="show_title_in_main_view">Mostrar título na vista principal</string>
<string name="show_title">Mostrar título</string>
<string name="launcher_shortcut">Atallo do lanzador</string>
<string name="about">Sobre</string>
<string name="license">Licenza</string>
<string name="debugging">Depurando</string>
<string name="application">Aplicación</string>
<string name="device">Dispositivo</string>
<string name="diaspora_pod__appspecific">Nodo diaspora*</string>
<string name="debug_log">Rexistro de depuración</string>
<string name="debug_log_verbose">Rexistro de depuración (polo miúdo)</string>
<string name="app_version_with_arg">Versión do App: %1$s</string>
<string name="android_version_witharg">Versión Android: %1$s</string>
<string name="device_name_witharg">Nome do dispositivo: %1$s</string>
<string name="code_name_witharg">Alcume: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Nome do perfil do nodo: %1$s</string>
<string name="pod_domain_witharg__appspecific">Dominio do nodo: %1$s</string>
<string name="debug_log_copied_to_clipboard">Ficheiro de depuración copiado ao portapapeis</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* é a súa aplicación para a rede social diaspora*. Engade características como barras de ferramentas e soporte para servidores proxy como a rede Tor para a súa experiencia social.</string>
<string name="contribute_code">Contribúa ao código!</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* é desenvolto libre, libre de Liberdade, e segue o espíritu que marca o proxecto diaspora*. Se quere contribuír, adiante! Por agora somos un equipo pequeno, así que agradecemos calquer tipo de axuda!</string>
<string name="get_the_source">Obteña as fontes</string>
<string name="translate_the_app">Traduza o app!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Non está a aplicación no seu idioma? Pode cambiar eso! Por qué non nos axuda traducíndoa? Utilizamos a plataforma github para que calquera poida traducir a app.</string>
<string name="let_me_translate">Deixame traducir</string>
<string name="give_feedback">Qué lle parece!</string>
<string name="dandelion_still_in_development__appspecific">dandelion* aínda está en desenvolvemento, asi que si ten suxerencias de calquer tipo o valoración, por favor utilice o noso xestor de erros para facérnolo saber!</string>
<string name="report_bugs">Reporte erros</string>
<string name="spread_the_word">Difunda!</string>
<string name="tell_your_friends_about_diaspora__appspecific">Dígalle aos seus amigos e familiares que utiliza diaspora* e #dandelion! Por qué no escribir sobre a experiencia? Encantaríanos saber de vostede!</string>
<string name="share_the_app">Comparta a aplicación</string>
<string name="hey_checkout_dandelion_tag__appspecific">Ei!! Olla a #dandelion! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Mantedores</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Esta aplicación está a ser desenvolta e mantida por &lt;br&gt;&lt;br&gt;%1$s</string>
<string name="contributors">Contribúen</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;Grazas!</string>
<string name="gnu_gplv3_license">Licenza GNU GPLv3+</string>
<string name="show_third_party_licenses">Código de terceiras partes</string>
<string name="the_following_libraries_are_used">Utilízase o seguinte código:</string>
<string name="inspiration_from_leafpic__appspecific">Inspirámonos e collemos código de LeafPic. Bótalle un ollo, tamén é software libre!</string>
<string name="tell_me_more">Cóntame máis</string>
<!-- Key Names (Untranslatable) -->
<string name="launcher_shortcut">Atallo do lanzador</string>
<!-- Operability -->
<string name="top_toolbar_loads_stream__appsp">A barra superior carga a conversa</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Pulse nun espazo baldeiro na barra superior para abrir a conversa</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Preme nun espazo baleiro na barra superior para abrir a conversa</string>
<!-- Category Titles -->
<string name="appearance">Aparencia</string>
<string name="network">Rede</string>
@ -135,13 +94,13 @@
<!-- Visuals -->
<!-- Navigiation Slider -->
<string name="navigation_drawer">Cadro de navegación</string>
<string name="control_visibility_of_entries_nav_drawer">Controle a visibiidade das entradas no cadro de navegación</string>
<string name="control_visibility_of_entries_nav_drawer">Controla a visibiidade das entradas no cadro de navegación</string>
<string name="user">Usuaria</string>
<string name="general">Xeral</string>
<string name="admin">Admin</string>
<!-- Themes -->
<string name="theme_and_colors">Decorado e cores</string>
<string name="control_which_colors_are_used_in_app">Estableza qué cores se utilizan na aplicación</string>
<string name="control_which_colors_are_used_in_app">Escolle qué cores se utilizan na aplicación</string>
<string name="primary_colors">Cor primaria</string>
<string name="colors_of_toolbars">Cor das barras de ferramentas</string>
<string name="accent_color">Cor de énfase</string>
@ -151,7 +110,7 @@
<!-- Notifications dropdown -->
<string name="extended_notifications">Notificacións extendidas</string>
<string name="extendend_notifications_bell_description__appspecific">Extender a icona da campá de notificación con un menú desplegable que mostre a categoría das notificacións</string>
<string name="language_change_restart_description">Cambiar o idioma de esta aplicación. Reinicie para que se aplique o troco</string>
<string name="language_change_restart_description">Cambiar o idioma de esta aplicación. Reinicia para que se aplique o troco</string>
<string name="language">Idioma</string>
<string name="system_language">Idioma do sistema</string>
<!-- Font size -->
@ -175,22 +134,22 @@
<string name="load_proxy_settins_for_tor">Cargar axustes proxy para Tor (Orbot) HTTP Proxy</string>
<string name="proxy">Proxy</string>
<string name="enable_proxy">Habilitar Proxy</string>
<string name="proxy_dandelion_traffic__appspecific">Proxy para o tráfico de dandelion* para saltar cortalumes.\nPodería precisar reinicio. Esto podería non funcionar en algúns móbiles.</string>
<string name="proxy_dandelion_traffic__appspecific">Proxy para o tráfico de dandelion* para saltar cortalumes.\nPodería precisar reinicio. Esto podería non funcionar nalgúns móbiles.</string>
<string name="host">Servidor</string>
<string name="port">Porto</string>
<string name="app_needs_restart_to_disable_proxy_usage">Precisa reiniciar o app para deshabilitar o uso do proxy</string>
<string name="app_needs_restart_to_disable_proxy_usage">Precisa reiniciar a app para desactivar o uso do proxy</string>
<string name="orbot_proxy_preset_loaded">Cargadas as preferencias do proxy Orbot</string>
<!-- Chrome custom tabs -->
<string name="open_external_links_with_chrome_custom_tabs_description">Abrir ligazóns externas con Chrome Custom Tabs. Chromium ou Google Chrome ten que estar instalado para utilizar esta característica.\nIMPORTANTE: Chrome Custom Tabs non utiliza os servidores proxy configurados!</string>
<!-- Diaspora Settings -->
<string name="personal_settings">Axustes personais</string>
<string name="open_diaspora_account_settings__appspecific">Abrir os axustes da conta diaspora*</string>
<string name="manage_your_contact_list">Xestione a a lista de contactos</string>
<string name="manage_your_contact_list">Xestiona a lista de contactos</string>
<string name="manage_hashtags">Xestionar etiquetas</string>
<string name="unfollow_already_followed_hashtags__appspecific">Deixar de seguir etiquetas que segue</string>
<string name="unfollow_already_followed_hashtags__appspecific">Deixar de seguir etiquetas que segues</string>
<string name="change_account">Mudar de conta</string>
<string name="loug_warning_description__appspecific">Eliminar os datos locais da sesión e cambiar a outro nodo/conta de diaspora*</string>
<string name="logout_warning_description">Esto eliminará todas as cookies e datos de sesión. Seguro que quere mudar de conta?</string>
<string name="logout_warning_description">Esto eliminará todas as cookies e datos de sesión. Seguro que queres mudar de conta?</string>
<string name="clear_cache">Limpar cache</string>
<string name="clear_webview_cache">Limpar a cache da VistaWeb</string>
<string name="intellihide_toolbars__appspecific">Agochar automáticamente as barras superior e inferior mentras desplaza</string>
@ -200,8 +159,52 @@
<!-- More -->
<string name="miscellaneous">Varios</string>
<string name="full_reset">Restablecer completamente</string>
<string name="wipe_settings_and_logout">Eliminar todas os axustes locais do app e desconectar todas as contas</string>
<string name="wipe_settings_warning__appspecific">Esto restablecerá todos os axustes da aplicación ao valor por omisión e desconectarao de todos os nodos. As súas imaxes descargadas permanecerán. Seguro que quere proceder?</string>
<string name="enable_basic_adblocker_description">Habilitar un AdBlocker básico. Poderían verse anuncios por exemplo en vistas incrustadas</string>
<string name="wipe_settings_and_logout">Eliminar todolos axustes locais da app e desconectar todas as contas</string>
<string name="wipe_settings_warning__appspecific">Esto restablecerá todos os axustes da aplicación ao valor por omisión e desconectarate de todolos nodos. As imaxes descargadas permanecerán. Seguro que queres proceder?</string>
<string name="enable_basic_adblocker_description">Activar un AdBlocker básico. Poderían verse anuncios por exemplo en vistas incrustadas</string>
<string name="block_advertisments">Bloquear publicidade</string>
<string name="about">Sobre</string>
<string name="license">Licenza</string>
<string name="debugging">Depurando</string>
<string name="application">Aplicación</string>
<string name="device">Dispositivo</string>
<string name="diaspora_pod__appspecific">Nodo diaspora*</string>
<string name="debug_log">Rexistro de depuración</string>
<string name="debug_log_verbose">Rexistro de depuración (polo miúdo)</string>
<string name="app_version_with_arg">Versión da App: %1$s</string>
<string name="android_version_witharg">Versión Android: %1$s</string>
<string name="device_name_witharg">Nome do dispositivo: %1$s</string>
<string name="code_name_witharg">Alcume: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Nome do perfil do nodo: %1$s</string>
<string name="pod_domain_witharg__appspecific">Dominio do nodo: %1$s</string>
<string name="debug_log_copied_to_clipboard">Ficheiro de depuración copiado ao portapapeis</string>
<string name="dandelion_is_your_companion__appspecific">dandelion* é a túa aplicación para a rede social diaspora*. Engade características como barras de ferramentas e soporte para servidores proxy como a rede Tor.</string>
<string name="contribute_code">Contribúa ao código!</string>
<string name="dandelion_is_developed_as_foss__appspecific">dandelion* é desenvolta libre, libre de Liberdade, e segue o espíritu que marca o proxecto diaspora*. Se queres contribuír, adiante! Por agora somos un equipo pequeno, así que agradecemos calquer tipo de axuda!</string>
<string name="get_the_source">Aquí as fontes</string>
<string name="translate_the_app">Traduce a app!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Non está a aplicación no teu idioma? Podes cambiar eso! Por qué non nos axudas traducíndoa? Utilizamos a plataforma Crowdin para que calquera poida traducir a app.</string>
<string name="let_me_translate">Deixame traducir</string>
<string name="give_feedback">Danos a túa opinión!</string>
<string name="dandelion_still_in_development__appspecific">dandelion* aínda está en desenvolvemento, asi que se tes suxestións de calquer tipo ou valoración, por favor usa o noso xestor de errros para facérnolo saber!</string>
<string name="report_bugs">Reporte erros</string>
<string name="spread_the_word">Difunde!</string>
<string name="tell_your_friends_about_diaspora__appspecific">Dille aos teus amigos e familiares que utilizas diaspora* e #dandelion! Por qué non escribir sobre a experiencia? Encantaríanos saber de ti!</string>
<string name="share_the_app">Comparte a aplicación</string>
<string name="hey_checkout_dandelion_tag__appspecific">Ei!! Olla #dandelion! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Mantedores</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Esta aplicación está a ser desenvolta e mantida por &lt;br&gt;&lt;br&gt;%1$s</string>
<string name="contributors">Contribúen</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;Grazas!</string>
<string name="gnu_gplv3_license">Licenza GNU GPLv3+</string>
<string name="show_third_party_licenses">Código de terceiras partes</string>
<string name="the_following_libraries_are_used">Utilízase o seguinte código:</string>
<string name="inspiration_from_leafpic__appspecific">Inspirámonos e collemos código de LeafPic. Bótalle un ollo, tamén é software libre!</string>
<string name="tell_me_more">Cóntame máis</string>
<string name="enable_to_open_youtube_links_on_external_app">Activar para abrir vídeos YouTube nunha app externa</string>
<string name="youtube_links">Ligazóns YouTube</string>
<string name="change_the_theme_of_your_account">Cambiar o decorado da túa conta</string>
<string name="pull_to_refresh">Tira para actualizar</string>
<string name="pulling_down_on_top_of_page_to_refresh">Tirar hacia abaixo na parte superior da páxina.\nDebes reiniciar a app para que os cambios se apliquen.</string>
</resources>

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<string name="open_navdrawer">नेविगेशन ड्रॉवर खोलें</string>
<string name="close_navdrawer">नेविगेशन ड्रॉवर को बंद करें</string>
<!-- Common Words -->
<string name="settings">सेटिंग्स</string>
<string name="search">खोजें</string>
<string name="changelog">बदलाव लॉग</string>
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<string name="more">अधिक</string>
<string name="share_dotdotdot">साझा करें...</string>
<!-- More from MainActivity -->
<!-- Permissions -->
<string name="hide_statusbar">स्थिति पट्टी छुपाएँ</string>
<string name="show_title">शीर्षक दिखाएं</string>
<!-- Operability -->
<!-- Category Titles -->
<string name="appearance">दिखावट</string>
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<string name="language_change_restart_description">इस ऐप की भाषा बदलें परिवर्तन प्रभावी होने के लिए ऐप को पुन: प्रारंभ करें</string>
<string name="language">भाषा</string>
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<string name="clear_cache">कैश को साफ़ करें</string>
<!-- More -->
<string name="miscellaneous">विविध</string>
<string name="about">जानकारी</string>
<string name="license">लाइसेंस</string>
<!-- License & help (large amount of text) -->
<string name="contributors">योगदान कर्ता</string>
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Application -->
<!-- Common Words -->
<!-- Notifications dropdown menu -->
<!-- Pod Activity -->
<!-- Drawer, Menu, Toolbar, ContextMenu -->
<!-- More from MainActivity -->
<!-- Permissions -->
<!-- Operability -->
<!-- Category Titles -->
<!-- Visuals -->
<!-- Navigiation Slider -->
<!-- Themes -->
<!-- Notifications dropdown -->
<!-- Font size -->
<!-- Load images -->
<!-- Screen rotation -->
<!-- Proxy -->
<!-- Chrome custom tabs -->
<!-- Diaspora Settings -->
<!-- More -->
<!-- License & help (large amount of text) -->
</resources>

View File

@ -48,7 +48,7 @@
<string name="search_by_tags_or_persons__appspecific">Címkék vagy emberek keresése</string>
<string name="exit_app">Kilépés az alkalmazásból</string>
<string name="toggle_mobile_desktop_view">Mobil-/asztali mód</string>
<string name="share_dotdotdot">Megosztás&#8230;</string>
<string name="share_dotdotdot">Megosztás</string>
<string name="by_tags">címkékre</string>
<string name="by_people">emberekre</string>
<string name="please_add_a_name">Kérlek, adj meg egy nevet</string>
@ -71,49 +71,6 @@
<string name="pod_address">Pod címe</string>
<string name="missing_value">Hiányzó érték</string>
<string name="jump_to_last_visited_page_in_stream__appspecific">Ugorjunk a legutóbb meglátogatott oldalra a hírfolyamon belül?</string>
<string name="about">Névjegy</string>
<string name="license">Licensz</string>
<string name="debugging">Hibakeresés</string>
<string name="application">Alkalmazás</string>
<string name="device">Eszköz</string>
<string name="diaspora_pod__appspecific">diaspora*-pod</string>
<string name="debug_log">Hibakeresési napló</string>
<string name="debug_log_verbose">Hibakeresési napló (részletes)</string>
<string name="app_version_with_arg">Alkalmazásverzió: %1$s</string>
<string name="android_version_witharg">Android verzió: %1$s</string>
<string name="device_name_witharg">Eszköznév: %1$s</string>
<string name="code_name_witharg">Kódnév: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Podprofilnév: %1$s</string>
<string name="pod_domain_witharg__appspecific">Pod domain: %1$s</string>
<string name="debug_log_copied_to_clipboard">Hibakeresési napló átmásolva a vágólapra</string>
<string name="dandelion_is_your_companion__appspecific">A dandelion* a te segédalkalmazásod a diaspora* közösségi hálózat böngészésére. Olyan funkciókat ad hozzá a közösségi élményedhez, mint hasznos eszköztárak és proxyszerver-támogatás (pl. Tor).</string>
<string name="contribute_code">Járulj hozzá a fejlesztéshez!</string>
<string name="dandelion_is_developed_as_foss__appspecific">A dandelion* szabad szoftver és a diaspora* projekt elképzeléseit követi. Ha hozzá akarsz járulni, csak rajta! Jelenleg egy nagyon kis csapat vagyunk, így nagyra értékelünk bármilyen segítséget!
</string>
<string name="get_the_source">A program forrása</string>
<string name="translate_the_app">Fordítsd le az alkalmazást!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Nem érhető el az alkalmazás a nyelveden? Ezen változtathatsz! Mit szólnál ahhoz, ha segítenél nekünk a lefordításában? A crowdin platformot használjuk, hogy bárki le tudja fordítani az alkalmazást.</string>
<string name="let_me_translate">Hadd fordítsak</string>
<string name="give_feedback">Adj visszajelzést!</string>
<string name="dandelion_still_in_development__appspecific">A dandelion* még mindig fejlesztés alatt áll, szóval ha vannak javaslataid vagy bármilyen visszajelzésed, kérlek, használd a hibanyomkövetőt!</string>
<string name="report_bugs">Hibajelentés</string>
<string name="spread_the_word">Ajánld másoknak!</string>
<string name="tell_your_friends_about_diaspora__appspecific">Beszélj a barátaiddal és családtagjaiddal a diaspora*-ról és a #dandelionról! Mi lenne, ha blogolnál a tapasztalataidról? Szeretnénk hallani tőled valamit!</string>
<string name="share_the_app">Az alkalmazás megosztása</string>
<string name="hey_checkout_dandelion_tag__appspecific">Szia! Próbáld ki a #dandeliont! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Karbantartók</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Ezt az alkalmazást jelenleg &lt;br&gt;&lt;br&gt;%1$s fejleszti és tartja karban.</string>
<string name="contributors">Hozzájárulók</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;Köszönjük!</string>
<string name="gnu_gplv3_license">GNU GPLv3+ Licenc</string>
<string name="show_third_party_licenses">3. személytől származó könyvtárak</string>
<string name="the_following_libraries_are_used">A következő könyvtárak vannak használatban:</string>
<string name="inspiration_from_leafpic__appspecific">A LeafPicből merítettünk némi inspirációt és programkódot. Próbáld ki, ez is szabad szoftver!</string>
<string name="tell_me_more">Tudj meg többet</string>
<!-- Key Names (Untranslatable) -->
<!-- Operability -->
<string name="top_toolbar_loads_stream__appsp">A fenti eszköztár betölti a hírfolyamot</string>
<string name="click_empty_space_top_toolbar_load_stream__appspecific">Kattints egy üres helyre a fenti eszköztáron a hírfolyam megnyitásához</string>
@ -194,4 +151,43 @@
<string name="wipe_settings_warning__appspecific">Ez az összes módosított beállítás értékét visszaállítja alapra és kijelentkeztet téged az összes podról. A letöltött képeid érintetlenül maradnak. Biztos, hogy folytatod?</string>
<string name="enable_basic_adblocker_description">Alap hirdetésblokkoló (AdBlocker) engedélyezése. Reklámok jelenhetnek meg pl. a beépített megjelenítéseknél</string>
<string name="block_advertisments">Hirdetések blokkolása</string>
<string name="about">Névjegy</string>
<string name="license">Licenc</string>
<string name="debugging">Hibakeresés</string>
<string name="application">Alkalmazás</string>
<string name="device">Eszköz</string>
<string name="diaspora_pod__appspecific">diaspora*-pod</string>
<string name="debug_log">Hibakeresési napló</string>
<string name="debug_log_verbose">Hibakeresési napló (részletes)</string>
<string name="app_version_with_arg">Alkalmazásverzió: %1$s</string>
<string name="android_version_witharg">Android verzió: %1$s</string>
<string name="device_name_witharg">Eszköznév: %1$s</string>
<string name="code_name_witharg">Kódnév: %1$s</string>
<string name="pod_profile_name_witharg__appspecific">Podprofilnév: %1$s</string>
<string name="pod_domain_witharg__appspecific">Pod domain: %1$s</string>
<string name="debug_log_copied_to_clipboard">Hibakeresési napló átmásolva a vágólapra</string>
<string name="dandelion_is_your_companion__appspecific">A dandelion* a te segédalkalmazásod a diaspora* közösségi hálózat böngészésére. Olyan funkciókat ad hozzá a közösségi élményedhez, mint hasznos eszköztárak és proxyszerver-támogatás (pl. Tor).</string>
<string name="contribute_code">Járulj hozzá a fejlesztéshez!</string>
<string name="dandelion_is_developed_as_foss__appspecific">A dandelion* szabad szoftver és a diaspora* projekt elképzeléseit követi. Ha hozzá akarsz járulni, csak rajta! Jelenleg egy nagyon kis csapat vagyunk, így nagyra értékelünk bármilyen segítséget!</string>
<string name="get_the_source">A program forrása</string>
<string name="translate_the_app">Fordítsd le az alkalmazást!</string>
<string name="app_not_available_in_your_lang_translate_with_stringlate">Nem érhető el az alkalmazás a nyelveden? Ezen változtathatsz! Mit szólnál ahhoz, ha segítenél nekünk a lefordításában? A crowdin platformot használjuk, hogy bárki le tudja fordítani az alkalmazást.</string>
<string name="let_me_translate">Hadd fordítsak</string>
<string name="give_feedback">Adj visszajelzést!</string>
<string name="dandelion_still_in_development__appspecific">A dandelion* még mindig fejlesztés alatt áll, szóval ha vannak javaslataid vagy bármilyen visszajelzésed, kérlek, használd a hibanyomkövetőt!</string>
<string name="report_bugs">Hibajelentés</string>
<string name="spread_the_word">Ajánld másoknak!</string>
<string name="tell_your_friends_about_diaspora__appspecific">Beszélj a barátaiddal és családtagjaiddal a diaspora*-ról és a #dandelionról! Mi lenne, ha blogolnál a tapasztalataidról? Szeretnénk hallani tőled valamit!</string>
<string name="share_the_app">Az alkalmazás megosztása</string>
<string name="hey_checkout_dandelion_tag__appspecific">Szia! Próbáld ki a #dandeliont! %1$s</string>
<!-- License & help (large amount of text) -->
<string name="maintainers">Karbantartók</string>
<string name="this_app_is_currently_developed_and_maintained_by_witharg">Ezt az alkalmazást jelenleg &lt;br&gt;&lt;br&gt;%1$s fejleszti és tartja karban.</string>
<string name="contributors">Hozzájárulók</string>
<string name="thank_you_witharg">%1$s&lt;br&gt;&lt;br&gt;Köszönjük!</string>
<string name="gnu_gplv3_license">GNU GPLv3+ Licenc</string>
<string name="show_third_party_licenses">3. személytől származó könyvtárak</string>
<string name="the_following_libraries_are_used">A következő könyvtárak vannak használatban:</string>
<string name="inspiration_from_leafpic__appspecific">A LeafPicből merítettünk némi inspirációt és programkódot. Próbáld ki, ez is szabad szoftver!</string>
<string name="tell_me_more">Tudj meg többet</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More