Compare commits

...

84 Commits

Author SHA1 Message Date
f2b8b0950a Merge branch 'master' of i2pgit.org:I2P_Developers/i2p.android.base
Some checks failed
Sync Primary Repository to GitHub Mirror / sync (push) Has been cancelled
Java CI / build (push) Has been cancelled
Java CI / trunk (push) Has been cancelled
Java Signed CI / build-signed (push) Has been cancelled
Java Signed CI / trunk-signed (push) Has been cancelled
2025-06-03 13:25:01 -04:00
fa668711bf Release I2P 2.9.0
Some checks failed
Java CI / build (push) Has been cancelled
Java CI / trunk (push) Has been cancelled
Release / build (push) Has been cancelled
Java Signed CI / build-signed (push) Has been cancelled
Java Signed CI / trunk-signed (push) Has been cancelled
2025-06-03 13:16:20 -04:00
f06e0e1ca8 Add github sync for i2p.android.base
Some checks failed
Java CI / build (push) Failing after 3s
Java CI / trunk (push) Failing after 4s
Java Signed CI / build-signed (push) Failing after 3s
Java Signed CI / trunk-signed (push) Failing after 3s
Sync Primary Repository to GitHub Mirror / sync (push) Has been cancelled
2025-05-10 18:51:17 -04:00
d25aa29fee disable git sync job
Some checks failed
Java CI / build (push) Has been cancelled
Java CI / trunk (push) Has been cancelled
Java Signed CI / build-signed (push) Has been cancelled
Java Signed CI / trunk-signed (push) Has been cancelled
2025-04-27 00:11:30 -04:00
48d9afea41 tag new version 2025-04-19 11:06:46 -04:00
da4ed503c8 add magicindicator license 2025-03-21 18:18:32 -04:00
78a0a2b5f4 bump test 2025-03-18 14:47:24 -04:00
42202cc4d2 Fix exploratory tunnel fragment crash 2025-03-18 14:22:46 -04:00
49f4562bf7 Revert "force it into landscape mode for now until I can fix tunnel display in portrait mode"
This reverts commit 96bb2cf161.
2025-03-18 14:08:13 -04:00
ca6031ab47 update changelog 2025-03-18 14:06:58 -04:00
6c83285e04 Increment version numbers 2025-03-15 14:28:22 -04:00
96bb2cf161 force it into landscape mode for now until I can fix tunnel display in portrait mode 2025-03-15 14:25:22 -04:00
ddb2482623 Fixes tunnel listing in landscape mode bot not in portrait mode 2025-03-14 18:28:53 -04:00
bf2dea5e0a Merge branch 'master' of i2pgit.org:i2p-hackers/i2p.android.base into i2p-android-2.8.0-androidx 2025-03-14 16:22:28 -04:00
2d784dbef2 fix crashes in landscape mode 2025-03-10 19:29:53 -04:00
554a65987b Fix the SAM lifecycle error. Migrate the other MagicIndicator components 2025-03-10 18:40:29 -04:00
846795dea6 Update the whole thing to use Androidx and MagicIndicator because it's marginally more comprehensible than trying to get ViewPageIndicator 2.4.4 to compile 2025-03-10 17:35:47 -04:00
7a22ce4bee Add new version of CustomViewPager.java 2025-03-05 21:48:23 -05:00
0e25d89bd8 Finish most migrating to androidx. Dependency issues remain 2025-03-05 21:46:18 -05:00
61010b2c93 migrating to androidx 2025-03-05 21:12:15 -05:00
zzz
5fac82a915 pull translations from tx 2024-11-26 12:33:56 -05:00
zzz
c8c36540eb Add complete Gan Chinese translation 2024-11-26 12:32:12 -05:00
59b1da6950 Fix version number and re-create tag 2024-10-16 18:51:39 -04:00
40894d8d04 Fix version number and re-create tag 2024-10-16 18:50:38 -04:00
d0f38397cd Fix version number and re-create tag 2024-10-16 18:48:59 -04:00
17b86fffdd Fix version number and re-create tag 2024-10-16 18:48:19 -04:00
a06b449bfb Fix permissions, Fix ForegroundService on Android>=34, remove all TitlePageIndicators. 2024-10-16 14:01:56 -04:00
128f1df0ac update gradle plugin version 2024-10-11 18:09:43 -04:00
ed085194e6 Update for GPlay compliance issues 2024-10-11 18:06:56 -04:00
52a4c2f430 Increment version code 2024-10-11 17:46:39 -04:00
784918d220 Update libraries and fix unit test 2024-10-11 17:44:07 -04:00
f129773255 Merge branch 'master' of i2pgit.org:i2p-hackers/i2p.android.base 2024-10-11 15:46:46 -04:00
b304771eca Update build.gradle and I2P dependencies, move es_rAR to es-rAR 2024-10-11 15:45:12 -04:00
f87e8d036b Release: bump I2P version, I2P for Android version, and Build Number 2024-07-18 15:31:05 -04:00
zzz
16c1277935 Add new translation: Argentinian Spanish 2024-07-14 10:25:40 -04:00
zzz
a6aa76f9dd Pull translations from tx 2024-06-10 17:55:27 -04:00
zzz
a0ced4133d Pull translations from tx 2024-05-16 09:23:37 -04:00
e024950567 Update pull translation instructions 2024-05-16 09:09:28 -04:00
ea68f116e1 Increment build 2024-05-15 20:04:41 -04:00
3cb746594c Fix url text 2024-05-05 10:23:46 -04:00
27adae63eb Update forum URLs 2024-05-05 10:11:45 -04:00
85890d3b68 update CI files 2024-04-29 20:49:41 -04:00
96b045eb2a update CI files 2024-04-29 20:45:05 -04:00
8d00c5fa31 fix sync CI file 2024-04-29 20:28:08 -04:00
fc93a71552 Use CI to sync with gitlab 2024-04-29 18:59:34 -04:00
18e4aef4ca I2P for Android 2.5.0 2024-04-08 23:31:40 -04:00
5315e35adc I2P for Android 2.5.0 2024-04-08 23:23:24 -04:00
9ad9bc07ff Fix keystore name to produce signed build 2024-04-06 23:18:15 -04:00
bde92be29d Fix keystore path to produce signed build 2024-04-06 23:13:25 -04:00
849150ffa6 list keystore location at final step of CI so I can fix properties file 2024-04-06 23:08:51 -04:00
52dad19c7a list keystore location at final step of CI so I can fix properties file 2024-04-06 23:03:52 -04:00
e84a51097d fix base64 decode syntax 2024-04-05 16:13:54 -04:00
5289f5068a fix base64 decode syntax 2024-04-05 16:10:02 -04:00
09c7d9cfd8 fix base64 decode syntax 2024-04-05 16:06:12 -04:00
14d293fe6f Move keystore directory to runner user 2024-04-05 16:01:37 -04:00
7cd08cfd4c Assure keystore directory exists 2024-04-05 15:58:05 -04:00
aa22d83a44 fix syntax error 2024-04-05 15:10:11 -04:00
a1fd8d41b2 fix syntax error 2024-04-05 15:09:13 -04:00
9d24e68b57 remove secrets from sign.yml 2024-04-05 15:02:42 -04:00
d5e2804ea4 fix secret access to sign.yml 2024-04-05 14:58:33 -04:00
1edabd7252 fix secret access to sign.yml 2024-04-05 14:56:42 -04:00
52c1901eba fix secret access to sign.yml 2024-04-05 14:55:41 -04:00
a6f5221975 add secret access to sign.yml 2024-04-05 14:52:41 -04:00
caa57bbc3a add secret access to sign.yml 2024-04-05 14:51:34 -04:00
b28e5d741e add secret access to sign.yml 2024-04-05 14:50:20 -04:00
0f3a61390c fix typo in sign.yml 2024-04-05 14:46:58 -04:00
30a1f1d800 Create signing keys for dev-build specific builds 2024-04-05 14:41:38 -04:00
22d5d126f6 Create signing keys for dev-build specific builds 2024-04-05 14:36:18 -04:00
70e4ea810f Attempt signed CI builds(will fail right now) 2024-04-03 15:38:53 -04:00
b5c6e1489a Attempt signed CI builds(will fail right now) 2024-04-03 15:37:35 -04:00
333a1a49b1 Attempt CI builds 2024-04-03 15:26:58 -04:00
2ea93f106e unzip only tagged apk 2024-03-25 15:05:28 -04:00
d99ed0e5da Reduce timeout for release uploader 2024-03-25 14:53:34 -04:00
3881966ddb see if I can get trunk builds to work 2024-03-25 14:46:55 -04:00
9de9f46489 when a release is tagged copy over artifacts 2024-03-25 14:30:17 -04:00
149881522e specify a tag for non-trunk CI builds 2024-03-25 14:25:52 -04:00
df26d89310 attempt a trunk build too 2024-03-25 14:18:37 -04:00
707dcbbc78 create local.properties for routerjars 2024-03-25 14:08:25 -04:00
812aea9873 clone i2p.i2p in CI 2024-03-25 14:04:49 -04:00
aeb7614b62 clone i2p.i2p in CI 2024-03-25 14:00:30 -04:00
9bf9d27c5a use Java 11 in CI 2024-03-25 13:58:07 -04:00
f2cfe4cee5 start a CI build of the Android APK 2024-03-25 13:55:38 -04:00
45865ff5b9 Increment version code and upload to GPlay 2023-12-19 13:45:24 -05:00
96f9905952 Update I2P library version to 2.4.0 2023-12-19 13:44:04 -05:00
155 changed files with 2297 additions and 386 deletions

73
.github/workflows/ant.yml vendored Normal file
View 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
View 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
View 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
View 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: {}

View File

@ -1,6 +1,6 @@
[main]
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
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
[o:otf:p:I2P:r:android]
file_filter = app/src/main/res/values-<lang>/strings.xml

View File

@ -1,3 +1,30 @@
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

View File

@ -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

View File

@ -33,7 +33,7 @@ translation.
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.)
@ -76,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 -f` 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

View File

@ -1,14 +1,16 @@
apply plugin: 'com.android.application'
repositories {
mavenLocal()
mavenCentral()
jcenter()
maven { url 'https://jitpack.io' }
}
android {
namespace 'net.i2p.android.router'
compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
defaultConfig {
versionCode 4745279
versionCode Integer.parseInt(project.I2P_ANDROID_VERSION_CODE as String)
versionName "$I2P_ANDROID_VERSION"
minSdkVersion 21
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION as String)
@ -64,28 +66,34 @@ android {
}
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'
@ -93,9 +101,30 @@ dependencies {
}
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')

View File

@ -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());
}
}
}

View File

@ -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" />
@ -29,7 +30,10 @@
android:icon="@drawable/ic_launcher_itoopie"
android:enabled="true"
android:exported="true"
android:label="@string/app_name">
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>

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View 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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -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 {

View File

@ -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;

View File

@ -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 {

View File

@ -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;

View File

@ -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;

View File

@ -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 {

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 {

View File

@ -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,

View File

@ -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);
}
}

View File

@ -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;
@ -140,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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 {

View File

@ -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;

View File

@ -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 {

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -2,7 +2,8 @@ package net.i2p.android.wizard.model;
import java.util.Locale;
import android.support.v4.app.Fragment;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
import net.i2p.I2PAppContext;
import net.i2p.android.wizard.ui.I2PDestinationFragment;

View File

@ -18,7 +18,8 @@ package net.i2p.android.wizard.model;
import net.i2p.android.wizard.ui.MultipleChoiceFragment;
import android.support.v4.app.Fragment;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
import java.util.ArrayList;

View File

@ -18,7 +18,8 @@
package net.i2p.android.wizard.model;
import android.os.Bundle;
import android.support.v4.app.Fragment;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
import java.util.ArrayList;
import java.util.List;

View File

@ -20,7 +20,8 @@ import java.util.ArrayList;
import net.i2p.android.wizard.ui.SingleBooleanFragment;
import android.support.v4.app.Fragment;
//import android.support.v4.app.Fragment;
import androidx.fragment.app.Fragment;
public class SingleFixedBooleanPage extends Page {
protected String mDesc = "";

View File

@ -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;

View File

@ -18,7 +18,8 @@ package net.i2p.android.wizard.model;
import net.i2p.android.wizard.ui.SingleTextFieldFragment;
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