Skip to content
This repository was archived by the owner on Mar 12, 2026. It is now read-only.

Commit d577180

Browse files
authored
Merge pull request #41 from l3ger0j/unstable
`FixMe!` Second package of fixes
2 parents 185f934 + da7ac5d commit d577180

File tree

8 files changed

+59
-54
lines changed

8 files changed

+59
-54
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ android {
1212
applicationId "org.qp.android"
1313
minSdkVersion 26
1414
targetSdkVersion 34
15-
versionCode 202202
16-
versionName "3.22.2"
15+
versionCode 202203
16+
versionName "3.22.3"
1717
resourceConfigurations += ['en', 'ru']
1818
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1919
}

app/src/main/java/org/qp/android/QuestPlayerApplication.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class QuestPlayerApplication extends Application {
2222

2323
private final ImageProvider imageProvider = new ImageProvider();
2424
private final HtmlProcessor htmlProcessor = new HtmlProcessor(imageProvider);
25-
private final AudioPlayer audioPlayer = new AudioPlayer();
25+
private final AudioPlayer audioPlayer = new AudioPlayer(this);
2626
private final LibQpProxyImpl libQspProxy = new LibQpProxyImpl(this , htmlProcessor , audioPlayer);
2727

2828
private DocumentFile currentGameDir;
@@ -38,7 +38,7 @@ public void setCurrentGameDir(DocumentFile currentGameDir) {
3838
}
3939

4040
public HtmlProcessor getHtmlProcessor() {
41-
return htmlProcessor.setContext(this);
41+
return htmlProcessor;
4242
}
4343

4444
public AudioPlayer getAudioPlayer() {

app/src/main/java/org/qp/android/model/service/AudioPlayer.java

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@
1111
import android.os.Looper;
1212
import android.util.Log;
1313

14-
import org.qp.android.QuestPlayerApplication;
15-
import org.qp.android.helpers.ErrorType;
16-
import org.qp.android.ui.dialogs.GameDialogType;
17-
import org.qp.android.ui.game.GameActivity;
14+
import androidx.documentfile.provider.DocumentFile;
15+
import androidx.lifecycle.LiveData;
16+
import androidx.lifecycle.MutableLiveData;
1817

1918
import java.io.IOException;
2019
import java.util.concurrent.ConcurrentHashMap;
20+
import java.util.concurrent.CountDownLatch;
2121
import java.util.concurrent.ExecutorService;
2222
import java.util.concurrent.Executors;
2323

@@ -31,19 +31,25 @@ public class AudioPlayer {
3131
private volatile boolean isAudioServiceInit;
3232
private boolean soundEnabled;
3333
private boolean isPaused = false;
34-
private Context context;
34+
private final Context context;
35+
private DocumentFile curGameDir;
3536

36-
private QuestPlayerApplication getApplication() {
37-
return (QuestPlayerApplication) context.getApplicationContext();
37+
private final MutableLiveData<String> isThrowError = new MutableLiveData<>();
38+
39+
public LiveData<String> getIsThrowError() {
40+
return isThrowError;
3841
}
3942

40-
private GameActivity getActivity() {
41-
return (GameActivity) context;
43+
public void setCurGameDir(DocumentFile curGameDir) {
44+
this.curGameDir = curGameDir;
4245
}
4346

44-
public void start(Context context) {
45-
throwIfNotMainThread();
47+
public AudioPlayer(Context context) {
4648
this.context = context;
49+
}
50+
51+
public void start() {
52+
throwIfNotMainThread();
4753
audioService = Executors.newSingleThreadExecutor();
4854
audioService.submit(() -> {
4955
Looper.prepare();
@@ -113,20 +119,15 @@ private void doPlay(final Sound sound) {
113119
}
114120

115121
var normPath = normalizeContentPath(sound.path);
116-
var application = (QuestPlayerApplication) context.getApplicationContext();
117-
var curGameDir = application.getCurrentGameDir();
118122
var soundFile = fromFullPath(normPath , curGameDir);
119123

120124
if (soundFile == null) {
121-
var controller = getActivity().getSettingsController();
122-
if (controller != null && controller.isUseMusicDebug) {
123-
getActivity().showSimpleDialog(
124-
normPath,
125-
GameDialogType.ERROR_DIALOG,
126-
ErrorType.SOUND_ERROR
127-
);
128-
} else {
129-
Log.e(TAG,"Sound file not found: " + normPath);
125+
final var latch = new CountDownLatch(1);
126+
isThrowError.postValue(normPath);
127+
try {
128+
latch.await();
129+
} catch (InterruptedException ex) {
130+
Log.e(TAG,"An error occurred while waiting", ex);
130131
}
131132
return;
132133
}

app/src/main/java/org/qp/android/model/service/HtmlProcessor.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@
55
import static org.qp.android.helpers.utils.StringUtil.isNotEmpty;
66
import static org.qp.android.helpers.utils.StringUtil.isNullOrEmpty;
77

8-
import android.content.Context;
98
import android.content.res.Resources;
109
import android.util.Base64;
1110
import android.util.Log;
1211

1312
import androidx.annotation.NonNull;
13+
import androidx.documentfile.provider.DocumentFile;
1414

1515
import org.jsoup.Jsoup;
1616
import org.jsoup.nodes.Element;
17-
import org.qp.android.QuestPlayerApplication;
1817
import org.qp.android.ui.settings.SettingsController;
1918

2019
import java.util.ArrayList;
@@ -30,20 +29,15 @@ public class HtmlProcessor {
3029
private static final String HTML_PATTERN = "<(\"[^\"]*\"|'[^']*'|[^'\">])*>";
3130
private final Pattern pattern = Pattern.compile(HTML_PATTERN);
3231
private SettingsController controller;
33-
private Context context;
32+
private DocumentFile curGameDir;
3433

3534
public HtmlProcessor setController(SettingsController controller) {
3635
this.controller = controller;
3736
return this;
3837
}
3938

40-
public HtmlProcessor setContext(Context context) {
41-
this.context = context;
42-
return this;
43-
}
44-
45-
private QuestPlayerApplication getApplication() {
46-
return (QuestPlayerApplication) context;
39+
public void setCurGameDir(DocumentFile curGameDir) {
40+
this.curGameDir = curGameDir;
4741
}
4842

4943
public HtmlProcessor(ImageProvider imageProvider) {
@@ -152,7 +146,6 @@ private void processHTMLImages(@NonNull Element documentBody) {
152146

153147
private boolean shouldChangeWidth(Element img) {
154148
var relPath = img.attr("src");
155-
var curGameDir = getApplication().getCurrentGameDir();
156149
var imageFile = fromRelPath(relPath , curGameDir);
157150
if (imageFile == null) return false;
158151
var drawable = imageProvider.getDrawableFromPath(imageFile.getUri());
@@ -163,7 +156,6 @@ private boolean shouldChangeWidth(Element img) {
163156

164157
private boolean shouldChangeHeight(Element img) {
165158
var relPath = img.attr("src");
166-
var curGameDir = getApplication().getCurrentGameDir();
167159
var imageFile = fromRelPath(relPath , curGameDir);
168160
if (imageFile == null) return false;
169161
var drawable = imageProvider.getDrawableFromPath(imageFile.getUri());

app/src/main/java/org/qp/android/ui/game/GameActivity.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import androidx.core.view.WindowInsetsCompat;
3232
import androidx.core.view.WindowInsetsControllerCompat;
3333
import androidx.documentfile.provider.DocumentFile;
34-
import androidx.lifecycle.Lifecycle;
3534
import androidx.lifecycle.MutableLiveData;
3635
import androidx.lifecycle.ViewModelProvider;
3736
import androidx.navigation.NavController;
@@ -217,6 +216,15 @@ public void onCreate(Bundle savedInstanceState) {
217216
initGame();
218217
}
219218

219+
audioPlayer.getIsThrowError().observe(this , path -> {
220+
if (!settingsController.isUseMusicDebug) return;
221+
showSimpleDialog(
222+
path,
223+
GameDialogType.ERROR_DIALOG,
224+
ErrorType.SOUND_ERROR
225+
);
226+
});
227+
220228
Log.i(TAG, "Game created");
221229
}
222230

@@ -284,6 +292,10 @@ private void initGame() {
284292
var gameFileUri = Uri.parse(intent.getStringExtra("gameFileUri"));
285293
var gameFile = DocumentFileCompat.fromUri(this , gameFileUri);
286294

295+
audioPlayer.setCurGameDir(gameDir);
296+
htmlProcessor.setCurGameDir(gameDir);
297+
gameViewModel.setGameDirUri(gameDirUri);
298+
287299
libQpProxy.runGame(gameId, gameTitle, gameDir, gameFile);
288300
}
289301

@@ -406,9 +418,6 @@ public void showSavePopup() {
406418
public void showSimpleDialog(@NonNull String inputString ,
407419
@NonNull GameDialogType dialogType ,
408420
@Nullable ErrorType errorType) {
409-
if (this.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.DESTROYED)) {
410-
return;
411-
}
412421
if (!isMainThread()) {
413422
runOnUiThread(() -> showSimpleDialog(inputString , dialogType , errorType));
414423
} else {

app/src/main/java/org/qp/android/ui/game/GameMainFragment.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ public class GameMainFragment extends Fragment {
3030
private RecyclerView actionsView;
3131

3232
private final Runnable onScroll = () -> {
33-
var resFromActivity = requireActivity().getResources();
33+
if (!isAdded()) return;
3434
if (mainDescView.getContentHeight()
35-
* resFromActivity.getDisplayMetrics().density
35+
* getResources().getDisplayMetrics().density
3636
> mainDescView.getScrollY()) {
3737
mainDescView.scrollBy(0 , mainDescView.getHeight());
3838
}

app/src/main/java/org/qp/android/ui/game/GameViewModel.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public class GameViewModel extends AndroidViewModel implements GameInterface {
6464
private final HtmlProcessor htmlProcessor;
6565
private LibQpProxy libQpProxy;
6666
private AudioPlayer audioPlayer;
67-
private final Uri fullPathGameDir;
67+
private Uri gameDirUri;
6868

6969
public ObservableBoolean isActionVisible = new ObservableBoolean();
7070

@@ -245,6 +245,10 @@ private GameActivity getGameActivity() {
245245
}
246246
}
247247

248+
public void setGameDirUri(Uri gameDirUri) {
249+
this.gameDirUri = gameDirUri;
250+
}
251+
248252
// endregion Getter/Setter
249253

250254
public void onDialogPositiveClick(DialogFragment dialog) {
@@ -400,7 +404,6 @@ public GameViewModel(@NonNull Application application) {
400404
preferences = PreferenceManager.getDefaultSharedPreferences(application);
401405
preferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener);
402406
questPlayerApplication = (QuestPlayerApplication) getApplication();
403-
fullPathGameDir = questPlayerApplication.getCurrentGameDir().getUri();
404407
htmlProcessor = questPlayerApplication.getHtmlProcessor();
405408
}
406409

@@ -412,7 +415,7 @@ protected void onCleared() {
412415

413416
public void startAudio() {
414417
audioPlayer = questPlayerApplication.getAudioPlayer();
415-
audioPlayer.start(getApplication());
418+
audioPlayer.start();
416419
}
417420

418421
public void stopAudio() {
@@ -474,7 +477,7 @@ public boolean shouldOverrideUrlLoading(WebView view , WebResourceRequest reques
474477
public WebResourceResponse shouldInterceptRequest(WebView view ,
475478
@NonNull WebResourceRequest request) {
476479
var uri = request.getUrl();
477-
var rootDir = DocumentFileCompat.fromUri(getApplication() , fullPathGameDir);
480+
var rootDir = DocumentFileCompat.fromUri(getApplication() , gameDirUri);
478481
if (rootDir != null && uri.getScheme() != null) {
479482
if (uri.getScheme().startsWith("file")) {
480483
try {

app/src/main/java/org/qp/android/ui/stock/StockViewModel.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -391,12 +391,12 @@ private DialogEditBinding formingEditView() {
391391
editBinding.setStockVM(this);
392392

393393
getCurrGameData().ifPresent(gameData -> {
394-
if (gameData.icon.isEmpty()) {
395-
Picasso.get()
396-
.load(gameData.icon)
397-
.fit()
398-
.into(editBinding.imageView);
399-
}
394+
var pathIcon = gameData.icon;
395+
if (pathIcon == null || pathIcon.isEmpty()) return;
396+
Picasso.get()
397+
.load(pathIcon)
398+
.fit()
399+
.into(editBinding.imageView);
400400
});
401401

402402
editBinding.buttonSelectPath.setOnClickListener(this::sendIntent);

0 commit comments

Comments
 (0)