add okhttpclient

This commit is contained in:
Brenton Bostick
2023-07-18 10:46:52 -04:00
parent 97364a6d7f
commit e001bba1df
42 changed files with 1176 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
zerotier.properties
+3
View File
@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml
+1
View File
@@ -0,0 +1 @@
ZeroTier Sockets Android OkHttp client
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.8.20-release" />
</component>
</project>
+9
View File
@@ -0,0 +1,9 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../" vcs="" />
</component>
</project>
+1
View File
@@ -0,0 +1 @@
/build
+46
View File
@@ -0,0 +1,46 @@
plugins {
id 'com.android.application'
}
// Creates a variable called zerotierPropertiesFile, and initializes it to the
// zerotier.properties file.
def zerotierPropertiesFile = rootProject.file("zerotier.properties")
// Initializes a new Properties() object called zerotierProperties.
def zerotierProperties = new Properties()
// Loads the zerotier.properties file into the zerotierProperties object.
zerotierProperties.load(new FileInputStream(zerotierPropertiesFile))
android {
namespace 'com.zerotier.sockets.okhttpclient'
compileSdk 33
defaultConfig {
applicationId "com.zerotier.sockets.okhttpclient"
minSdk 24
targetSdk 33
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation files(zerotierProperties['libzt.aar'])
implementation('com.squareup.okhttp3:okhttp:5.0.0-alpha.11')
}
+21
View File
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ZeroTierSocketsAndroidOkHttpExample"
tools:targetApi="31"
android:usesCleartextTraffic="true" >
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
@@ -0,0 +1,327 @@
package com.zerotier.sockets;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.channels.SocketChannel;
import javax.net.SocketFactory;
public class ZeroTierSocketsSocketFactory extends SocketFactory {
String remoteAddr;
int port;
public ZeroTierSocketsSocketFactory(String remoteAddr, int port) {
this.remoteAddr = remoteAddr;
this.port = port;
}
@Override
public Socket createSocket() throws IOException, UnknownHostException {
return new SocketProxy(remoteAddr, port);
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
throw new RuntimeException("Unimplemented");
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
throw new RuntimeException("Unimplemented");
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
throw new RuntimeException("Unimplemented");
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
throw new RuntimeException("Unimplemented");
}
static class SocketProxy extends Socket {
String remoteAddr;
int port;
//
// creating new ZeroTierSocket() tries to connect immediately,
// so delay creating ZeroTierSocket() until connect()
//
ZeroTierSocket sock;
public SocketProxy(String remoteAddr, int port) {
// Socket logic
this.remoteAddr = remoteAddr;
this.port = port;
}
@Override
public void bind(SocketAddress bindpoint) {
throw new RuntimeException("Unimplemented");
}
@Override
public void close() throws IOException {
//
// called by OkHttp
//
if (sock != null) {
sock.close();
}
}
@Override
public void connect(SocketAddress endpoint) {
throw new RuntimeException("Unimplemented");
}
@Override
public void connect(SocketAddress endpoint, int timeout) throws IOException {
//
// called by OkHttp
//
//
// endpoint is something like: www.example.com/93.184.216.34:80
//
//
// timeout is something like 10000
//
sock = new ZeroTierSocket(remoteAddr, port, timeout);
}
@Override
public SocketChannel getChannel() {
throw new RuntimeException("Unimplemented");
}
@Override
public InetAddress getInetAddress() {
throw new RuntimeException("Unimplemented");
}
@Override
public InputStream getInputStream() throws SocketException {
//
// called by OkHttp
//
return sock.getInputStream();
}
@Override
public boolean getKeepAlive() {
throw new RuntimeException("Unimplemented");
}
@Override
public InetAddress getLocalAddress() {
throw new RuntimeException("Unimplemented");
}
@Override
public int getLocalPort() {
throw new RuntimeException("Unimplemented");
}
@Override
public SocketAddress getLocalSocketAddress() {
throw new RuntimeException("Unimplemented");
}
@Override
public boolean getOOBInline() {
throw new RuntimeException("Unimplemented");
}
@Override
public OutputStream getOutputStream() throws SocketException {
//
// called by OkHttp
//
return sock.getOutputStream();
}
@Override
public int getPort() {
throw new RuntimeException("Unimplemented");
}
@Override
public int getReceiveBufferSize() {
throw new RuntimeException("Unimplemented");
}
@Override
public SocketAddress getRemoteSocketAddress() {
throw new RuntimeException("Unimplemented");
}
@Override
public boolean getReuseAddress() {
throw new RuntimeException("Unimplemented");
}
@Override
public int getSendBufferSize() {
throw new RuntimeException("Unimplemented");
}
@Override
public int getSoLinger() {
throw new RuntimeException("Unimplemented");
}
@Override
public int getSoTimeout() {
throw new RuntimeException("Unimplemented");
}
@Override
public boolean getTcpNoDelay() {
throw new RuntimeException("Unimplemented");
}
@Override
public int getTrafficClass() {
throw new RuntimeException("Unimplemented");
}
@Override
public boolean isBound() {
throw new RuntimeException("Unimplemented");
}
@Override
public boolean isClosed() {
//
// called by OkHttp
//
return sock == null || sock.isClosed();
}
@Override
public boolean isConnected() {
throw new RuntimeException("Unimplemented");
}
@Override
public boolean isInputShutdown() {
//
// called by OkHttp
//
return sock == null || sock.inputStreamHasBeenShutdown();
}
@Override
public boolean isOutputShutdown() {
//
// called by OkHttp
//
return sock == null || sock.outputStreamHasBeenShutdown();
}
@Override
public void sendUrgentData(int data) {
throw new RuntimeException("Unimplemented");
}
@Override
public void setKeepAlive(boolean on) {
throw new RuntimeException("Unimplemented");
}
@Override
public void setOOBInline(boolean on) {
throw new RuntimeException("Unimplemented");
}
@Override
public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
throw new RuntimeException("Unimplemented");
}
@Override
public void setReceiveBufferSize(int size) {
throw new RuntimeException("Unimplemented");
}
@Override
public void setReuseAddress(boolean on) {
throw new RuntimeException("Unimplemented");
}
@Override
public void setSendBufferSize(int size) {
throw new RuntimeException("Unimplemented");
}
@Override
public void setSoLinger(boolean on, int linger) {
throw new RuntimeException("Unimplemented");
}
@Override
public void setSoTimeout(int timeout) throws SocketException {
//
// called by OkHttp
//
if (sock == null) {
return;
}
sock.setSoTimeout(timeout);
}
@Override
public void setTcpNoDelay(boolean on) {
throw new RuntimeException("Unimplemented");
}
@Override
public void setTrafficClass(int tc) {
throw new RuntimeException("Unimplemented");
}
@Override
public void shutdownInput() {
throw new RuntimeException("Unimplemented");
}
@Override
public void shutdownOutput() {
throw new RuntimeException("Unimplemented");
}
@Override
public String toString() {
return "proxy(" + (sock == null ? "" : sock.toString()) + ")";
}
}
}
@@ -0,0 +1,80 @@
package com.zerotier.sockets.okhttpclient
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.zerotier.sockets.ZeroTierNative
import com.zerotier.sockets.ZeroTierNode
import com.zerotier.sockets.ZeroTierSocketsSocketFactory
import okhttp3.Call
import okhttp3.Callback
import okhttp3.MediaType
import okhttp3.OkHttpClient
import okhttp3.OkHttpClient.Builder.build
import okhttp3.OkHttpClient.Builder.socketFactory
import okhttp3.Request
import okhttp3.Request.Builder.build
import okhttp3.Request.Builder.post
import okhttp3.Request.Builder.url
import okhttp3.RequestBody
import okhttp3.Response
import java.io.IOException
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val ctxt = this.applicationContext
val storagePath = ctxt.filesDir.absolutePath
val nwid = "0123456789abcdef".toLong(16)
val remoteAddr = "10.147.19.67"
val port = 8080
// ZeroTier setup
val node = ZeroTierNode()
node.initFromStorage(storagePath)
node.start()
//
// NOTE: This is demo code and waiting on main thread is not recommended
//
Log.d(TAG, "Waiting for node to come online...")
while (!node.isOnline) {
ZeroTierNative.zts_util_delay(50)
}
Log.d(TAG, "Node ID: " + String.format("%010x", node.id))
Log.d(TAG, "Joining network...")
node.join(nwid)
Log.d(TAG, "Waiting for network...")
while (!node.isNetworkTransportReady(nwid)) {
ZeroTierNative.zts_util_delay(50)
}
Log.d(TAG, "Joined")
// Socket logic
val plain: MediaType = parse.parse("text/plain; charset=utf-8")
val client: OkHttpClient = Builder()
.socketFactory(ZeroTierSocketsSocketFactory(remoteAddr, port))
.build()
val postBody = "Hello from OkHttp!"
val request: Request = Builder()
.url("http://www.example.com")
.post(RequestBody.create(plain, postBody))
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Log.d(TAG, "FAILURE!!")
Log.d(TAG, e.message, e)
}
@Throws(IOException::class)
override fun onResponse(call: Call, response: Response) {
Log.d(TAG, "RESPONSE!!")
Log.d(TAG, response.toString())
}
})
}
companion object {
private const val TAG = "MainActivity"
}
}
@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

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