Skip to content

Commit

Permalink
汐洛绞架内核以游离态拉起 #71
Browse files Browse the repository at this point in the history
  • Loading branch information
Soltus committed Jun 4, 2024
1 parent 457a0c8 commit 5df166f
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 46 deletions.
39 changes: 9 additions & 30 deletions app/src/main/java/org/b3log/siyuan/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.work.OneTimeWorkRequest;
import androidx.work.OutOfQuotaPolicy;
import androidx.work.WorkManager;

import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.KeyboardUtils;
Expand All @@ -86,6 +89,7 @@
import org.b3log.siyuan.appUtils.HWs;
import org.b3log.siyuan.services.BootService;
import org.b3log.siyuan.services.FloatingWindowService;
import org.b3log.siyuan.workers.SyncDataWorker;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
Expand Down Expand Up @@ -923,35 +927,10 @@ public void RestartSiyuanInWebview() {
}
}

private static boolean syncing;

public static void startSyncData() {
new Thread(MainActivity::syncData).start();
}

public static void syncData() {
try {
if (syncing) {
Log.i("sync", "data is syncing...");
return;
}
syncing = true;

final AsyncHttpPost req = new com.koushikdutta.async.http.AsyncHttpPost("http://127.0.0.1:58131/api/sync/performSync");
req.setBody(new JSONObjectBody(new JSONObject().put("mobileSwitch", true)));
AsyncHttpClient.getDefaultInstance().executeJSONObject(req,
new com.koushikdutta.async.http.AsyncHttpClient.JSONObjectCallback() {
@Override
public void onCompleted(Exception e, com.koushikdutta.async.http.AsyncHttpResponse source, JSONObject result) {
if (null != e) {
Utils.LogError("sync", "data sync failed", e);
}
}
});
} catch (final Throwable e) {
Utils.LogError("sync", "data sync failed", e);
} finally {
syncing = false;
}
public void startSyncData() {
OneTimeWorkRequest syncDataWork = new OneTimeWorkRequest.Builder(SyncDataWorker.class)
// .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) // 加急工作。如果配额允许,它将立即开始在后台运行。但是可能会在 Android 12 上抛出运行时异常,并且在启动受到限制时可能会抛出异常。
.build();
WorkManager.getInstance(this).enqueue(syncDataWork);
}
}
67 changes: 51 additions & 16 deletions app/src/main/java/org/b3log/siyuan/services/BootService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ import android.util.Log
import android.webkit.ValueCallback
import android.webkit.WebView
import androidx.core.app.ActivityCompat
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequest
import androidx.work.WorkManager
import com.blankj.utilcode.util.ServiceUtils
import com.blankj.utilcode.util.ThreadUtils.runOnUiThread
import com.koushikdutta.async.AsyncServer
Expand All @@ -34,6 +39,7 @@ import org.apache.commons.io.FileUtils
import org.apache.commons.io.filefilter.DirectoryFileFilter
import org.apache.commons.io.filefilter.TrueFileFilter
import org.b3log.siyuan.Utils
import org.b3log.siyuan.workers.SyncDataWorker
import org.json.JSONArray
import org.json.JSONObject
import sc.windom.sofill.S
Expand All @@ -45,6 +51,7 @@ import java.net.ServerSocket
import java.nio.charset.StandardCharsets
import java.util.Locale
import java.util.TimeZone
import java.util.concurrent.TimeUnit
import java.util.function.Consumer

class BootService : Service() {
Expand Down Expand Up @@ -77,6 +84,7 @@ class BootService : Service() {
override fun onBind(intent: Intent): IBinder {
return binder
}

inner class LocalBinder : Binder() {
fun getService(): BootService = this@BootService
}
Expand All @@ -90,6 +98,8 @@ class BootService : Service() {
Log.w(TAG, "onStart() -> startKernel() invoked")
startKernel()

// 周期同步数据
scheduleSyncDataWork()
}

private fun init_webView() {
Expand Down Expand Up @@ -173,11 +183,17 @@ class BootService : Service() {
if (isServable) {
// 绑定所有网卡以便通过局域网IP访问
s.listen(null, serverPort, server!!.listenCallback)
Log.w(TAG, "startHttpServer() -> HTTP server is listening on all interfaces, port [$serverPort]")
Log.w(
TAG,
"startHttpServer() -> HTTP server is listening on all interfaces, port [$serverPort]"
)
} else {
// 绑定 ipv6 回环地址 [::1] 以防止被远程访问
s.listen(InetAddress.getLoopbackAddress(), serverPort, server!!.listenCallback)
Log.w(TAG, "startHttpServer() -> HTTP server is listening on loopback address, port [$serverPort]")
Log.w(
TAG,
"startHttpServer() -> HTTP server is listening on loopback address, port [$serverPort]"
)
}
Log.w(TAG, "startHttpServer() -> HTTP server is listening on port [$serverPort]")
Utils.LogInfo("http", "HTTP server is listening on port [$serverPort]")
Expand Down Expand Up @@ -280,6 +296,7 @@ class BootService : Service() {
}
return ret
}

private fun initAppAssets() {
if (needUnzipAssets()) {
val dataDir = filesDir.absolutePath
Expand Down Expand Up @@ -312,21 +329,22 @@ class BootService : Service() {
*/
fun showWifi(activity: Activity) {
Log.d(TAG, "showWifi() invoked")
val locationPermissionObservable = Observable.create { emitter: ObservableEmitter<Boolean> ->
if (ActivityCompat.checkSelfPermission(
activity,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
) {
emitter.onNext(true)
} else {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
S.REQUEST_LOCATION
)
val locationPermissionObservable =
Observable.create { emitter: ObservableEmitter<Boolean> ->
if (ActivityCompat.checkSelfPermission(
activity,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
) {
emitter.onNext(true)
} else {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
S.REQUEST_LOCATION
)
}
}
}
val overlayPermissionObservable = Observable.create { emitter: ObservableEmitter<Boolean> ->
if (Settings.canDrawOverlays(activity)) {
emitter.onNext(true)
Expand Down Expand Up @@ -376,4 +394,21 @@ class BootService : Service() {
}
)
}

private fun scheduleSyncDataWork() {
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // 确保在网络连接时运行
.setRequiresBatteryNotLow(true) // 低电量时不运行
.build()
// 可以定义的最短重复间隔是 15 分钟
val periodicWorkRequest = PeriodicWorkRequest.Builder(SyncDataWorker::class.java, 15, TimeUnit.MINUTES)
.setConstraints(constraints)
.build()

WorkManager.getInstance(this).enqueueUniquePeriodicWork(
"SyncDataWork",
ExistingPeriodicWorkPolicy.KEEP, // 如果已经存在,则保持
periodicWorkRequest
)
}
}
50 changes: 50 additions & 0 deletions app/src/main/java/org/b3log/siyuan/workers/SyncDataWorker.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.b3log.siyuan.workers

import android.content.Context
import android.util.Log
import androidx.work.Worker
import androidx.work.WorkerParameters
import com.koushikdutta.async.http.AsyncHttpClient
import com.koushikdutta.async.http.AsyncHttpPost
import com.koushikdutta.async.http.AsyncHttpResponse
import com.koushikdutta.async.http.body.JSONObjectBody
import org.b3log.siyuan.Utils
import org.json.JSONObject
import java.util.concurrent.atomic.AtomicBoolean

class SyncDataWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
private val TAG = "workers/SyncDataWorker.kt"
override fun doWork(): Result {
// 实现数据同步的逻辑
syncData()
// 返回Result.success()表示工作成功完成
return Result.success()
}
// 虑在多线程环境中的同步问题。可以使用AtomicBoolean来确保同步状态的更新是原子的
private val syncing = AtomicBoolean(false)

private fun syncData() {
try {
if (syncing.get()) {
Log.i(TAG, "data is syncing...")
return
}
syncing.set(true)

val req = AsyncHttpPost("http://127.0.0.1:58131/api/sync/performSync")
req.setBody(JSONObjectBody(JSONObject().put("mobileSwitch", true)))
AsyncHttpClient.getDefaultInstance().executeJSONObject(req, object :
AsyncHttpClient.JSONObjectCallback() {
override fun onCompleted(e: Exception?, source: AsyncHttpResponse, result: JSONObject) {
if (e != null) {
Utils.LogError(TAG, "data sync failed", e)
}
}
})
} catch (e: Throwable) {
Utils.LogError(TAG, "data sync failed", e)
} finally {
syncing.set(false)
}
}
}

0 comments on commit 5df166f

Please sign in to comment.