diff --git a/app/build.gradle b/app/build.gradle index 8831b0f..a4cb831 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { defaultConfig { minSdk 28 targetSdk 35 - versionCode 116155 - versionName "1.16.15d" + versionCode 116156 + versionName "1.16.15e" multiDexEnabled false proguardFiles += 'proguard-rules.pro' buildConfigField 'String', 'HOOK_TARGET_VERSION', '"141910383"' diff --git a/app/src/main/java/io/github/hiro/lime/hooks/RingTone.java b/app/src/main/java/io/github/hiro/lime/hooks/RingTone.java index dd97868..3eb1b34 100644 --- a/app/src/main/java/io/github/hiro/lime/hooks/RingTone.java +++ b/app/src/main/java/io/github/hiro/lime/hooks/RingTone.java @@ -43,6 +43,7 @@ public class RingTone implements IHook { Constants.RESPONSE_HOOK.methodName, new XC_MethodHook() { + @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { String paramValue = param.args[1].toString(); @@ -74,53 +75,36 @@ public class RingTone implements IHook { if (paramValue.contains("type:NOTIFIED_RECEIVED_CALL,") && !isPlaying) { if (context != null) { - // MediaPlayerが初期化されているか確認 if (mediaPlayer != null) { - // MediaPlayerが再生中か確認 if (mediaPlayer.isPlaying()) { - return; // 再生中の場合は何もしない + return; } else { - mediaPlayer.release(); // 再生中でない場合は解放 - mediaPlayer = null; // MediaPlayerのインスタンスをnullに設定 + mediaPlayer.release(); + mediaPlayer = null; } } - Uri ringtoneUri = Uri.fromFile(destFile); // コピーしたファイルのURIを取得 + Uri ringtoneUri = Uri.fromFile(destFile); mediaPlayer = MediaPlayer.create(context, ringtoneUri); - mediaPlayer.setLooping(true); // 繰り返し再生を設定 + mediaPlayer.setLooping(true); if (mediaPlayer != null) { mediaPlayer.start(); isPlaying = true; mediaPlayer.setOnCompletionListener(mp -> { + isPlaying = false; mp.seekTo(0); mp.start(); + isPlaying = true; }); } } } - - if (paramValue.contains("RESULT=REJECTED,")) { - if (mediaPlayer != null) { - try { - if (mediaPlayer.isPlaying()) { - mediaPlayer.stop(); - } - } catch (IllegalStateException ignored) { - } - try { - mediaPlayer.release(); - } catch (IllegalStateException ignored) { - - } finally { - mediaPlayer = null; - isPlaying = false; - } - } - } } - }); + } + + ); Class targetClass = loadPackageParam.classLoader.loadClass("com.linecorp.andromeda.audio.AudioManager"); @@ -133,36 +117,38 @@ public class RingTone implements IHook { protected void beforeHookedMethod(MethodHookParam param) throws Throwable { if (method.getName().equals("setServerConfig")) { - if (mediaPlayer != null && mediaPlayer.isPlaying()) { - mediaPlayer.stop(); - mediaPlayer.release(); // MediaPlayerを解放 - mediaPlayer = null; // MediaPlayerのインスタンスをnullに設定 + if (mediaPlayer != null) { + if (mediaPlayer.isPlaying()) { + mediaPlayer.stop(); + } + mediaPlayer.release(); + mediaPlayer = null; } } if (method.getName().equals("stop")) { - if (mediaPlayer != null && mediaPlayer.isPlaying()) { - mediaPlayer.stop(); - mediaPlayer.release(); // MediaPlayerを解放 - mediaPlayer = null; // MediaPlayerのインスタンスをnullに設定 + if (mediaPlayer != null) { + if (mediaPlayer.isPlaying()) { + mediaPlayer.stop(); + } + mediaPlayer.release(); + mediaPlayer = null; } } if (method.getName().equals("processToneEvent")) { Object arg0 = param.args[0]; if (limeOptions.DialTone.checked) { - //Log.d("Xposed", "MuteTone is enabled. Suppressing tone event."); param.setResult(null); return; } if (arg0.toString().contains("START")) { if (appContext != null) { - // MediaPlayerが初期化されており、再生中の場合はスキップ if (mediaPlayer != null && mediaPlayer.isPlaying()) { - //Log.d("Xposed", "MediaPlayer is already playing. Skipping playback."); - return; // 再生中の場合は何もしない + return; } + Context moduleContext = AndroidAppHelper.currentApplication().createPackageContext( "io.github.hiro.lime", Context.CONTEXT_IGNORE_SECURITY); @@ -171,11 +157,10 @@ public class RingTone implements IHook { File ringtoneDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "LimeBackup"); if (!ringtoneDir.exists()) { - ringtoneDir.mkdirs(); // ディレクトリが存在しない場合は作成 + ringtoneDir.mkdirs(); } File destFile = new File(ringtoneDir, resourceNameA + ".wav"); - // リソースをストリームとして読み込み、ファイルに書き込む if (!destFile.exists()) { try (InputStream in = moduleContext.getResources().openRawResource(resourceIdA); OutputStream out = new FileOutputStream(destFile)) { @@ -189,17 +174,18 @@ public class RingTone implements IHook { } } - Uri ringtoneUri = Uri.fromFile(destFile); // コピーしたファイルのURIを取得 + Uri ringtoneUri = Uri.fromFile(destFile); mediaPlayer = MediaPlayer.create(appContext, ringtoneUri); - mediaPlayer.setLooping(true); // 繰り返し再生を設定 + mediaPlayer.setLooping(true); if (mediaPlayer != null) { mediaPlayer.start(); - } else { - return; + + mediaPlayer.setOnCompletionListener(mp -> { + mp.seekTo(0); + mp.start(); + }); } - } else { - return; } } } @@ -213,10 +199,12 @@ public class RingTone implements IHook { if (method.getName().equals("ACTIVATED") && param.args != null && param.args.length > 0) { Object arg0 = param.args[0]; if ("ACTIVATED".equals(arg0)) { - if (mediaPlayer != null && mediaPlayer.isPlaying()) { - mediaPlayer.stop(); - mediaPlayer.release(); // MediaPlayerを解放 - mediaPlayer = null; // MediaPlayerのインスタンスをnullに設定 + if (mediaPlayer != null) { + if (mediaPlayer.isPlaying()) { + mediaPlayer.stop(); + } + mediaPlayer.release(); + mediaPlayer = null; } } }