Skip to content

Commit 8e4d08f

Browse files
[AppOnly] Run coversion in a separate process
1 parent d0c11d7 commit 8e4d08f

6 files changed

Lines changed: 87 additions & 41 deletions

File tree

application/app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ dependencies {
4747

4848
implementation 'androidx.appcompat:appcompat:1.4.0'
4949
implementation 'androidx.activity:activity:1.4.0'
50+
5051
implementation 'androidx.work:work-runtime:2.7.1'
52+
implementation 'androidx.work:work-multiprocess:2.7.1'
53+
implementation 'androidx.concurrent:concurrent-futures:1.1.0'
5154

5255
// AboutLibraries-v10 requires AndroidSDK-21
5356
implementation "com.mikepenz:aboutlibraries:8.9.4"

application/app/src/main/AndroidManifest.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,23 @@
44
package="com.viliussutkus89.android.pdf2htmlex.application">
55

66
<application
7+
android:name=".pdf2htmlEXapplication"
78
android:icon="@mipmap/ic_launcher"
89
android:label="@string/app_name"
910
android:roundIcon="@mipmap/ic_launcher_round"
1011
android:supportsRtl="true"
1112
android:theme="@style/Theme.MyApplication">
1213

14+
<provider
15+
android:name="androidx.startup.InitializationProvider"
16+
android:authorities="${applicationId}.androidx-startup"
17+
tools:node="remove" />
18+
19+
<service
20+
android:name=".ConverterWorkerRemoteService"
21+
android:exported="false"
22+
android:process=":converterWorkerProcess" />
23+
1324
<activity
1425
android:name=".MainActivity"
1526
android:exported="true">

application/app/src/main/java/com/viliussutkus89/android/pdf2htmlex/application/ConverterActivity.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* ConverterActivity.java
33
*
4-
* Copyright (C) 2021 Vilius Sutkus'89
4+
* Copyright (C) 2021, 2022 Vilius Sutkus '89 <ViliusSutkus89@gmail.com>
55
*
66
* This program is free software: you can redistribute it and/or modify
77
* it under the terms of the GNU General Public License as published by
@@ -19,6 +19,9 @@
1919

2020
package com.viliussutkus89.android.pdf2htmlex.application;
2121

22+
import static androidx.work.multiprocess.RemoteListenableWorker.ARGUMENT_CLASS_NAME;
23+
import static androidx.work.multiprocess.RemoteListenableWorker.ARGUMENT_PACKAGE_NAME;
24+
2225
import android.content.Intent;
2326
import android.net.Uri;
2427
import android.os.Bundle;
@@ -95,6 +98,9 @@ else if (Intent.ACTION_SEND.equals(action)) {
9598
if (null == m_workRequestId) {
9699
WorkRequest converterWork = new OneTimeWorkRequest.Builder(ConverterWorker.class)
97100
.setInputData(new Data.Builder()
101+
.putString(ARGUMENT_PACKAGE_NAME, getPackageName())
102+
.putString(ARGUMENT_CLASS_NAME, ConverterWorkerRemoteService.class.getName())
103+
98104
.putString(ConverterWorker.INPUT__URI, inputUri.toString())
99105
.putString(ConverterWorker.INPUT__DESTINATION_DIR, outputDir.getAbsolutePath())
100106
.build())

application/app/src/main/java/com/viliussutkus89/android/pdf2htmlex/application/ConverterWorker.java

Lines changed: 44 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* ConverterWorker.java
33
*
4-
* Copyright (C) 2021 Vilius Sutkus'89
4+
* Copyright (C) 2021, 2022 Vilius Sutkus '89 <ViliusSutkus89@gmail.com>
55
*
66
* This program is free software: you can redistribute it and/or modify
77
* it under the terms of the GNU General Public License as published by
@@ -24,11 +24,13 @@
2424
import android.net.Uri;
2525

2626
import androidx.annotation.NonNull;
27+
import androidx.concurrent.futures.CallbackToFutureAdapter;
2728
import androidx.work.Data;
2829
import androidx.work.WorkInfo;
29-
import androidx.work.Worker;
3030
import androidx.work.WorkerParameters;
31+
import androidx.work.multiprocess.RemoteListenableWorker;
3132

33+
import com.google.common.util.concurrent.ListenableFuture;
3234
import com.viliussutkus89.android.pdf2htmlex.pdf2htmlEX;
3335

3436
import java.io.File;
@@ -37,7 +39,7 @@
3739
import java.io.InputStream;
3840
import java.io.OutputStream;
3941

40-
public class ConverterWorker extends Worker {
42+
public class ConverterWorker extends RemoteListenableWorker {
4143
public static final String INPUT__URI = "input__uri";
4244
public static final String INPUT__DESTINATION_DIR = "input__destination_dir";
4345
public static final String OUTPUT__URI = "output__uri";
@@ -75,49 +77,51 @@ public static Progress getProgress(@NonNull WorkInfo workInfo) {
7577

7678
@NonNull
7779
@Override
78-
public Result doWork() {
79-
final Uri inputUri = Uri.parse(getInputData().getString(INPUT__URI));
80-
if (null == inputUri) {
81-
return Result.failure();
82-
}
80+
public ListenableFuture<Result> startRemoteWork() {
81+
return CallbackToFutureAdapter.getFuture(completer -> {
82+
final Uri inputUri = Uri.parse(getInputData().getString(INPUT__URI));
83+
if (null == inputUri) {
84+
return completer.set(Result.failure());
85+
}
8386

84-
final pdf2htmlEX converter = new pdf2htmlEX(getApplicationContext());
85-
if (isStopped()) {
86-
return Result.failure();
87-
}
87+
final pdf2htmlEX converter = new pdf2htmlEX(getApplicationContext());
88+
if (isStopped()) {
89+
return completer.set(Result.failure());
90+
}
8891

89-
setProgress(Progress.COPYING_INPUT);
90-
final File inputFileInCache = copyUriToCache(getApplicationContext(), inputUri);
91-
if (null == inputFileInCache) {
92-
return Result.failure();
93-
}
92+
setProgress(Progress.COPYING_INPUT);
93+
final File inputFileInCache = copyUriToCache(getApplicationContext(), inputUri);
94+
if (null == inputFileInCache) {
95+
return completer.set(Result.failure());
96+
}
9497

95-
try {
96-
setProgress(Progress.CONVERTING);
98+
try {
99+
setProgress(Progress.CONVERTING);
97100

98-
if (isStopped()) {
99-
return Result.failure();
100-
}
101-
File outputFile = converter.convert(inputFileInCache);
102-
103-
String destinationDirStr = getInputData().getString(INPUT__DESTINATION_DIR);
104-
if (null != destinationDirStr) {
105-
final File destinationDir = new File(destinationDirStr);
106-
destinationDir.mkdir();
107-
final File outputFileInDestinationDir = generateNewFileInCache(destinationDir, outputFile.getName());
108-
if (null == outputFileInDestinationDir || !outputFile.renameTo(outputFileInDestinationDir)) {
109-
outputFile.delete();
110-
return Result.failure();
101+
if (isStopped()) {
102+
return completer.set(Result.failure());
103+
}
104+
File outputFile = converter.convert(inputFileInCache);
105+
106+
String destinationDirStr = getInputData().getString(INPUT__DESTINATION_DIR);
107+
if (null != destinationDirStr) {
108+
final File destinationDir = new File(destinationDirStr);
109+
destinationDir.mkdir();
110+
final File outputFileInDestinationDir = generateNewFileInCache(destinationDir, outputFile.getName());
111+
if (null == outputFileInDestinationDir || !outputFile.renameTo(outputFileInDestinationDir)) {
112+
outputFile.delete();
113+
return completer.set(Result.failure());
114+
}
115+
outputFile = outputFileInDestinationDir;
111116
}
112-
outputFile = outputFileInDestinationDir;
113-
}
114117

115-
return Result.success(new Data.Builder().putString(OUTPUT__URI, outputFile.getAbsolutePath()).build());
116-
} catch (pdf2htmlEX.ConversionFailedException | IOException e) {
117-
return Result.failure();
118-
} finally {
119-
inputFileInCache.delete();
120-
}
118+
return completer.set(Result.success(new Data.Builder().putString(OUTPUT__URI, outputFile.getAbsolutePath()).build()));
119+
} catch (pdf2htmlEX.ConversionFailedException | IOException e) {
120+
return completer.set(Result.failure());
121+
} finally {
122+
inputFileInCache.delete();
123+
}
124+
});
121125
}
122126

123127
private static File generateNewFileInCache(File cacheDir, String filename) {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.viliussutkus89.android.pdf2htmlex.application;
2+
3+
import androidx.work.multiprocess.RemoteWorkerService;
4+
5+
public class ConverterWorkerRemoteService extends RemoteWorkerService {
6+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.viliussutkus89.android.pdf2htmlex.application;
2+
3+
import android.app.Application;
4+
5+
import androidx.annotation.NonNull;
6+
import androidx.work.Configuration;
7+
8+
public class pdf2htmlEXapplication extends Application implements Configuration.Provider {
9+
@NonNull
10+
@Override
11+
public Configuration getWorkManagerConfiguration() {
12+
return new Configuration.Builder()
13+
.setDefaultProcessName(getPackageName())
14+
.build();
15+
}
16+
}

0 commit comments

Comments
 (0)