Compare commits
125 Commits
android-1.
...
master
Author | SHA1 | Date | |
---|---|---|---|
f2b8b0950a | |||
fa668711bf | |||
f06e0e1ca8 | |||
d25aa29fee | |||
48d9afea41 | |||
da4ed503c8 | |||
78a0a2b5f4 | |||
42202cc4d2 | |||
49f4562bf7 | |||
ca6031ab47 | |||
6c83285e04 | |||
96bb2cf161 | |||
ddb2482623 | |||
bf2dea5e0a | |||
2d784dbef2 | |||
554a65987b | |||
846795dea6 | |||
7a22ce4bee | |||
0e25d89bd8 | |||
61010b2c93 | |||
5fac82a915 | |||
c8c36540eb | |||
59b1da6950 | |||
40894d8d04 | |||
d0f38397cd | |||
17b86fffdd | |||
a06b449bfb | |||
128f1df0ac | |||
ed085194e6 | |||
52a4c2f430 | |||
784918d220 | |||
f129773255 | |||
b304771eca | |||
f87e8d036b | |||
16c1277935 | |||
a6aa76f9dd | |||
a0ced4133d | |||
e024950567 | |||
ea68f116e1 | |||
3cb746594c | |||
27adae63eb | |||
85890d3b68 | |||
96b045eb2a | |||
8d00c5fa31 | |||
fc93a71552 | |||
18e4aef4ca | |||
5315e35adc | |||
9ad9bc07ff | |||
bde92be29d | |||
849150ffa6 | |||
52dad19c7a | |||
e84a51097d | |||
5289f5068a | |||
09c7d9cfd8 | |||
14d293fe6f | |||
7cd08cfd4c | |||
aa22d83a44 | |||
a1fd8d41b2 | |||
9d24e68b57 | |||
d5e2804ea4 | |||
1edabd7252 | |||
52c1901eba | |||
a6f5221975 | |||
caa57bbc3a | |||
b28e5d741e | |||
0f3a61390c | |||
30a1f1d800 | |||
22d5d126f6 | |||
70e4ea810f | |||
b5c6e1489a | |||
333a1a49b1 | |||
2ea93f106e | |||
d99ed0e5da | |||
3881966ddb | |||
9de9f46489 | |||
149881522e | |||
df26d89310 | |||
707dcbbc78 | |||
812aea9873 | |||
aeb7614b62 | |||
9bf9d27c5a | |||
f2cfe4cee5 | |||
45865ff5b9 | |||
96f9905952 | |||
41ca3fe527 | |||
c5468e4829 | |||
174bb7f827 | |||
3d92f32c13 | |||
2fae27a3b3 | |||
71d38c64e0 | |||
ddb651a602 | |||
a8ad1d8d47 | |||
912602bfc0 | |||
24e3358ffa | |||
fcc51c429d | |||
de0ee87db3 | |||
2102d55315 | |||
2f900ebe2d | |||
5c03981a61 | |||
c68f0ff23a | |||
b01f44ae1f | |||
05aeb0cf37 | |||
fd8d596064 | |||
ea3fe136e4 | |||
47f4530f6f | |||
016a7a47fd | |||
f8410deeba | |||
7268132ddd | |||
62545f1247 | |||
99b6992b5c | |||
e8ebb0a569 | |||
3ab2c83b7b | |||
cb46abca82 | |||
63b345e329 | |||
794b8433d8 | |||
a7891a3674 | |||
7076785ec1 | |||
f8eda45409 | |||
8d0f1689c1 | |||
25ef37cddf | |||
c5936858a2 | |||
17d2e2fc93 | |||
a0e41e5171 | |||
2d1244f339 | |||
9eec1d3348 |
73
.github/workflows/ant.yml
vendored
Normal file
73
.github/workflows/ant.yml
vendored
Normal file
@ -0,0 +1,73 @@
|
||||
# Mostly copied from https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant
|
||||
# zlatinb
|
||||
|
||||
name: Java CI
|
||||
|
||||
on: [push]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: GetText
|
||||
run: sudo apt install gettext git
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'temurin'
|
||||
- name : Generate override.properties
|
||||
run: |
|
||||
rm -f override.properties
|
||||
echo "build.built-by=GitHub Actions" >> override.properties
|
||||
echo "noExe=true" >> override.properties
|
||||
- name: build with Gradle
|
||||
run: |
|
||||
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
|
||||
git clone -b i2p-2.4.0 https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
|
||||
./gradlew assembleDebug
|
||||
find . -name '*.apk'
|
||||
- name: Upload i2p-debug-${{ github.sha }}.apk
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: i2p-debug.apk
|
||||
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk
|
||||
|
||||
trunk:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: GetText
|
||||
run: sudo apt install gettext git
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'temurin'
|
||||
- name : Generate override.properties
|
||||
run: |
|
||||
rm -f override.properties
|
||||
echo "build.built-by=GitHub Actions" >> override.properties
|
||||
echo "noExe=true" >> override.properties
|
||||
grep -v I2P_ gradle.properties > gradle.properties.update
|
||||
echo "I2P_VERSION=2.5.0-1" >> gradle.properties.update
|
||||
echo "I2P_ANDROID_VERSION=2.5.0-1" >> gradle.properties.update
|
||||
cp -v gradle.properties.update gradle.properties
|
||||
- name: build with Gradle
|
||||
run: |
|
||||
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
|
||||
git clone -b master https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
|
||||
bash -c "cd $HOME/i2p.i2p && ./installer/resources/maven-dev-release.sh 1"
|
||||
./gradlew assembleDebug
|
||||
find . -name '*.apk'
|
||||
- name: Upload i2p-debug-${{ github.sha }}.apk
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: i2p-debug-trunk-${{ github.sha }}.apk
|
||||
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk
|
62
.github/workflows/release.yml
vendored
Normal file
62
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,62 @@
|
||||
name: Release
|
||||
|
||||
#on: [push]
|
||||
|
||||
on:
|
||||
push:
|
||||
# Sequence of patterns matched against refs/tags
|
||||
tags:
|
||||
- 'i2p-android-*.*.*' # Release i2p-firefox-1.2.3
|
||||
- 'i2p-android-*.*.*-*' # Release i2p-firefox-1.2.3
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: |
|
||||
CHANGELOG.md
|
||||
sparse-checkout-cone-mode: false
|
||||
- name: sleep 6 minutes
|
||||
run: |
|
||||
echo "sleeping 6 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 5 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 4 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 3 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 2 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
echo "sleeping 1 minutes to wait for artifacts"
|
||||
sleep 1m
|
||||
- name: Download artifacts
|
||||
id: download-artifact
|
||||
uses: dawidd6/action-download-artifact@v3
|
||||
with:
|
||||
skip_unpack: true
|
||||
workflow: ant.yml
|
||||
if_no_artifact_found: fail
|
||||
# remove .zip file extension
|
||||
#- run: for f in *.zip; do unzip "$f"; rm "$f"; done
|
||||
- run: unzip i2p-debug.apk.zip
|
||||
- run: echo "" | tee -a RELEASE.md
|
||||
- run: echo "## Checksums" | tee -a RELEASE.md
|
||||
- run: echo "" | tee -a RELEASE.md
|
||||
- run: echo '```' | tee -a RELEASE.md
|
||||
- run: sha256sum * | tee -a RELEASE.md
|
||||
- run: echo '```' | tee -a RELEASE.md
|
||||
- run: echo "" | tee -a RELEASE.md
|
||||
- run: echo '```' | tee -a RELEASE.md
|
||||
- run: file * | tee -a RELEASE.md
|
||||
- run: echo '```' | tee -a RELEASE.md
|
||||
- run: echo "" | tee -a RELEASE.md
|
||||
- name: Upload artifacts
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
artifacts: "*"
|
||||
bodyFile: "RELEASE.md"
|
95
.github/workflows/sign.yml
vendored
Normal file
95
.github/workflows/sign.yml
vendored
Normal file
@ -0,0 +1,95 @@
|
||||
# Mostly copied from https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant
|
||||
# zlatinb
|
||||
|
||||
name: Java Signed CI
|
||||
|
||||
on: [push]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
build-signed:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: GetText
|
||||
run: sudo apt install gettext git
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'temurin'
|
||||
- name: Generate override.properties
|
||||
env:
|
||||
DEV_SIGNING_KEY: ${{ secrets.DEV_SIGNING_KEY }}
|
||||
DEV_PASSWORD: ${{ secrets.DEV_PASSWORD }}
|
||||
run: |
|
||||
rm -f override.properties
|
||||
mv etc/github.gradle.properties gradle.properties
|
||||
mv etc/github.signing.properties signing.properties
|
||||
mkdir -p $HOME/keystores/
|
||||
echo $DEV_SIGNING_KEY | base64 --decode > $HOME/keystores/android-release.keystore
|
||||
echo "KEY_ALIAS=mykey" >> signing.properties
|
||||
echo "KEY_PASSWORD=$DEV_PASSWORD" >> signing.properties
|
||||
echo "build.built-by=GitHub Actions" >> override.properties
|
||||
echo "noExe=true" >> override.properties
|
||||
- name: build with Gradle
|
||||
run: |
|
||||
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
|
||||
git clone -b i2p-2.4.0 https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
|
||||
./gradlew assembleRelease
|
||||
find . -name '*.apk'
|
||||
ls -lah $HOME/keystores/android-release.keystore
|
||||
ls -d $HOME
|
||||
- name: Upload i2p-debug-${{ github.sha }}.apk
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: i2p-debug.apk
|
||||
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk
|
||||
|
||||
trunk-signed:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: GetText
|
||||
run: sudo apt install gettext git
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'temurin'
|
||||
- name: Generate override.properties
|
||||
env:
|
||||
DEV_SIGNING_KEY: ${{ secrets.DEV_SIGNING_KEY }}
|
||||
DEV_PASSWORD: ${{ secrets.DEV_PASSWORD }}
|
||||
run: |
|
||||
rm -f override.properties
|
||||
echo "build.built-by=GitHub Actions" >> override.properties
|
||||
echo "noExe=true" >> override.properties
|
||||
mv etc/github.gradle.properties gradle.properties
|
||||
mv etc/github.signing.properties signing.properties
|
||||
mkdir -p $HOME/keystores/
|
||||
echo $DEV_SIGNING_KEY | base64 --decode > $HOME/keystores/android-release.keystore
|
||||
echo "KEY_ALIAS=mykey" >> signing.properties
|
||||
echo "KEY_PASSWORD=$DEV_PASSWORD" >> signing.properties
|
||||
grep -v I2P_ gradle.properties > gradle.properties.update
|
||||
echo "I2P_VERSION=2.5.0-1" >> gradle.properties.update
|
||||
echo "I2P_ANDROID_VERSION=2.5.0-1" >> gradle.properties.update
|
||||
cp -v gradle.properties.update gradle.properties
|
||||
- name: build with Gradle
|
||||
run: |
|
||||
echo "i2psrc=$HOME/i2p.i2p" > routerjars/local.properties
|
||||
git clone -b master https://github.com/i2p/i2p.i2p "$HOME/i2p.i2p"
|
||||
bash -c "cd $HOME/i2p.i2p && ./installer/resources/maven-dev-release.sh 1"
|
||||
./gradlew assembleRelease
|
||||
find . -name '*.apk'
|
||||
ls -lah $HOME/keystores/android-release.keystore
|
||||
ls -d $HOME
|
||||
- name: Upload i2p-debug-${{ github.sha }}.apk
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: i2p-debug-trunk-${{ github.sha }}.apk
|
||||
path: ./app/build/outputs/apk/free/debug/app-free-debug.apk
|
66
.github/workflows/sync.yaml
vendored
Normal file
66
.github/workflows/sync.yaml
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
# GitHub Actions workflow file to sync an external repository to this GitHub mirror.
|
||||
# This file was automatically generated by go-github-sync.
|
||||
#
|
||||
# The workflow does the following:
|
||||
# - Runs on a scheduled basis (and can also be triggered manually)
|
||||
# - Clones the GitHub mirror repository
|
||||
# - Fetches changes from the primary external repository
|
||||
# - Applies those changes to the mirror repository
|
||||
# - Pushes the updated content back to the GitHub mirror
|
||||
#
|
||||
# Authentication is handled by the GITHUB_TOKEN secret provided by GitHub Actions.
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Validate Github Actions Environment
|
||||
run: if [ "$GITHUB_ACTIONS" != "true" ]; then echo 'This script must be run in a GitHub Actions environment.'; exit 1; fi
|
||||
- name: Checkout GitHub Mirror
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Configure Git
|
||||
run: |-
|
||||
git config user.name 'GitHub Actions'
|
||||
git config user.email 'actions@github.com'
|
||||
- env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
name: Sync Primary Repository
|
||||
run: |-
|
||||
# Add the primary repository as a remote
|
||||
git remote add primary https://i2pgit.org/I2P_Developers/i2p.android.base.git
|
||||
|
||||
# Fetch the latest changes from the primary repository
|
||||
git fetch primary
|
||||
|
||||
# Check if the primary branch exists in the primary repository
|
||||
if git ls-remote --heads primary master | grep -q master; then
|
||||
echo "Primary branch master found in primary repository"
|
||||
else
|
||||
echo "Error: Primary branch master not found in primary repository"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if we're already on the mirror branch
|
||||
if git rev-parse --verify --quiet master; then
|
||||
git checkout master
|
||||
else
|
||||
# Create the mirror branch if it doesn't exist
|
||||
git checkout -b master
|
||||
fi
|
||||
|
||||
|
||||
# Force-apply all changes from primary, overriding any conflicts
|
||||
echo "Performing force sync from primary/master to master"
|
||||
git reset --hard primary/master
|
||||
|
||||
|
||||
# Push changes back to the mirror repository
|
||||
git push origin master
|
||||
name: Sync Primary Repository to GitHub Mirror
|
||||
"on":
|
||||
push: {}
|
||||
schedule:
|
||||
- cron: 0 * * * *
|
||||
workflow_dispatch: {}
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -3,3 +3,6 @@ signing.properties
|
||||
.idea
|
||||
.idea/
|
||||
.gradle/
|
||||
local.properties
|
||||
override.properties
|
||||
build
|
24
.tx/config
24
.tx/config
@ -1,18 +1,18 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
lang_map = he: iw, id: in, pt_BR: pt-rBR, ru_RU: ru, sv_SE: sv, tr_TR: tr, uk_UA: uk, yi: ji, zh_CN: zh, zh_TW: zh-rTW
|
||||
host = https://www.transifex.com
|
||||
lang_map = pt_BR: pt-rBR, yi: ji, zh_CN: zh, zh_TW: zh-rTW, id: in, ru_RU: ru, sv_SE: sv, tr_TR: tr, uk_UA: uk, he: iw, es_AR: es-rAR
|
||||
|
||||
[I2P.android]
|
||||
file_filter = app/src/main/res/values-<lang>/strings.xml
|
||||
[o:otf:p:I2P:r:android]
|
||||
file_filter = app/src/main/res/values-<lang>/strings.xml
|
||||
source_file = app/src/main/res/values/strings.xml
|
||||
source_lang = en
|
||||
type = ANDROID
|
||||
minimum_perc = 22
|
||||
source_file = app/src/main/res/values/strings.xml
|
||||
source_lang = en
|
||||
type = ANDROID
|
||||
|
||||
[I2P.android_lib_helper]
|
||||
file_filter = lib/helper/src/main/res/values-<lang>/strings.xml
|
||||
[o:otf:p:I2P:r:android_lib_helper]
|
||||
file_filter = lib/helper/src/main/res/values-<lang>/strings.xml
|
||||
source_file = lib/helper/src/main/res/values/strings.xml
|
||||
source_lang = en
|
||||
type = ANDROID
|
||||
minimum_perc = 50
|
||||
source_file = lib/helper/src/main/res/values/strings.xml
|
||||
source_lang = en
|
||||
type = ANDROID
|
||||
|
||||
|
61
CHANGELOG
61
CHANGELOG
@ -1,3 +1,64 @@
|
||||
2.9.0
|
||||
* Update I2P Library
|
||||
|
||||
2.8.0
|
||||
* Update I2P Library
|
||||
* Migrate to AndroidX
|
||||
* Migrate to MagicIndicator
|
||||
|
||||
2.7.1
|
||||
* Update I2P Library
|
||||
* Roll back ViewPageIndicator version, fixes crash, causes other issues
|
||||
|
||||
2.7.0
|
||||
* Update I2P Library
|
||||
|
||||
2.6.0
|
||||
* Update I2P Library
|
||||
|
||||
2.5.0
|
||||
* Update I2P Library
|
||||
|
||||
2.4.0
|
||||
* Update I2P Library
|
||||
|
||||
2.3.0
|
||||
* Update I2P Library
|
||||
|
||||
2.2.0
|
||||
* Add blocklist feed support
|
||||
* Fix translations on stats page
|
||||
* Various bugfixes
|
||||
|
||||
2.1.0-1
|
||||
* adds support for adding base32 addresses to the local addressbook
|
||||
* adds support for destinations with ports in the string to i2ptunnel
|
||||
* adds support for remote applications launching I2P, via MR#3 from @RyeMantis
|
||||
|
||||
2.1.0
|
||||
* Upgrades router to version 2.1.0
|
||||
* Adds jcenter repository back to app/ target, removes jcenter from other targets
|
||||
* explicitly set android.useAndroidX
|
||||
|
||||
2.0.1
|
||||
* Fixes gitlab#49 by applying MUTABLE or IMMUTABLE flags across all PendingIntents
|
||||
|
||||
2.0.0
|
||||
* Updates router to version 2.0.0
|
||||
* Updates gradle plugin
|
||||
* Remove Firefox from supported browsers list due to lack of about:config support
|
||||
* Add Privacy Browser to supported browsers list and write guide for it
|
||||
|
||||
1.9.1
|
||||
* Switches back to mavenCentral builds
|
||||
* Fixes build process for F-Droid main
|
||||
* Using tag i2p.i2p:i2p-android-1.9.0
|
||||
* Allow b32 and blinded b32 to validate in I2PTunnel UI
|
||||
|
||||
1.9.0
|
||||
* Updates router to version 1.9.0
|
||||
* Using tag i2p.i2p:i2p-android-1.9.0
|
||||
|
||||
1.8.2
|
||||
* This update fixes a bug where Family Keys are incorrectly handled by the Android router, leading
|
||||
to a crash.
|
||||
|
28
LICENSE.txt
28
LICENSE.txt
@ -43,8 +43,34 @@ License for the Android App:
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
See the file licenses/LICENSE-Apache2.0.txt
|
||||
|
||||
===================================
|
||||
|
||||
License for the MagicIndicator library:
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2016 hackware1993
|
||||
|
||||
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 above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
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.
|
||||
|
||||
===================================
|
||||
|
||||
|
||||
See the file licenses/LICENSE-Apache2.0.txt
|
||||
|
@ -14,6 +14,13 @@ NOTE: The docker container built by the Dockerfile in this repostory ensures tha
|
||||
Dependencies are properly met by obtaining them from the Debian package in `oldoldstable` and pre-configuring
|
||||
the override.properties that is used in the Docker container.
|
||||
|
||||
## Tag Freezes and Translations
|
||||
|
||||
1-2 weeks before the software is released, I2P Desktop will have a "Tag Freeze" which is the deadline for
|
||||
translations to be checked in. **When** that time comes, someone who has Transifex privileges should use
|
||||
the command: `tx push -s -R I2P.android` to push any and all changed string resources to transifex for
|
||||
translation.
|
||||
|
||||
**>> Beginning of Docker-enabled Steps <<**
|
||||
|
||||
## Prerequirements
|
||||
@ -26,7 +33,7 @@ the override.properties that is used in the Docker container.
|
||||
5. Ensure you have the Mockito framework and accompanying documentation in your $JAVA_HOME
|
||||
6. Ensure to have updated the changelog with the changes done.
|
||||
7. Ensure that you are configured to build i2p.i2p with Java 8. On Debian it is easiest to set with
|
||||
`update-java-alternatives --set java-8-openjdk-amd64` and picking Java 8. **TODO:** add instructions for non-Debian-based
|
||||
`update-java-alternatives --set java-1.8.0-openjdk-amd64` and picking Java 8. **TODO:** add instructions for non-Debian-based
|
||||
systems.
|
||||
8. Ensure that you have a Java 1.7 bootclasspath available. (See **Maven Central** step 2A.)
|
||||
|
||||
@ -69,8 +76,8 @@ app. After doing the Maven release, follow these steps in the i2p.android.base r
|
||||
the `docker run` step described in `DOCKER.md`
|
||||
|
||||
1. Edit `routerjars/local.properties` to use the clean i2p.i2p copy.
|
||||
2. Pull the latest translations with `tx pull -a` and commit them. (If you don't have the `tx` command,
|
||||
do `pip install transifex-client` )
|
||||
2. Pull the latest translations with `tx pull --use-git-timestamps` and commit them. (If you don't have the `tx` command,
|
||||
do `pip install transifex-client` ). If there are broken translations, exclude them and only them.
|
||||
- If there are any new translations, `mtn add` them, and add them to `app/src/main/res/values/arrays.xml`
|
||||
(two places, alphabetical order please)
|
||||
3. Ensure that `signing.properties` contains the details of the release key. If you are using Docker, see
|
||||
|
@ -1,15 +1,18 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
mavenCentral()
|
||||
maven { url 'https://jitpack.io' }
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
namespace 'net.i2p.android.router'
|
||||
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
|
||||
defaultConfig {
|
||||
versionCode 4745270
|
||||
versionCode Integer.parseInt(project.I2P_ANDROID_VERSION_CODE as String)
|
||||
versionName "$I2P_ANDROID_VERSION"
|
||||
minSdkVersion 14
|
||||
minSdkVersion 21
|
||||
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
|
||||
|
||||
// For Espresso
|
||||
@ -31,15 +34,19 @@ android {
|
||||
}
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_7
|
||||
targetCompatibility JavaVersion.VERSION_1_7
|
||||
coreLibraryDesugaringEnabled true
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
lintOptions {
|
||||
abortOnError false
|
||||
checkReleaseBuilds false
|
||||
disable 'MissingDefaultResource'
|
||||
}
|
||||
packagingOptions {
|
||||
exclude 'LICENSE.txt'
|
||||
resources {
|
||||
excludes += ['LICENSE.txt']
|
||||
}
|
||||
}
|
||||
flavorDimensions 'tier'
|
||||
productFlavors {
|
||||
@ -56,38 +63,68 @@ android {
|
||||
applicationId 'net.i2p.android.router'
|
||||
}
|
||||
}
|
||||
buildToolsVersion '28.0.3'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "androidx.appcompat:appcompat:1.5.1"
|
||||
implementation "androidx.preference:preference:1.2.0"
|
||||
implementation "androidx.annotation:annotation:1.5.0"
|
||||
implementation 'androidx.recyclerview:recyclerview:1.0.0'
|
||||
// Local dependencies
|
||||
implementation project(':lib:client')
|
||||
implementation project(':lib:helper')
|
||||
implementation project(path: ':routerjars', configuration: 'routerjars')
|
||||
// Android Support Repository dependencies
|
||||
def supportVersion = '28.0.0'
|
||||
/*def supportVersion = '28.0.0'
|
||||
implementation "com.android.support:support-v4:$supportVersion"
|
||||
implementation "com.android.support:appcompat-v7:$supportVersion"
|
||||
implementation "com.android.support:preference-v7:$supportVersion"
|
||||
implementation "com.android.support:preference-v14:$supportVersion"
|
||||
implementation "com.android.support:recyclerview-v7:$supportVersion"
|
||||
implementation "com.android.support:recyclerview-v7:$supportVersion"*/
|
||||
implementation 'com.google.android.material:material:1.9.0'
|
||||
// Remote dependencies
|
||||
implementation 'com.androidplot:androidplot-core:1.4.1'
|
||||
implementation 'com.androidplot:androidplot-core:1.5.11'
|
||||
implementation 'com.eowise:recyclerview-stickyheaders:0.5.2@aar'
|
||||
implementation 'com.inkapplications.viewpageindicator:library:2.4.4'
|
||||
//implementation 'com.inkapplications.viewpageindicator:library:2.4.4'
|
||||
implementation 'com.github.hackware1993:MagicIndicator:1.7.0' // for androidx
|
||||
implementation 'com.pnikosis:materialish-progress:1.7'
|
||||
implementation "net.i2p:router:$I2P_VERSION"
|
||||
implementation "net.i2p:i2p:$I2P_VERSION"
|
||||
implementation "net.i2p.client:mstreaming:$I2P_VERSION"
|
||||
implementation "net.i2p.client:streaming:$I2P_VERSION"
|
||||
implementation 'net.i2p.android.ext:floatingactionbutton:1.10.1'
|
||||
implementation 'org.sufficientlysecure:html-textview:3.1'
|
||||
implementation 'com.github.SufficientlySecure:html-textview:v3.6'
|
||||
// Testing-only dependencies
|
||||
androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.2') {
|
||||
exclude group: 'com.android.support', module: 'support-annotations'
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "androidx.appcompat:appcompat:1.5.1"
|
||||
implementation "androidx.preference:preference:1.2.0"
|
||||
implementation "androidx.annotation:annotation:1.5.0"
|
||||
implementation 'androidx.test.espresso:espresso-core:3.6.1'
|
||||
implementation 'androidx.test.ext:junit:1.2.1'
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// ...existing code...
|
||||
|
||||
// Force consistent lifecycle versions
|
||||
implementation('androidx.lifecycle:lifecycle-viewmodel:2.5.1')
|
||||
implementation('androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1')
|
||||
|
||||
// Exclude older versions
|
||||
configurations.all {
|
||||
resolutionStrategy {
|
||||
force 'androidx.lifecycle:lifecycle-viewmodel:2.5.1'
|
||||
force 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
project.ext.i2pbase = "../i2p.i2p"
|
||||
def Properties props = new Properties()
|
||||
def propFile = new File(project(':routerjars').projectDir, 'local.properties')
|
||||
|
@ -1,39 +1,43 @@
|
||||
package net.i2p.android;
|
||||
|
||||
import android.test.ActivityInstrumentationTestCase2;
|
||||
import androidx.test.core.app.ActivityScenario;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
|
||||
import static android.support.test.espresso.Espresso.closeSoftKeyboard;
|
||||
import static android.support.test.espresso.Espresso.onView;
|
||||
import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;
|
||||
import static android.support.test.espresso.Espresso.pressBack;
|
||||
import static android.support.test.espresso.action.ViewActions.click;
|
||||
import static android.support.test.espresso.action.ViewActions.swipeLeft;
|
||||
import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
|
||||
import static android.support.test.espresso.assertion.ViewAssertions.matches;
|
||||
import static android.support.test.espresso.matcher.ViewMatchers.hasSibling;
|
||||
import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
|
||||
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
|
||||
import static android.support.test.espresso.matcher.ViewMatchers.withId;
|
||||
import static android.support.test.espresso.matcher.ViewMatchers.withParent;
|
||||
import static android.support.test.espresso.matcher.ViewMatchers.withText;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import static androidx.test.espresso.Espresso.closeSoftKeyboard;
|
||||
import static androidx.test.espresso.Espresso.onView;
|
||||
import static androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;
|
||||
import static androidx.test.espresso.Espresso.pressBack;
|
||||
import static androidx.test.espresso.action.ViewActions.click;
|
||||
import static androidx.test.espresso.action.ViewActions.swipeLeft;
|
||||
import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
|
||||
import static androidx.test.espresso.assertion.ViewAssertions.matches;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.hasSibling;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.withId;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.withParent;
|
||||
import static androidx.test.espresso.matcher.ViewMatchers.withText;
|
||||
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
|
||||
import static org.hamcrest.Matchers.allOf;
|
||||
import static org.hamcrest.Matchers.not;
|
||||
|
||||
public class I2PActivityTest extends ActivityInstrumentationTestCase2<I2PActivity> {
|
||||
public I2PActivityTest() {
|
||||
super(I2PActivity.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
// For each test method invocation, the Activity will not actually be created
|
||||
// until the first time this method is called.
|
||||
getActivity();
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class I2PActivityTest {
|
||||
|
||||
private ActivityScenario<I2PActivity> scenario;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
scenario = ActivityScenario.launch(I2PActivity.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMainTabs() {
|
||||
onView(withId(R.id.router_onoff_button)).check(matches(isDisplayed()));
|
||||
|
||||
@ -55,6 +59,7 @@ public class I2PActivityTest extends ActivityInstrumentationTestCase2<I2PActivit
|
||||
onView(withId(R.id.router_onoff_button)).check(matches(isDisplayed()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMainSwipe() {
|
||||
onView(withId(R.id.router_onoff_button)).check(matches(isDisplayed()));
|
||||
|
||||
@ -70,9 +75,10 @@ public class I2PActivityTest extends ActivityInstrumentationTestCase2<I2PActivit
|
||||
// TODO: test addressbook ViewPager
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSettingsNavigation() {
|
||||
// Open settings menu
|
||||
openActionBarOverflowOrOptionsMenu(getActivity());
|
||||
openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());
|
||||
onView(withText(R.string.menu_settings)).perform(click());
|
||||
|
||||
// Open bandwidth page
|
||||
@ -106,4 +112,4 @@ public class I2PActivityTest extends ActivityInstrumentationTestCase2<I2PActivit
|
||||
pressBack();
|
||||
onView(withText(R.string.settings_label_advanced)).check(doesNotExist());
|
||||
}
|
||||
}
|
||||
}
|
@ -11,6 +11,7 @@
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||
<!-- following two are for UPnP -->
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
||||
@ -27,7 +28,12 @@
|
||||
<service
|
||||
android:name=".service.RouterService"
|
||||
android:icon="@drawable/ic_launcher_itoopie"
|
||||
android:label="@string/app_name">
|
||||
android:enabled="true"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name"
|
||||
android:foregroundServiceType="specialUse">
|
||||
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||
android:value="i2p_router_background_process_required_network_operation"/>
|
||||
<intent-filter>
|
||||
<action android:name="net.i2p.android.router.service.IRouterState" />
|
||||
</intent-filter>
|
||||
@ -35,17 +41,28 @@
|
||||
<provider
|
||||
android:name=".provider.CacheProvider"
|
||||
android:authorities="${applicationId}.provider" />
|
||||
<receiver android:name=".receiver.OnBootReceiver">
|
||||
<receiver
|
||||
android:name=".receiver.OnBootReceiver"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
<receiver
|
||||
android:name=".receiver.RemoteStartReceiver"
|
||||
android:enabled="true"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="net.i2p.android.router.receiver.START_I2P" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<activity
|
||||
android:name="net.i2p.android.I2PActivity"
|
||||
android:icon="@drawable/ic_launcher_itoopie"
|
||||
android:label="@string/app_name"
|
||||
android:launchMode="singleTop">
|
||||
android:launchMode="singleTop"
|
||||
android:exported="true">
|
||||
<!-- Console filters -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
@ -109,6 +126,7 @@
|
||||
<activity
|
||||
android:name=".web.WebActivity"
|
||||
android:configChanges="orientation|keyboardHidden"
|
||||
android:exported="true"
|
||||
android:label="I2P Web Browser">
|
||||
<!-- Disabled, this browser is not very secure
|
||||
Temporarily enabled until an alternative browser is ready -->
|
||||
|
@ -1,10 +1,15 @@
|
||||
package android.support.v4.view;
|
||||
//package android.support.v4.view;
|
||||
package androidx.viewpager.widget;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.support.v4.os.ParcelableCompat;
|
||||
import android.support.v4.os.ParcelableCompatCreatorCallbacks;
|
||||
//import android.support.v4.os.ParcelableCompat;
|
||||
import androidx.core.os.ParcelableCompat;
|
||||
//import android.support.v4.os.ParcelableCompatCreatorCallbacks;
|
||||
import androidx.core.os.ParcelableCompatCreatorCallbacks;
|
||||
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.widget.Toast;
|
@ -2,9 +2,10 @@ package com.pavelsikun.seekbarpreference;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v7.preference.Preference;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
//import android.support.v7.preference.Preference;
|
||||
import androidx.preference.Preference;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
@ -4,9 +4,11 @@ import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.os.Build;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceViewHolder;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v7.preference.Preference;
|
||||
import androidx.preference.Preference;
|
||||
//import android.support.v7.preference.PreferenceViewHolder;
|
||||
import androidx.preference.PreferenceViewHolder;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
|
@ -5,10 +5,14 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
//import android.support.v4.content.LocalBroadcastManager;
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
@ -25,7 +29,7 @@ import net.i2p.android.router.service.State;
|
||||
import net.i2p.android.router.util.Connectivity;
|
||||
import net.i2p.android.router.util.Util;
|
||||
import net.i2p.android.util.MemoryFragmentPagerAdapter;
|
||||
import android.support.v4.view.CustomViewPager;
|
||||
import androidx.viewpager.widget.CustomViewPager;
|
||||
import net.i2p.android.widget.SlidingTabLayout;
|
||||
import net.i2p.router.RouterContext;
|
||||
|
||||
|
@ -6,7 +6,8 @@ import android.content.ServiceConnection;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
//import android.support.v7.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import net.i2p.android.router.service.RouterBinder;
|
||||
import net.i2p.android.router.service.RouterService;
|
||||
|
@ -88,7 +88,7 @@ class InitActivities {
|
||||
|
||||
File abDir = new File(myDir, "addressbook");
|
||||
abDir.mkdir();
|
||||
copyResourceToFile(R.raw.subscriptions_txt, "addressbook/subscriptions.txt");
|
||||
copyResourceToFileIfAbsent(R.raw.subscriptions_txt, "addressbook/subscriptions.txt");
|
||||
mergeResourceToFile(R.raw.addressbook_config_txt, "addressbook/config.txt", null);
|
||||
|
||||
File docsDir = new File(myDir, "docs");
|
||||
|
@ -1,5 +1,13 @@
|
||||
package net.i2p.android.apps;
|
||||
|
||||
import static net.i2p.app.ClientAppState.INITIALIZED;
|
||||
import static net.i2p.app.ClientAppState.RUNNING;
|
||||
import static net.i2p.app.ClientAppState.STARTING;
|
||||
import static net.i2p.app.ClientAppState.STOPPED;
|
||||
import static net.i2p.app.ClientAppState.STOPPING;
|
||||
import static net.i2p.app.ClientAppState.UNINITIALIZED;
|
||||
import static net.i2p.update.UpdateType.BLOCKLIST;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import net.i2p.android.router.NewsActivity;
|
||||
@ -8,20 +16,26 @@ import net.i2p.android.router.util.Notifications;
|
||||
import net.i2p.app.ClientApp;
|
||||
import net.i2p.app.ClientAppManager;
|
||||
import net.i2p.app.ClientAppState;
|
||||
import static net.i2p.app.ClientAppState.*;
|
||||
import net.i2p.crypto.SU3File;
|
||||
import net.i2p.data.Base64;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.router.Banlist;
|
||||
import net.i2p.router.Blocklist;
|
||||
import net.i2p.router.RouterContext;
|
||||
import net.i2p.router.news.BlocklistEntries;
|
||||
import net.i2p.router.news.NewsEntry;
|
||||
import net.i2p.router.news.NewsMetadata;
|
||||
import net.i2p.router.news.NewsXMLParser;
|
||||
import net.i2p.util.Addresses;
|
||||
import net.i2p.util.EepGet;
|
||||
import net.i2p.util.FileUtil;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.ReusableGZIPInputStream;
|
||||
import net.i2p.util.SecureFileOutputStream;
|
||||
import net.i2p.util.RFC822Date;
|
||||
import net.i2p.util.ReusableGZIPInputStream;
|
||||
import net.i2p.util.SecureFile;
|
||||
import net.i2p.util.SecureFileOutputStream;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
@ -32,6 +46,7 @@ import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -58,6 +73,10 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener, ClientApp {
|
||||
private volatile ClientAppState _state = UNINITIALIZED;
|
||||
public static final String APP_NAME = "NewsFetcher";
|
||||
|
||||
static final String PROP_BLOCKLIST_TIME = "router.blocklistVersion";
|
||||
private static final String BLOCKLIST_DIR = "docs/feed/blocklist";
|
||||
private static final String BLOCKLIST_FILE = "blocklist.txt";
|
||||
|
||||
/**
|
||||
* As of 0.9.41, returns a new one every time. Only call once.
|
||||
*/
|
||||
@ -333,6 +352,11 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener, ClientApp {
|
||||
xml.delete();
|
||||
NewsMetadata data = parser.getMetadata();
|
||||
List<NewsEntry> entries = parser.getEntries();
|
||||
BlocklistEntries ble = parser.getBlocklistEntries();
|
||||
if (ble != null && ble.isVerified())
|
||||
processBlocklistEntries(ble);
|
||||
else
|
||||
_log.info("No blocklist entries found in news feed");
|
||||
String sudVersion = su3.getVersionString();
|
||||
String signingKeyName = su3.getSignerString();
|
||||
File to3 = new File(_context.getTempDir(), "tmp3-" + _context.random().nextInt() + ".xml");
|
||||
@ -343,6 +367,104 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener, ClientApp {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process blocklist entries
|
||||
*
|
||||
* @since 0.9.57
|
||||
*/
|
||||
private void processBlocklistEntries(BlocklistEntries ble) {
|
||||
long oldTime = _context.getProperty(PROP_BLOCKLIST_TIME, 0L);
|
||||
if (ble.updated <= oldTime) {
|
||||
if (_log.shouldWarn())
|
||||
_log.warn("Not processing blocklist " + DataHelper.formatDate(ble.updated) +
|
||||
", already have " + DataHelper.formatDate(oldTime));
|
||||
return;
|
||||
}
|
||||
Blocklist bl = _context.blocklist();
|
||||
Banlist ban = _context.banlist();
|
||||
String reason = "Blocklist feed " + DataHelper.formatDate(ble.updated);
|
||||
int banned = 0;
|
||||
for (Iterator<String> iter = ble.entries.iterator(); iter.hasNext(); ) {
|
||||
String s = iter.next();
|
||||
if (s.length() == 44) {
|
||||
byte[] b = Base64.decode(s);
|
||||
if (b == null || b.length != Hash.HASH_LENGTH) {
|
||||
iter.remove();
|
||||
continue;
|
||||
}
|
||||
Hash h = Hash.create(b);
|
||||
if (!ban.isBanlistedForever(h)) {
|
||||
ban.banlistRouterForever(h, reason);
|
||||
_context.commSystem().forceDisconnect(h);
|
||||
}
|
||||
} else {
|
||||
byte[] ip = Addresses.getIP(s);
|
||||
if (ip == null) {
|
||||
iter.remove();
|
||||
continue;
|
||||
}
|
||||
if (!bl.isBlocklisted(ip))
|
||||
bl.add(ip);
|
||||
}
|
||||
if (++banned >= BlocklistEntries.MAX_ENTRIES) {
|
||||
// prevent somebody from destroying the whole network
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (String s : ble.removes) {
|
||||
if (s.length() == 44) {
|
||||
byte[] b = Base64.decode(s);
|
||||
if (b == null || b.length != Hash.HASH_LENGTH)
|
||||
continue;
|
||||
Hash h = Hash.create(b);
|
||||
if (ban.isBanlistedForever(h))
|
||||
ban.unbanlistRouter(h);
|
||||
} else {
|
||||
byte[] ip = Addresses.getIP(s);
|
||||
if (ip == null)
|
||||
continue;
|
||||
if (bl.isBlocklisted(ip))
|
||||
bl.remove(ip);
|
||||
}
|
||||
}
|
||||
// Save the blocks. We do not save the unblocks.
|
||||
File f = new SecureFile(_context.getConfigDir(), BLOCKLIST_DIR);
|
||||
f.mkdirs();
|
||||
f = new File(f, BLOCKLIST_FILE);
|
||||
boolean fail = false;
|
||||
BufferedWriter out = null;
|
||||
try {
|
||||
out = new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(f), "UTF-8"));
|
||||
out.write("# ");
|
||||
out.write(ble.supdated);
|
||||
out.newLine();
|
||||
banned = 0;
|
||||
for (String s : ble.entries) {
|
||||
s = s.replace(':', ';'); // IPv6
|
||||
out.write(reason);
|
||||
out.write(':');
|
||||
out.write(s);
|
||||
out.newLine();
|
||||
if (++banned >= BlocklistEntries.MAX_ENTRIES)
|
||||
break;
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
_log.error("Error writing blocklist", ioe);
|
||||
fail = true;
|
||||
} finally {
|
||||
if (out != null) try {
|
||||
out.close();
|
||||
} catch (IOException ioe) {}
|
||||
}
|
||||
if (!fail) {
|
||||
f.setLastModified(ble.updated);
|
||||
String upd = Long.toString(ble.updated);
|
||||
_context.router().saveConfig(PROP_BLOCKLIST_TIME, upd);
|
||||
}
|
||||
if (_log.shouldWarn())
|
||||
_log.warn("Processed " + ble.entries.size() + " blocks and " + ble.removes.size() + " unblocks from news feed");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gunzip the file
|
||||
*
|
||||
|
@ -6,7 +6,7 @@ import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.NonNull;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
@ -6,7 +6,8 @@ import android.content.Intent;
|
||||
import android.graphics.ColorMatrix;
|
||||
import android.graphics.ColorMatrixColorFilter;
|
||||
import android.net.Uri;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -1,8 +1,10 @@
|
||||
package net.i2p.android.help;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v7.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
|
@ -8,11 +8,16 @@ import android.content.pm.ResolveInfo;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.Loader;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.LoaderManager;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
//import android.support.v4.content.Loader;
|
||||
import androidx.loader.content.Loader;
|
||||
//import android.support.v7.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@ -102,8 +107,28 @@ public class BrowserListFragment extends Fragment implements
|
||||
getContext().getResources().getStringArray(R.array.supported_browsers));
|
||||
supportedLabels = Arrays.asList(
|
||||
getContext().getResources().getStringArray(R.array.supported_browser_labels));
|
||||
unsupported = Arrays.asList(
|
||||
context.getResources().getStringArray(R.array.unsupported_browsers));
|
||||
unsupported = allBrowsers(context);//Arrays.asList(
|
||||
//context.getResources().getStringArray(R.array.unsupported_browsers));
|
||||
}
|
||||
|
||||
public List<String> allBrowsers(Context context){
|
||||
//try {
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||
intent.setData(Uri.parse("http://www.google.com"));
|
||||
List<ResolveInfo> browserList;
|
||||
PackageManager pm = context.getPackageManager();
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
|
||||
// gets all
|
||||
browserList = pm.queryIntentActivities(intent, PackageManager.MATCH_ALL);
|
||||
} else {
|
||||
browserList = pm.queryIntentActivities(intent, 0);
|
||||
}
|
||||
//}catch()
|
||||
List<String> finalResult = new ArrayList<String>();
|
||||
for (ResolveInfo ri : browserList){
|
||||
finalResult.add(ri.resolvePackageName);
|
||||
}
|
||||
return finalResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -2,10 +2,14 @@ package net.i2p.android.help;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.NavUtils;
|
||||
import android.support.v4.app.TaskStackBuilder;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v4.app.NavUtils;
|
||||
import androidx.core.app.NavUtils;
|
||||
//import android.support.v4.app.TaskStackBuilder;
|
||||
import androidx.core.app.TaskStackBuilder;
|
||||
//import android.support.v7.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.help;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -2,7 +2,8 @@ package net.i2p.android.help;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.ListFragment;
|
||||
//import android.support.v4.app.ListFragment;
|
||||
import androidx.fragment.app.ListFragment;
|
||||
import android.view.View;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ListView;
|
||||
|
@ -2,8 +2,10 @@ package net.i2p.android.i2ptunnel;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v4.app.ActivityCompat;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.View;
|
||||
|
||||
import net.i2p.android.I2PActivityBase;
|
||||
|
@ -10,12 +10,17 @@ import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.view.ViewCompat;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v4.app.DialogFragment;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.view.ViewCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
@ -2,9 +2,12 @@ package net.i2p.android.i2ptunnel;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.support.v4.util.Pair;
|
||||
import android.support.v4.view.ViewCompat;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
//import android.support.v4.util.Pair;
|
||||
import androidx.core.util.Pair;
|
||||
//import android.support.v4.view.ViewCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
@ -2,7 +2,8 @@ package net.i2p.android.i2ptunnel;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.support.v4.content.AsyncTaskLoader;
|
||||
//import android.support.v4.content.AsyncTaskLoader;
|
||||
import androidx.loader.content.AsyncTaskLoader;
|
||||
|
||||
import net.i2p.android.router.util.Util;
|
||||
import net.i2p.i2ptunnel.TunnelController;
|
||||
|
@ -6,13 +6,20 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.Loader;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.support.v4.util.Pair;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.LoaderManager;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
//import android.support.v4.content.Loader;
|
||||
import androidx.loader.content.Loader;
|
||||
//import android.support.v4.content.LocalBroadcastManager;
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||
//import android.support.v4.util.Pair;
|
||||
import androidx.core.util.Pair;
|
||||
//import android.support.v7.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@ -57,6 +64,8 @@ public class TunnelListFragment extends Fragment implements
|
||||
private TunnelEntryAdapter mAdapter;
|
||||
private boolean mClientTunnels;
|
||||
|
||||
private static final String KEY_SELECTED_TUNNEL = "selected_tunnel";
|
||||
|
||||
// Container Activity must implement this interface
|
||||
public interface OnTunnelSelectedListener {
|
||||
void onTunnelSelected(int tunnelId, Pair<View, String>[] pairs);
|
||||
@ -100,6 +109,12 @@ public class TunnelListFragment extends Fragment implements
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
if (savedInstanceState != null) {
|
||||
int tunnelId = savedInstanceState.getInt(KEY_SELECTED_TUNNEL, -1);
|
||||
if (tunnelId != -1) {
|
||||
mCallback.onTunnelSelected(tunnelId, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -6,9 +6,11 @@ import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v4.app.DialogFragment;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
import net.i2p.android.wizard.model.AbstractWizardModel;
|
||||
|
@ -1,15 +1,25 @@
|
||||
package net.i2p.android.i2ptunnel;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.support.v4.app.ActivityOptionsCompat;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentPagerAdapter;
|
||||
import android.support.v4.util.Pair;
|
||||
import android.support.v4.view.ViewPager;
|
||||
//import android.support.v4.app.ActivityCompat;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
//import android.support.v4.app.ActivityOptionsCompat;
|
||||
import androidx.core.app.ActivityOptionsCompat;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
//import android.support.v4.app.FragmentPagerAdapter;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
//import android.support.v4.util.Pair;
|
||||
import androidx.core.util.Pair;
|
||||
//import android.support.v4.view.ViewPager;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
@ -19,7 +29,17 @@ import android.view.ViewGroup;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.viewpagerindicator.TitlePageIndicator;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
import net.lucode.hackware.magicindicator.MagicIndicator;
|
||||
import net.lucode.hackware.magicindicator.ViewPagerHelper;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ColorTransitionPagerTitleView;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.SimplePagerTitleView;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import net.i2p.android.i2ptunnel.preferences.EditTunnelContainerFragment;
|
||||
import net.i2p.android.i2ptunnel.util.TunnelUtil;
|
||||
@ -52,7 +72,7 @@ public class TunnelsContainer extends Fragment implements
|
||||
private boolean mTwoPane;
|
||||
|
||||
ViewPager mViewPager;
|
||||
TitlePageIndicator mPageIndicator;
|
||||
MagicIndicator mPageIndicator;
|
||||
FragmentPagerAdapter mFragPagerAdapter;
|
||||
|
||||
private static final String FRAGMENT_CLIENT = "client_fragment";
|
||||
@ -81,15 +101,17 @@ public class TunnelsContainer extends Fragment implements
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View v = inflater.inflate(R.layout.container_tunnels, container, false);
|
||||
|
||||
mViewPager = (ViewPager) v.findViewById(R.id.pager);
|
||||
mPageIndicator = (TitlePageIndicator) v.findViewById(R.id.page_indicator);
|
||||
mNewTunnel = (ImageButton) v.findViewById(R.id.promoted_action);
|
||||
mViewPager = v.findViewById(R.id.pager);
|
||||
mPageIndicator = v.findViewById(R.id.magic_indicator);
|
||||
|
||||
mNewTunnel = v.findViewById(R.id.promoted_action);
|
||||
mNewTunnel.setVisibility(showActions() ? View.VISIBLE : View.GONE);
|
||||
|
||||
// Initialize ViewPager adapter
|
||||
mFragPagerAdapter = new TunnelsPagerAdapter(getChildFragmentManager());
|
||||
mViewPager.setAdapter(mFragPagerAdapter);
|
||||
|
||||
if (v.findViewById(R.id.detail_fragment) != null) {
|
||||
// The detail container view will be present only in the
|
||||
// large-screen layouts (res/values-w720dp). If this view
|
||||
// is present, then the activity should be in two-pane mode.
|
||||
mTwoPane = true;
|
||||
}
|
||||
|
||||
@ -100,19 +122,22 @@ public class TunnelsContainer extends Fragment implements
|
||||
savedInstanceState, FRAGMENT_SERVER);
|
||||
}
|
||||
|
||||
setupMagicIndicator();
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
|
||||
// Initialize ViewPager and adapter
|
||||
mFragPagerAdapter = new TunnelsPagerAdapter(getChildFragmentManager());
|
||||
mViewPager.setAdapter(mFragPagerAdapter);
|
||||
|
||||
// Bind the page indicator to the pager.
|
||||
mPageIndicator.setViewPager(mViewPager);
|
||||
setupMagicIndicator();
|
||||
|
||||
// Setup New Tunnel button
|
||||
mNewTunnel.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
@ -270,9 +295,14 @@ public class TunnelsContainer extends Fragment implements
|
||||
// In two-pane mode, show the detail view in this activity by
|
||||
// adding or replacing the detail fragment using a
|
||||
// fragment transaction.
|
||||
TunnelDetailFragment detailFrag = TunnelDetailFragment.newInstance(tunnelId);
|
||||
getChildFragmentManager().beginTransaction()
|
||||
.replace(R.id.detail_fragment, detailFrag).commit();
|
||||
try {
|
||||
TunnelDetailFragment detailFrag = TunnelDetailFragment.newInstance(tunnelId);
|
||||
getChildFragmentManager().beginTransaction()
|
||||
.replace(R.id.detail_fragment, detailFrag)
|
||||
.commitNow(); // Use commitNow() to execute synchronously
|
||||
} catch (Exception e) {
|
||||
Log.e("TunnelsContainer", "Failed to update detail fragment", e);
|
||||
}
|
||||
} else {
|
||||
// In single-pane mode, simply start the detail activity
|
||||
// for the selected item ID.
|
||||
@ -311,4 +341,54 @@ public class TunnelsContainer extends Fragment implements
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void setupMagicIndicator() {
|
||||
if (mPageIndicator == null || getContext() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
CommonNavigator commonNavigator = new CommonNavigator(getContext());
|
||||
commonNavigator.setAdjustMode(true); // Add this line for better spacing
|
||||
commonNavigator.setAdapter(new CommonNavigatorAdapter() {
|
||||
@Override
|
||||
public int getCount() {
|
||||
return mFragPagerAdapter.getCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPagerTitleView getTitleView(Context context, final int index) {
|
||||
SimplePagerTitleView simplePagerTitleView = new ColorTransitionPagerTitleView(context);
|
||||
simplePagerTitleView.setText(mFragPagerAdapter.getPageTitle(index));
|
||||
simplePagerTitleView.setTextSize(16); // Add this line to increase text size
|
||||
simplePagerTitleView.setNormalColor(ContextCompat.getColor(context,
|
||||
R.color.primary_text_disabled_material_dark));
|
||||
simplePagerTitleView.setSelectedColor(ContextCompat.getColor(context,
|
||||
R.color.primary_text_default_material_dark));
|
||||
simplePagerTitleView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
mViewPager.setCurrentItem(index);
|
||||
}
|
||||
});
|
||||
return simplePagerTitleView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPagerIndicator getIndicator(Context context) {
|
||||
LinePagerIndicator indicator = new LinePagerIndicator(context);
|
||||
indicator.setMode(LinePagerIndicator.MODE_WRAP_CONTENT);
|
||||
indicator.setColors(ContextCompat.getColor(context, R.color.primary));
|
||||
indicator.setLineHeight(dpToPx(context, 3));
|
||||
return indicator;
|
||||
}
|
||||
});
|
||||
|
||||
mPageIndicator.setNavigator(commonNavigator);
|
||||
ViewPagerHelper.bind(mPageIndicator, mViewPager);
|
||||
}
|
||||
|
||||
private int dpToPx(Context context, int dp) {
|
||||
float density = context.getResources().getDisplayMetrics().density;
|
||||
return Math.round(dp * density);
|
||||
}
|
||||
}
|
||||
|
@ -3,11 +3,16 @@ package net.i2p.android.i2ptunnel.preferences;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.preference.CheckBoxPreference;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceCategory;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
//import android.support.v7.preference.CheckBoxPreference;
|
||||
import androidx.preference.CheckBoxPreference;
|
||||
//import android.support.v7.preference.Preference;
|
||||
import androidx.preference.Preference;
|
||||
//import android.support.v7.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
//import android.support.v7.preference.PreferenceScreen;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import net.i2p.android.i2ptunnel.util.TunnelLogic;
|
||||
import net.i2p.android.i2ptunnel.util.TunnelUtil;
|
||||
|
@ -2,9 +2,12 @@ package net.i2p.android.i2ptunnel.preferences;
|
||||
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceGroup;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
//import android.support.v7.preference.Preference;
|
||||
import androidx.preference.Preference;
|
||||
//import android.support.v7.preference.PreferenceGroup;
|
||||
import androidx.preference.PreferenceGroup;
|
||||
//import android.support.v7.preference.PreferenceScreen;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import android.widget.Toast;
|
||||
|
||||
import net.i2p.android.i2ptunnel.util.SaveTunnelTask;
|
||||
|
@ -2,10 +2,14 @@ package net.i2p.android.i2ptunnel.preferences;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
//import android.support.v7.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import net.i2p.android.i2ptunnel.TunnelDetailActivity;
|
||||
import net.i2p.android.i2ptunnel.TunnelDetailFragment;
|
||||
|
@ -1,9 +1,12 @@
|
||||
package net.i2p.android.i2ptunnel.preferences;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -5,13 +5,20 @@ import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.preference.CheckBoxPreference;
|
||||
import android.support.v7.preference.ListPreference;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceCategory;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
//import android.support.v7.preference.CheckBoxPreference;
|
||||
import androidx.preference.CheckBoxPreference;
|
||||
//import android.support.v7.preference.ListPreference;
|
||||
import androidx.preference.ListPreference;
|
||||
//import android.support.v7.preference.Preference;
|
||||
import androidx.preference.Preference;
|
||||
//import android.support.v7.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
//import android.support.v7.preference.PreferenceScreen;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import net.i2p.android.i2ptunnel.util.TunnelLogic;
|
||||
import net.i2p.android.i2ptunnel.util.TunnelUtil;
|
||||
|
@ -1,8 +1,10 @@
|
||||
package net.i2p.android.preferences;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v7.preference.Preference;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v7.preference.Preference;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
import net.i2p.android.router.SettingsActivity;
|
||||
|
@ -2,10 +2,14 @@ package net.i2p.android.preferences;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.preference.CheckBoxPreference;
|
||||
import android.support.v7.preference.PreferenceCategory;
|
||||
import android.support.v7.preference.PreferenceManager;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
//import android.support.v7.preference.CheckBoxPreference;
|
||||
import androidx.preference.CheckBoxPreference;
|
||||
//import android.support.v7.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
//import android.support.v7.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceManager;
|
||||
//import android.support.v7.preference.PreferenceScreen;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
import net.i2p.android.router.SettingsActivity;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.preferences;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
//import android.support.v7.preference.PreferenceScreen;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
import net.i2p.android.router.SettingsActivity;
|
||||
|
@ -4,10 +4,15 @@ import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.preference.CheckBoxPreference;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceManager;
|
||||
import android.support.v7.preference.PreferenceScreen;
|
||||
//import android.support.v7.preference.CheckBoxPreference;
|
||||
//import android.support.v7.preference.Preference;
|
||||
//import android.support.v7.preference.PreferenceManager;
|
||||
//import android.support.v7.preference.PreferenceScreen;
|
||||
import androidx.preference.CheckBoxPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import android.widget.Toast;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
|
@ -2,7 +2,8 @@ package net.i2p.android.preferences.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.support.v7.preference.EditTextPreference;
|
||||
//import android.support.v7.preference.EditTextPreference;
|
||||
import androidx.preference.EditTextPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.preferences.util;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.preference.EditTextPreferenceDialogFragmentCompat;
|
||||
//import android.support.v7.preference.EditTextPreferenceDialogFragmentCompat;
|
||||
import androidx.preference.EditTextPreferenceDialogFragmentCompat;
|
||||
import android.text.InputType;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
|
@ -1,8 +1,9 @@
|
||||
package net.i2p.android.preferences.util;
|
||||
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceFragmentCompat;
|
||||
//import android.support.v4.app.DialogFragment;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
|
||||
/**
|
||||
* Handles custom Preferences.
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.preferences.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v7.preference.EditTextPreference;
|
||||
//import android.support.v7.preference.EditTextPreference;
|
||||
import androidx.preference.EditTextPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
public class IntEditTextPreference extends EditTextPreference {
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.preferences.util;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.preference.EditTextPreferenceDialogFragmentCompat;
|
||||
//import android.support.v7.preference.EditTextPreferenceDialogFragmentCompat;
|
||||
import androidx.preference.EditTextPreferenceDialogFragmentCompat;
|
||||
import android.text.InputType;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.preferences.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v7.preference.ListPreference;
|
||||
//import android.support.v7.preference.ListPreference;
|
||||
import androidx.preference.ListPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
public class IntListPreference extends ListPreference {
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.preferences.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v7.preference.EditTextPreference;
|
||||
//import android.support.v7.preference.EditTextPreference;
|
||||
import androidx.preference.EditTextPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.preferences.util;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.preference.EditTextPreferenceDialogFragmentCompat;
|
||||
//import android.support.v7.preference.EditTextPreferenceDialogFragmentCompat;
|
||||
import androidx.preference.EditTextPreferenceDialogFragmentCompat;
|
||||
import android.text.InputType;
|
||||
import android.view.View;
|
||||
import android.widget.EditText;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.preferences.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v7.preference.EditTextPreference;
|
||||
//import android.support.v7.preference.EditTextPreference;
|
||||
import android.preference.EditTextPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
public class SummaryEditTextPreference extends EditTextPreference {
|
||||
|
@ -3,7 +3,8 @@ package net.i2p.android.router;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.app.Fragment;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import net.i2p.android.router.util.Util;
|
||||
import net.i2p.router.CommSystemFacade;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import net.i2p.android.I2PActivityBase;
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.ListFragment;
|
||||
//import android.support.v4.app.ListFragment;
|
||||
import androidx.fragment.app.ListFragment;
|
||||
import android.view.View;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ListView;
|
||||
|
@ -14,8 +14,10 @@ import android.os.Handler;
|
||||
import android.os.PowerManager;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.provider.Settings;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
//import android.support.v4.content.LocalBroadcastManager;
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import android.util.AndroidRuntimeException;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
@ -406,20 +408,21 @@ public class MainFragment extends I2PFragmentBase {
|
||||
//ctx.commSystem().getReachabilityStatus();
|
||||
|
||||
String status =
|
||||
"Exploratory Tunnels in/out: " + inEx + " / " + outEx
|
||||
+ "\nClient Tunnels in/out: " + inCl + " / " + outCl;
|
||||
getString(R.string.notification_status_expl, inEx, outEx) + '\n' +
|
||||
getString(R.string.notification_status_client, inCl, outCl);
|
||||
|
||||
|
||||
// Need to see if we have the participation option set to on.
|
||||
// I thought there was a router method for that? I guess not! WHY NOT?
|
||||
// It would be easier if we had a number to test status.
|
||||
String participate = "\nParticipation: " + tunnelStatus + " (" + part + ")";
|
||||
String participate = '\n' + getString(R.string.settings_label_hiddenMode) + ": " + tunnelStatus + " (" + part + ")";
|
||||
|
||||
String details =
|
||||
"\nMemory: " + DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())
|
||||
+ "B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B'
|
||||
+ "\nJob Lag: " + jobLag
|
||||
+ "\nMsg Delay: " + msgDelay;
|
||||
'\n' + getString(R.string.stats_memory) + ": " +
|
||||
DataHelper.formatSize(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) +
|
||||
"B / " + DataHelper.formatSize(Runtime.getRuntime().maxMemory()) + 'B' +
|
||||
'\n' + getString(R.string.stats_lag) + ": " + jobLag +
|
||||
'\n' + getString(R.string.stats_delay) + ": " + msgDelay;
|
||||
|
||||
_savedStatus = status + participate + details;
|
||||
vAdvStatusText.setText(_savedStatus);
|
||||
@ -661,7 +664,7 @@ public class MainFragment extends I2PFragmentBase {
|
||||
// even if an error occurs. http://trac.i2p2.i2p/ticket/2783
|
||||
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
|
||||
intent.setData(Uri.parse("package:" + packageName));
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
try {
|
||||
mContext.startActivity(intent);
|
||||
} catch (ActivityNotFoundException activityNotFound) {
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import net.i2p.android.I2PActivityBase;
|
||||
|
||||
|
@ -3,13 +3,20 @@ package net.i2p.android.router;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceFragmentCompat;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
//import android.support.v4.content.LocalBroadcastManager;
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||
//import android.support.v7.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
//import android.support.v7.preference.Preference;
|
||||
import androidx.preference.Preference;
|
||||
//import android.support.v7.preference.PreferenceFragmentCompat;
|
||||
import androidx.preference.PreferenceFragmentCompat;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import net.i2p.android.I2PActivity;
|
||||
import net.i2p.android.preferences.AdvancedPreferenceFragment;
|
||||
|
@ -1,8 +1,9 @@
|
||||
package net.i2p.android.router.addressbook;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router.addressbook;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v4.content.AsyncTaskLoader;
|
||||
//import android.support.v4.content.AsyncTaskLoader;
|
||||
import androidx.loader.content.AsyncTaskLoader;
|
||||
|
||||
import net.i2p.android.router.util.NamingServiceUtil;
|
||||
import net.i2p.android.router.util.Util;
|
||||
|
@ -6,9 +6,11 @@ import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v4.app.DialogFragment;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import net.i2p.android.wizard.model.AbstractWizardModel;
|
||||
import net.i2p.android.wizard.ui.AbstractWizardActivity;
|
||||
|
@ -4,7 +4,7 @@ import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import net.i2p.android.router.R;
|
||||
import net.i2p.android.wizard.model.AbstractWizardModel;
|
||||
import net.i2p.android.wizard.model.I2PB64DestinationPage;
|
||||
import net.i2p.android.wizard.model.I2PDestinationPage;
|
||||
import net.i2p.android.wizard.model.PageList;
|
||||
import net.i2p.android.wizard.model.SingleTextFieldPage;
|
||||
|
||||
@ -22,7 +22,7 @@ public class AddressbookAddWizardModel extends AbstractWizardModel {
|
||||
.setDescription(res.getString(R.string.addressbook_add_wizard_desc_name))
|
||||
.setRequired(true),
|
||||
|
||||
new I2PB64DestinationPage(this, res.getString(R.string.addressbook_add_wizard_k_destination))
|
||||
new I2PDestinationPage(this, res.getString(R.string.i2ptunnel_wizard_k_dest))
|
||||
.setDescription(res.getString(R.string.addressbook_add_wizard_desc_destination))
|
||||
.setRequired(true)
|
||||
);
|
||||
|
@ -6,13 +6,21 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentPagerAdapter;
|
||||
import android.support.v4.app.FragmentTransaction;
|
||||
import android.support.v4.view.MenuItemCompat;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.support.v7.widget.SearchView;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
//import android.support.v4.app.FragmentPagerAdapter;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
//import android.support.v4.app.FragmentTransaction;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
//import android.support.v4.view.MenuItemCompat;
|
||||
import androidx.core.view.MenuItemCompat;
|
||||
//import android.support.v4.view.ViewPager;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
//import android.support.v7.widget.SearchView;
|
||||
import androidx.appcompat.widget.SearchView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
@ -20,18 +28,27 @@ import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.viewpagerindicator.TitlePageIndicator;
|
||||
import net.lucode.hackware.magicindicator.MagicIndicator;
|
||||
import net.lucode.hackware.magicindicator.ViewPagerHelper;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
import net.i2p.android.router.util.NamingServiceUtil;
|
||||
import net.i2p.android.router.util.Util;
|
||||
import net.i2p.client.naming.NamingService;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.ColorTransitionPagerTitleView;
|
||||
import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.SimplePagerTitleView;
|
||||
|
||||
public class AddressbookContainer extends Fragment
|
||||
implements AddressbookFragment.OnAddressSelectedListener,
|
||||
SearchView.OnQueryTextListener {
|
||||
public static final int ADD_WIZARD_REQUEST = 1;
|
||||
public static final String ADD_WIZARD_DATA = "add_wizard_data";
|
||||
private MagicIndicator mPageIndicator;
|
||||
|
||||
/**
|
||||
* Whether or not the container is in two-pane mode, i.e. running on a tablet
|
||||
@ -41,7 +58,6 @@ public class AddressbookContainer extends Fragment
|
||||
|
||||
ViewPager mViewPager;
|
||||
FragmentPagerAdapter mFragPagerAdapter;
|
||||
|
||||
private static final String FRAGMENT_ROUTER = "router_fragment";
|
||||
private static final String FRAGMENT_PRIVATE = "private_fragment";
|
||||
private static final int FRAGMENT_ID_ROUTER = 0;
|
||||
@ -66,6 +82,17 @@ public class AddressbookContainer extends Fragment
|
||||
// activity should be in two-pane mode.
|
||||
mTwoPane = true;
|
||||
}
|
||||
|
||||
if (!mTwoPane) {
|
||||
// Initialize ViewPager and adapter first
|
||||
mViewPager = (ViewPager) v.findViewById(R.id.pager);
|
||||
mFragPagerAdapter = new AddressbookPagerAdapter(getActivity(), getChildFragmentManager());
|
||||
mViewPager.setAdapter(mFragPagerAdapter);
|
||||
|
||||
// Then set up MagicIndicator
|
||||
mPageIndicator = v.findViewById(R.id.magic_indicator);
|
||||
setupMagicIndicator();
|
||||
}
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
mRouterFrag = (AddressbookFragment) getChildFragmentManager().getFragment(
|
||||
@ -90,14 +117,6 @@ public class AddressbookContainer extends Fragment
|
||||
ft.commit();
|
||||
}
|
||||
|
||||
if (!mTwoPane) {
|
||||
mViewPager = (ViewPager) v.findViewById(R.id.pager);
|
||||
TitlePageIndicator pageIndicator = (TitlePageIndicator) v.findViewById(R.id.page_indicator);
|
||||
mFragPagerAdapter = new AddressbookPagerAdapter(getActivity(), getChildFragmentManager());
|
||||
mViewPager.setAdapter(mFragPagerAdapter);
|
||||
pageIndicator.setViewPager(mViewPager);
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
@ -250,4 +269,38 @@ public class AddressbookContainer extends Fragment
|
||||
if (mPrivateFrag != null)
|
||||
mPrivateFrag.filterAddresses(query);
|
||||
}
|
||||
|
||||
private void setupMagicIndicator() {
|
||||
if (mPageIndicator == null || mFragPagerAdapter == null || mViewPager == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
CommonNavigator commonNavigator = new CommonNavigator(getContext());
|
||||
commonNavigator.setAdapter(new CommonNavigatorAdapter() {
|
||||
@Override
|
||||
public int getCount() {
|
||||
return mFragPagerAdapter.getCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPagerTitleView getTitleView(Context context, int index) {
|
||||
SimplePagerTitleView titleView = new ColorTransitionPagerTitleView(context);
|
||||
titleView.setText(mFragPagerAdapter.getPageTitle(index));
|
||||
titleView.setNormalColor(ContextCompat.getColor(context, R.color.primary_text_disabled_material_dark));
|
||||
titleView.setSelectedColor(ContextCompat.getColor(context, R.color.primary_text_default_material_dark));
|
||||
titleView.setOnClickListener(v -> mViewPager.setCurrentItem(index));
|
||||
return titleView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPagerIndicator getIndicator(Context context) {
|
||||
LinePagerIndicator indicator = new LinePagerIndicator(context);
|
||||
indicator.setColors(ContextCompat.getColor(context, R.color.primary));
|
||||
return indicator;
|
||||
}
|
||||
});
|
||||
|
||||
mPageIndicator.setNavigator(commonNavigator);
|
||||
ViewPagerHelper.bind(mPageIndicator, mViewPager);
|
||||
}
|
||||
}
|
||||
|
@ -6,12 +6,18 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.Loader;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.LoaderManager;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
//import android.support.v4.content.Loader;
|
||||
import androidx.loader.content.Loader;
|
||||
//import android.support.v4.content.LocalBroadcastManager;
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||
//import android.support.v7.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
|
@ -2,8 +2,10 @@ package net.i2p.android.router.addressbook;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v7.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
|
@ -4,9 +4,11 @@ import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v4.app.DialogFragment;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import android.text.util.Linkify;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
@ -7,9 +7,11 @@ import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v4.app.DialogFragment;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import android.text.util.Linkify;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
@ -4,9 +4,11 @@ import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v4.app.DialogFragment;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
@ -3,9 +3,11 @@ package net.i2p.android.router.dialog;
|
||||
import android.app.Dialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v4.app.DialogFragment;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
import net.i2p.android.I2PActivityBase;
|
||||
import net.i2p.android.router.MainFragment;
|
||||
|
@ -3,7 +3,8 @@ package net.i2p.android.router.log;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router.log;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import net.i2p.android.I2PActivityBase;
|
||||
import net.i2p.android.router.R;
|
||||
|
@ -4,9 +4,12 @@ import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.ListFragment;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.Loader;
|
||||
//import android.support.v4.app.ListFragment;
|
||||
import androidx.fragment.app.ListFragment;
|
||||
//import android.support.v4.app.LoaderManager;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
//import android.support.v4.content.Loader;
|
||||
import androidx.loader.content.Loader;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router.log;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v4.content.AsyncTaskLoader;
|
||||
//import android.support.v4.content.AsyncTaskLoader;
|
||||
import androidx.loader.content.AsyncTaskLoader;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
|
||||
|
@ -2,8 +2,10 @@ package net.i2p.android.router.netdb;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
|
@ -2,7 +2,8 @@ package net.i2p.android.router.netdb;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import net.i2p.android.I2PActivityBase;
|
||||
import net.i2p.android.router.R;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router.netdb;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v4.content.AsyncTaskLoader;
|
||||
//import android.support.v4.content.AsyncTaskLoader;
|
||||
import androidx.loader.content.AsyncTaskLoader;
|
||||
|
||||
import net.i2p.android.router.util.Util;
|
||||
import net.i2p.data.Destination;
|
||||
|
@ -2,9 +2,12 @@ package net.i2p.android.router.netdb;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.ListFragment;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.Loader;
|
||||
//import android.support.v4.app.ListFragment;
|
||||
import androidx.fragment.app.ListFragment;
|
||||
//import android.support.v4.app.LoaderManager;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
//import android.support.v4.content.Loader;
|
||||
import androidx.loader.content.Loader;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router.netdb;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v4.content.AsyncTaskLoader;
|
||||
//import android.support.v4.content.AsyncTaskLoader;
|
||||
import androidx.loader.content.AsyncTaskLoader;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
import net.i2p.data.Hash;
|
||||
|
@ -1,12 +1,18 @@
|
||||
package net.i2p.android.router.netdb;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentStatePagerAdapter;
|
||||
import android.support.v4.app.LoaderManager;
|
||||
import android.support.v4.content.Loader;
|
||||
import android.support.v4.view.ViewPager;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
//import android.support.v4.app.FragmentStatePagerAdapter;
|
||||
import androidx.fragment.app.FragmentStatePagerAdapter;
|
||||
//import android.support.v4.app.LoaderManager;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
//import android.support.v4.content.Loader;
|
||||
import androidx.loader.content.Loader;
|
||||
//import android.support.v4.view.ViewPager;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router.netdb;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -0,0 +1,23 @@
|
||||
package net.i2p.android.router.receiver;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.widget.Toast;
|
||||
|
||||
import net.i2p.android.router.service.RouterService;
|
||||
import net.i2p.android.router.util.Util;
|
||||
|
||||
public class RemoteStartReceiver extends BroadcastReceiver {
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if(Util.getRouterContext() == null){
|
||||
Intent rsIntent = new Intent(context, RouterService.class);
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){
|
||||
context.startForegroundService(rsIntent);
|
||||
} else {
|
||||
context.startService(rsIntent);
|
||||
}
|
||||
Toast.makeText(context, "Starting I2P Router", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
}
|
@ -4,7 +4,10 @@ import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import net.i2p.android.I2PActivity;
|
||||
import net.i2p.android.I2PActivityBase;
|
||||
@ -22,6 +25,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
|
||||
/**
|
||||
* Implements SAMSecureSessionInterface on Android platforms using a Toast
|
||||
* as the interactive channel.
|
||||
@ -45,12 +49,35 @@ public class AndroidSAMSecureSession extends AppCompatActivity implements SAMSec
|
||||
results.put(clientId, 1);
|
||||
}
|
||||
|
||||
public AndroidSAMSecureSession(Context ctx, RouterService rCtx, StatusBar statusBar) {
|
||||
private AndroidSAMSecureSession(Context ctx, RouterService rCtx, StatusBar statusBar) {
|
||||
mCtx = ctx;
|
||||
_routerService = rCtx;
|
||||
_statusBar = statusBar;
|
||||
}
|
||||
|
||||
public static AndroidSAMSecureSession create(Context ctx, RouterService rCtx, StatusBar statusBar) {
|
||||
if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
|
||||
// We're on the main thread, create directly
|
||||
return new AndroidSAMSecureSession(ctx, rCtx, statusBar);
|
||||
} else {
|
||||
// We're not on the main thread, post to main thread
|
||||
final AndroidSAMSecureSession[] result = new AndroidSAMSecureSession[1];
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
result[0] = new AndroidSAMSecureSession(ctx, rCtx, statusBar);
|
||||
latch.countDown();
|
||||
});
|
||||
|
||||
try {
|
||||
latch.await();
|
||||
return result[0];
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException("Failed to create AndroidSAMSecureSession", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void waitForResult(String clientId) {
|
||||
for (int i=0;i<60;i++) {
|
||||
try {
|
||||
@ -94,10 +121,20 @@ public class AndroidSAMSecureSession extends AppCompatActivity implements SAMSec
|
||||
bundle.putBoolean("approveSAMConnection", true);
|
||||
bundle.putString("ID", clientId);
|
||||
intent.putExtras(bundle);
|
||||
PendingIntent pendingIntent = PendingIntent.getActivity(
|
||||
mCtx, 7656,
|
||||
intent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT, bundle);
|
||||
PendingIntent pendingIntent;
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
|
||||
pendingIntent = PendingIntent.getActivity(
|
||||
mCtx, 7656,
|
||||
intent,
|
||||
PendingIntent.FLAG_MUTABLE,
|
||||
bundle);
|
||||
} else {
|
||||
pendingIntent = PendingIntent.getActivity(
|
||||
mCtx, 7656,
|
||||
intent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT,
|
||||
bundle);
|
||||
}
|
||||
String dlgText = mCtx.getString(R.string.settings_confirm_sam) + "\n";//""</br>";
|
||||
dlgText += mCtx.getString(R.string.settings_confirm_sam_id) + clientId + "\n";//""</br>";
|
||||
dlgText += mCtx.getString(R.string.settings_confirm_allow_sam) + "\n";//""</br>";
|
||||
|
@ -180,7 +180,8 @@ class LoadClientsJob extends JobImpl {
|
||||
try {
|
||||
Util.i("Starting the SAM API");
|
||||
Looper.prepare();
|
||||
AndroidSAMSecureSession _androidSecureSession = new AndroidSAMSecureSession(mCtx, _routerService, _statusBar);
|
||||
//AndroidSAMSecureSession _androidSecureSession = new AndroidSAMSecureSession(mCtx, _routerService, _statusBar);
|
||||
AndroidSAMSecureSession _androidSecureSession = AndroidSAMSecureSession.create(mCtx, _routerService, _statusBar);
|
||||
SAMSecureSessionInterface _secureSession = _androidSecureSession;
|
||||
SAM_BRIDGE = new SAMBridge("127.0.0.1",
|
||||
7656,
|
||||
|
@ -1,5 +1,7 @@
|
||||
package net.i2p.android.router.service;
|
||||
|
||||
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE;
|
||||
|
||||
import android.app.Service;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
@ -12,7 +14,8 @@ import android.os.IBinder;
|
||||
import android.os.Message;
|
||||
import android.os.RemoteCallbackList;
|
||||
import android.os.RemoteException;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
//import android.support.v4.content.LocalBroadcastManager;
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||
|
||||
import net.i2p.android.router.R;
|
||||
import net.i2p.android.router.receiver.I2PReceiver;
|
||||
@ -173,11 +176,18 @@ public class RouterService extends Service {
|
||||
// We need to *not* check if we're restarting on Android greater than Oreo due to
|
||||
// changes in how notifications work and the use of NotificationChannels.
|
||||
if(!restart) {
|
||||
startForeground(1337, _statusBar.getNote());
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||
startForeground(1337, _statusBar.getNote(), FOREGROUND_SERVICE_TYPE_SPECIAL_USE);
|
||||
} else {
|
||||
startForeground(1337, _statusBar.getNote());
|
||||
}
|
||||
} else {
|
||||
if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
||||
startForeground(1337, _statusBar.getNote());
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||
startForeground(1337, _statusBar.getNote(), FOREGROUND_SERVICE_TYPE_SPECIAL_USE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -7,7 +7,8 @@ import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
//import android.support.v4.app.NotificationCompat;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
import android.view.Gravity;
|
||||
import android.widget.Toast;
|
||||
|
||||
@ -71,7 +72,18 @@ class StatusBar {
|
||||
private PendingIntent pendingIntent() {
|
||||
Intent intent = new Intent(mCtx, I2PActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
PendingIntent pi = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
PendingIntent pi = null;
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
|
||||
pi = PendingIntent.getActivity(mCtx,
|
||||
0,
|
||||
intent,
|
||||
PendingIntent.FLAG_MUTABLE);
|
||||
} else {
|
||||
pi = PendingIntent.getActivity(mCtx,
|
||||
0,
|
||||
intent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
}
|
||||
return pi;
|
||||
}
|
||||
|
||||
@ -129,6 +141,7 @@ class StatusBar {
|
||||
mNotificationManager.createNotificationChannel(mNotificationChannel);
|
||||
mNotificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
|
||||
mNotifyBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
|
||||
//
|
||||
}
|
||||
mNotif = mNotifyBuilder.build();
|
||||
mNotificationManager.notify(ID, mNotif);
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router.stats;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import net.i2p.android.I2PActivityBase;
|
||||
import net.i2p.android.router.R;
|
||||
|
@ -3,8 +3,10 @@ package net.i2p.android.router.stats;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
//import android.support.v7.app.AlertDialog;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
//import android.support.v7.widget.Toolbar;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
|
@ -3,7 +3,7 @@ package net.i2p.android.router.stats;
|
||||
import android.graphics.Color;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.support.annotation.NonNull;
|
||||
import androidx.annotation.NonNull;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.router.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v4.content.AsyncTaskLoader;
|
||||
//import android.support.v4.content.AsyncTaskLoader;
|
||||
import androidx.loader.content.AsyncTaskLoader;
|
||||
|
||||
public abstract class BetterAsyncTaskLoader<T> extends AsyncTaskLoader<T> {
|
||||
protected T mData;
|
||||
|
@ -46,16 +46,36 @@ public class NamingServiceUtil {
|
||||
String displayHost = host.equals(hostName) ? hostName :
|
||||
hostName + " (" + host + ')';
|
||||
|
||||
String destB64 = data.getBundle(kDest).getString(Page.SIMPLE_DATA_KEY);
|
||||
Destination dest = new Destination();
|
||||
try {
|
||||
dest.fromBase64(destB64);
|
||||
} catch (DataFormatException e) {} // Already validated
|
||||
|
||||
String dest = data.getBundle(kDest).getString(Page.SIMPLE_DATA_KEY).split(":")[0];
|
||||
Destination destination = new Destination();
|
||||
if (dest.endsWith(".b32.i2p")) {
|
||||
NamingService dns = NamingServiceUtil.getNamingService(Util.getRouterContext(),"");
|
||||
destination = dns.lookup(dest);
|
||||
int i = 0;
|
||||
while (destination == null) {
|
||||
dns = NamingServiceUtil.getNamingService(Util.getRouterContext(),"");
|
||||
destination = dns.lookup(dest);
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
i++;
|
||||
if (i > 500){
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
destination.fromBase64(dest);
|
||||
} catch (DataFormatException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
// Check if already in addressbook
|
||||
Destination oldDest = ns.lookup(host);
|
||||
if (oldDest != null) {
|
||||
if (destB64.equals(oldDest.toBase64()))
|
||||
if (destination.toBase64().equals(oldDest.toBase64()))
|
||||
Toast.makeText(ctx,
|
||||
"Host name " + displayHost + " is already in address book, unchanged.",
|
||||
Toast.LENGTH_LONG).show();
|
||||
@ -65,7 +85,7 @@ public class NamingServiceUtil {
|
||||
Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
// Put the new host name
|
||||
success = ns.put(host, dest);
|
||||
success = ns.put(host, destination);
|
||||
if (!success)
|
||||
Toast.makeText(ctx,
|
||||
"Failed to add Destination " + displayHost + " to naming service " + ns.getName(),
|
||||
|
@ -8,7 +8,8 @@ import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
//import android.support.v4.app.NotificationCompat;
|
||||
import androidx.core.app.NotificationCompat;
|
||||
|
||||
public class Notifications {
|
||||
private final Context mCtx;
|
||||
@ -53,7 +54,12 @@ public class Notifications {
|
||||
if (c != null) {
|
||||
Intent intent = new Intent(mCtx, c);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
PendingIntent pi = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
PendingIntent pi;
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
|
||||
pi = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_MUTABLE);
|
||||
} else {
|
||||
pi = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
}
|
||||
b.setContentIntent(pi);
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,8 @@ import android.content.DialogInterface;
|
||||
import android.graphics.Bitmap;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.support.v4.app.Fragment;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.webkit.HttpAuthHandler;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.util;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import androidx.annotation.NonNull;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -1,7 +1,9 @@
|
||||
package net.i2p.android.util;
|
||||
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentActivity;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
public class FragmentUtils {
|
||||
public interface TwoPaneProvider {
|
||||
|
@ -1,8 +1,11 @@
|
||||
package net.i2p.android.util;
|
||||
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentPagerAdapter;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
//import android.support.v4.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
//import android.support.v4.app.FragmentPagerAdapter;
|
||||
import androidx.fragment.app.FragmentPagerAdapter;
|
||||
import android.util.SparseArray;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
|
@ -21,8 +21,10 @@ import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
//import android.support.v7.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
|
||||
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
|
||||
|
@ -23,7 +23,8 @@ import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.NinePatchDrawable;
|
||||
import android.support.v4.view.ViewCompat;
|
||||
//import android.support.v4.view.ViewCompat;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
package net.i2p.android.widget;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
|
@ -19,8 +19,10 @@ package net.i2p.android.widget;
|
||||
import android.content.Context;
|
||||
import android.graphics.Typeface;
|
||||
import android.os.Build;
|
||||
import android.support.v4.view.PagerAdapter;
|
||||
import android.support.v4.view.ViewPager;
|
||||
//import android.support.v4.view.PagerAdapter;
|
||||
import androidx.viewpager.widget.PagerAdapter;
|
||||
//import android.support.v4.view.ViewPager;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.SparseArray;
|
||||
import android.util.TypedValue;
|
||||
|
@ -18,7 +18,8 @@ package net.i2p.android.wizard.model;
|
||||
|
||||
import net.i2p.android.wizard.ui.SingleChoiceFragment;
|
||||
|
||||
import android.support.v4.app.Fragment;
|
||||
//import android.support.v4.app.Fragment;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user