Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' of github.com:ooni/probe-android into xoonirun
Browse files Browse the repository at this point in the history
aanorbel committed Oct 31, 2023
2 parents c152544 + 7792106 commit 21e5ebb
Showing 110 changed files with 2,278 additions and 1,560 deletions.
1 change: 0 additions & 1 deletion NOTICE
Original file line number Diff line number Diff line change
@@ -19,7 +19,6 @@ Terms: https://firebase.google.com/terms/

- easypermissions
- LocalhostToolkit
- butterknife
- DBFlow
- LocalhostToolkit
- MarkdownView
151 changes: 69 additions & 82 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
apply plugin: 'com.android.application'
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
apply from: 'jacoco.gradle'
apply plugin: 'org.jetbrains.kotlin.android'

android {
compileSdk 34
compileSdk libs.versions.compileSdk.get().toInteger()
ndkVersion '22.0.7026061'

defaultConfig {
applicationId 'org.openobservatory.ooniprobe'
minSdk 21
targetSdk 34
versionName '3.8.3'
versionCode 102
defaultConfig {
applicationId 'org.openobservatory.ooniprobe'
minSdk libs.versions.minSdk.get().toInteger()
targetSdk libs.versions.targetSdk.get().toInteger()
versionName '3.8.4'
versionCode 106
testInstrumentationRunner "org.openobservatory.ooniprobe.TestAndroidJUnitRunner"
buildConfigField 'String', 'OONI_API_BASE_URL', '"https://api.ooni.io/"'
buildConfigField 'String', 'NOTIFICATION_SERVER', '"https://countly.ooni.io"'
resValue "string", "APP_ID", 'org.openobservatory.ooniprobe'
resValue "string", "APP_NAME", "OONI Probe"
buildConfigField 'String', 'SOFTWARE_NAME', 'BASE_SOFTWARE_NAME+IS_DEBUG'
buildConfigField 'String', 'COUNTLY_KEY', '"146836f41172f9e3287cab6f2cc347de3f5ddf3b"'
@@ -42,18 +46,6 @@ android {
}
}

// Shared test code between Unit and Instrumented tests
sourceSets {
androidTest {
java.srcDirs += "src/sharedTest/java"
resources.srcDirs += "src/sharedTest/resources"
}
test {
java.srcDirs += "src/sharedTest/java"
resources.srcDirs += "src/sharedTest/resources"
}
}

flavorDimensions 'testing', 'license'
productFlavors {
stable {
@@ -66,6 +58,7 @@ android {
versionNameSuffix "-beta.1"
versionCode versionCodeDate()
buildConfigField 'String', 'BASE_SOFTWARE_NAME', '"ooniprobe-android-dev"'
resValue "string", "APP_ID", 'org.openobservatory.ooniprobe.dev'
resValue "string", "APP_NAME", "OONI Dev"
buildConfigField 'String', 'COUNTLY_KEY', '"e6c2cfe53e85951d50567467cef3f9fa2eab32c3"'
}
@@ -75,6 +68,7 @@ android {
versionNameSuffix "-experimental.1"
versionCode versionCodeDate()
buildConfigField 'String', 'BASE_SOFTWARE_NAME', '"ooniprobe-android-experimental"'
resValue "string", "APP_ID", 'org.openobservatory.ooniprobe.experimental'
resValue "string", "APP_NAME", "OONI Exp"
buildConfigField 'String', 'COUNTLY_KEY', '"e6c2cfe53e85951d50567467cef3f9fa2eab32c3"'
}
@@ -109,86 +103,79 @@ dependencies {
implementation project(path: ':engine')

// AndroidX
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.lifecycle:lifecycle-process:2.5.1'
implementation 'androidx.preference:preference:1.2.0'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'
implementation 'com.google.guava:guava:30.1.1-android'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation libs.androidx.appcompat
implementation libs.androidx.constraintlayout
implementation libs.androidx.lifecycle.process
implementation libs.androidx.preference
implementation libs.androidx.localbroadcastmanager
implementation libs.androidx.legacy.support.v4

// Google
implementation libs.google.material
implementation libs.google.guava
implementation libs.google.gson

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
// WorkManager dependency
implementation 'androidx.work:work-runtime:2.8.1'

// Third-party
annotationProcessor 'com.github.Raizlabs.DBFlow:dbflow-processor:4.2.4'
implementation 'com.github.Raizlabs.DBFlow:dbflow-core:4.2.4'
implementation 'com.github.Raizlabs.DBFlow:dbflow:4.2.4'

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
annotationProcessor libs.dbflow.processor
implementation libs.dbflow.core
implementation libs.dbflow.lib

implementation libs.retrofit.lib
implementation libs.retrofit.converter.gson
implementation libs.retrofit.logging.interceptor

implementation 'com.jakewharton:butterknife:10.2.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'

implementation 'com.github.xanscale.LocalhostToolkit:app:19.05.01'
implementation 'com.airbnb.android:lottie:3.0.7'
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'ru.noties:markwon:2.0.1'
implementation 'commons-io:commons-io:2.6'
//arcview to fragment_dashboard
implementation 'com.github.florent37:shapeofview:1.3.2'
implementation libs.xanscale.localhost.toolkit
implementation libs.lottie
implementation libs.markwon
implementation libs.commons.io
//arcview to fragment_dashboard
implementation libs.shapeofview

// Flavor
fullImplementation platform('com.google.firebase:firebase-bom:26.3.0')
fullImplementation 'com.google.firebase:firebase-messaging'
fullImplementation 'ly.count.android:sdk:21.11.0'
fullImplementation 'io.sentry:sentry-android:6.3.0'
fullImplementation 'com.google.android.play:core:1.10.3'
fullImplementation platform(libs.google.firebase.bom)
fullImplementation libs.google.firebase.messaging
fullImplementation libs.countly.sdk
fullImplementation libs.sentry.android
fullImplementation libs.google.play.core

// Dependency Injection
implementation 'com.google.dagger:dagger:2.36'
annotationProcessor 'com.google.dagger:dagger-compiler:2.36'
implementation libs.google.dagger
annotationProcessor libs.google.dagger.compiler

// Logger
implementation project(':applogger')

// Testing
// Unit Testing
testImplementation 'junit:junit:4.13.2'
testImplementation 'androidx.test:core:1.4.0'
testImplementation 'androidx.test:runner:1.4.0'
testImplementation 'androidx.test:rules:1.4.0'
testImplementation 'org.mockito:mockito-core:4.6.1'
testImplementation 'org.mockito:mockito-inline:4.6.1'
testImplementation 'org.robolectric:robolectric:4.5.1'
testImplementation 'com.github.blocoio:faker:1.2.8'
testImplementation 'org.ooni:oonimkall:2023.07.18-162729'
testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.36'

// Instrumentation Testing
androidTestImplementation 'tools.fastlane:screengrab:2.0.0'
androidTestImplementation 'com.github.blocoio:faker:1.2.8'
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test:rules:1.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.4.0'
androidTestImplementation('androidx.test.espresso:espresso-contrib:3.4.0') {
exclude group: 'com.android.support', module: 'appcompat'
exclude group: 'com.android.support', module: 'support-v4'
exclude module: 'recyclerview-v7'
}
androidTestImplementation('androidx.test.espresso:espresso-core:3.4.0') {
exclude group: 'com.android.support', module: 'appcompat'
exclude group: 'com.android.support', module: 'support-v4'
exclude module: 'recyclerview-v7'
}
androidTestImplementation('com.schibsted.spain:barista:3.9.0')
androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:2.36"
// Unit Testing
testImplementation project(':shared-test')
testImplementation libs.junit4
testImplementation libs.androidx.core
testImplementation libs.androidx.runner
testImplementation libs.androidx.rules
testImplementation libs.mockito.core
testImplementation libs.mockito.inline
testImplementation libs.robolectric
testImplementation libs.faker
testImplementation libs.ooni.oonimkall
testAnnotationProcessor libs.google.dagger.compiler

// Instrumentation Testing
androidTestImplementation project(':shared-test')
androidTestImplementation libs.fastlane.screengrab
androidTestImplementation libs.faker
androidTestImplementation libs.androidx.runner
androidTestImplementation libs.androidx.rules
androidTestImplementation libs.androidx.junit
androidTestImplementation libs.androidx.espresso.intents
androidTestImplementation libs.androidx.espresso.contrib
androidTestImplementation libs.androidx.espresso.core
androidTestImplementation libs.barista
androidTestAnnotationProcessor libs.google.dagger.compiler
}

static def versionCodeDate() {
2 changes: 1 addition & 1 deletion app/jacoco.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
apply plugin: 'jacoco'

jacoco {
toolVersion '0.8.5'
toolVersion libs.versions.jacoco.get().toString()
}

task jacocoAndroidTestReport(type: JacocoReport) {
6 changes: 0 additions & 6 deletions app/src/dev/res/values/untranslatable.xml

This file was deleted.

6 changes: 0 additions & 6 deletions app/src/experimental/res/values/untranslatable.xml

This file was deleted.

12 changes: 9 additions & 3 deletions app/src/fdroid/res/xml/preferences_global.xml
Original file line number Diff line number Diff line change
@@ -355,7 +355,9 @@
app:iconSpaceReserved="false"
android:key="logs"
android:title="@string/Settings_Advanced_RecentLogs">
<intent android:action="@string/preference_intent_log_activity" />
<intent
android:targetPackage="@string/APP_ID"
android:targetClass="@string/preference_intent_log_activity"/>
</PreferenceScreen>
<SwitchPreferenceCompat
android:defaultValue="false"
@@ -378,7 +380,9 @@
android:icon="@drawable/proxy"
android:key="@string/ooni_backend_proxy"
android:title="@string/Settings_Proxy_Label">
<intent android:action="@string/preference_intent_proxy_activity" />
<intent
android:targetPackage="@string/APP_ID"
android:targetClass="@string/preference_intent_proxy_activity"/>
</PreferenceScreen>
<PreferenceScreen
android:icon="@drawable/send_email"
@@ -388,6 +392,8 @@
android:icon="@drawable/about_ooni"
android:key="@string/about_ooni"
android:title="@string/Settings_About_Label">
<intent android:action="@string/preference_intent_about_ooni" />
<intent
android:targetPackage="@string/APP_ID"
android:targetClass="@string/preference_intent_about_ooni" />
</PreferenceScreen>
</PreferenceScreen>
4 changes: 2 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />

<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
@@ -204,7 +204,7 @@
<service
android:name=".common.service.RunTestService"
android:icon="@drawable/notification_icon"
android:foregroundServiceType="specialUse"
android:foregroundServiceType="dataSync"
android:label="@string/Dashboard_Card_Run"/>
<service
android:name=".common.service.RunTestJobService"
Original file line number Diff line number Diff line change
@@ -1,55 +1,42 @@
package org.openobservatory.ooniprobe.activity;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;

import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;

import localhost.toolkit.app.fragment.ConfirmDialogFragment;
import org.openobservatory.ooniprobe.R;
import org.openobservatory.ooniprobe.common.PreferenceManager;
import org.openobservatory.ooniprobe.databinding.ActivityCustomwebsiteBinding;
import org.openobservatory.ooniprobe.model.database.Url;
import org.openobservatory.ooniprobe.test.suite.WebsitesSuite;

import javax.inject.Inject;
import java.io.Serializable;
import java.util.ArrayList;

import javax.inject.Inject;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import localhost.toolkit.app.fragment.ConfirmDialogFragment;

public class CustomWebsiteActivity extends AbstractActivity implements ConfirmDialogFragment.OnConfirmedListener {
@BindView(R.id.urlContainer)
LinearLayout urlContainer;
@BindView(R.id.bottomBar)
Toolbar bottomBar;
private ArrayList<EditText> editTexts;
private ArrayList<ImageButton> deletes;

@Inject
PreferenceManager preferenceManager;
private ActivityCustomwebsiteBinding binding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivityComponent().inject(this);
setContentView(R.layout.activity_customwebsite);
ButterKnife.bind(this);
binding = ActivityCustomwebsiteBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
editTexts = new ArrayList<>();
deletes = new ArrayList<>();
bottomBar.inflateMenu(R.menu.run);
bottomBar.setOnMenuItemClickListener(item -> {
binding.bottomBar.inflateMenu(R.menu.run);
binding.bottomBar.setOnMenuItemClickListener(item -> {
if (!checkPrefix())
return false;
ArrayList<String> urls = new ArrayList<>(editTexts.size());
@@ -66,6 +53,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
RunningActivity.runAsForegroundService(CustomWebsiteActivity.this, suite.asArray(), this::finish, preferenceManager);
return true;
});
binding.add.setOnClickListener(v -> add());
add();
}

@@ -103,12 +91,11 @@ public boolean onSupportNavigateUp() {
return true;
}

@OnClick(R.id.add)
void add() {
ViewGroup urlBox = (ViewGroup) getLayoutInflater().inflate(R.layout.edittext_url, urlContainer, false);
ViewGroup urlBox = (ViewGroup) getLayoutInflater().inflate(R.layout.edittext_url, binding.urlContainer, false);
EditText editText = urlBox.findViewById(R.id.editText);
editTexts.add(editText);
urlContainer.addView(urlBox);
binding.urlContainer.addView(urlBox);
ImageButton delete = urlBox.findViewById(R.id.delete);
deletes.add(delete);
delete.setTag(editText);
@@ -117,11 +104,11 @@ void add() {
((View) v.getParent()).setVisibility(View.GONE);
editTexts.remove(tag);
deletes.remove(v);
bottomBar.setTitle(getString(R.string.OONIRun_URLs, Integer.toString(editTexts.size())));
binding.bottomBar.setTitle(getString(R.string.OONIRun_URLs, Integer.toString(editTexts.size())));
setVisibilityDelete();
});
setVisibilityDelete();
bottomBar.setTitle(getString(R.string.OONIRun_URLs, Integer.toString(editTexts.size())));
binding.bottomBar.setTitle(getString(R.string.OONIRun_URLs, Integer.toString(editTexts.size())));
}

private void setVisibilityDelete() {
Loading

0 comments on commit 21e5ebb

Please sign in to comment.