Skip to content

Commit

Permalink
refactor(lifecycle): enhance lifecycle management
Browse files Browse the repository at this point in the history
  • Loading branch information
WhiredPlanck authored and Bambooin committed Oct 23, 2021
1 parent cd018f8 commit a4290fa
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 5 deletions.
3 changes: 2 additions & 1 deletion app/src/main/java/com/osfans/trime/ime/core/Trime.java
Expand Up @@ -71,6 +71,7 @@
import com.osfans.trime.ime.keyboard.Keyboard;
import com.osfans.trime.ime.keyboard.KeyboardSwitcher;
import com.osfans.trime.ime.keyboard.KeyboardView;
import com.osfans.trime.ime.lifecycle.LifecycleInputMethodService;
import com.osfans.trime.ime.symbol.LiquidKeyboard;
import com.osfans.trime.ime.symbol.TabManager;
import com.osfans.trime.ime.symbol.TabView;
Expand All @@ -92,7 +93,7 @@
import timber.log.Timber;

/** {@link InputMethodService 輸入法}主程序 */
public class Trime extends InputMethodService
public class Trime extends LifecycleInputMethodService
implements KeyboardView.OnKeyboardActionListener, Candidate.EventListener {
private static Trime self = null;
private LiquidKeyboard liquidKeyboard;
Expand Down
20 changes: 16 additions & 4 deletions app/src/main/java/com/osfans/trime/ime/keyboard/KeyboardView.java
Expand Up @@ -42,22 +42,35 @@
import android.view.ViewGroup;
import android.widget.PopupWindow;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.osfans.trime.R;
import com.osfans.trime.databinding.KeyboardKeyPreviewBinding;
import com.osfans.trime.ime.core.Preferences;
import com.osfans.trime.ime.enums.KeyEventType;
import com.osfans.trime.ime.lifecycle.CoroutineScopeJava;
import com.osfans.trime.setup.Config;
import com.osfans.trime.util.LeakGuardHandlerWrapper;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import kotlin.coroutines.CoroutineContext;
import kotlinx.coroutines.CoroutineScope;
import timber.log.Timber;

/** 顯示{@link Keyboard 鍵盤}及{@link Key 按鍵} */
public class KeyboardView extends View implements View.OnClickListener {
public class KeyboardView extends View implements View.OnClickListener, CoroutineScope {

@NonNull
@Override
public CoroutineContext getCoroutineContext() {
return CoroutineScopeJava.getMainScopeJava().getCoroutineContext();
}

/** 處理按鍵、觸摸等輸入事件 */
public interface OnKeyboardActionListener {
Expand Down Expand Up @@ -342,7 +355,7 @@ public KeyboardView(final Context context, final AttributeSet attrs) {
try {
findStateDrawableIndex =
StateListDrawable.class.getMethod(
Build.VERSION.SDK_INT + Build.VERSION.PREVIEW_SDK_INT >= Build.VERSION_CODES.Q
Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
? "findStateDrawableIndex"
: "getStateDrawableIndex",
int[].class);
Expand Down Expand Up @@ -426,8 +439,7 @@ public boolean onFling(
} else if ((deltaY > travel || velocityY > mSwipeThreshold) && absX < absY) {
if (mDisambiguateSwipe && endingVelocityY < velocityY / 4) {
Timber.d(
"swipeDebug.onFling sendDownKey, dY=%f, vY=%f, eVY=%f, travel=%d, mSwipeThreshold="
+ mSwipeThreshold,
"swipeDebug.onFling sendDownKey, dY=%f, vY=%f, eVY=%f, travel=%d, mSwipeThreshold=%s", mSwipeThreshold,
deltaY,
velocityY,
endingVelocityY,
Expand Down
@@ -0,0 +1,9 @@
package com.osfans.trime.ime.lifecycle

import kotlinx.coroutines.MainScope

object CoroutineScopeJava {
@JvmStatic
val MainScopeJava
get() = MainScope()
}
@@ -0,0 +1,45 @@
package com.osfans.trime.ime.lifecycle

import android.inputmethodservice.InputMethodService
import android.view.View
import androidx.annotation.CallSuper
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import androidx.lifecycle.ViewTreeLifecycleOwner
import kotlinx.coroutines.CoroutineScope

open class LifecycleInputMethodService: InputMethodService(),
LifecycleOwner
{
private val lifecycleRegistry by lazy { LifecycleRegistry(this) }

val uiScope: CoroutineScope
get() = lifecycle.coroutineScope

final override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}

@CallSuper
override fun onCreate() {
super.onCreate()
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}

@CallSuper
override fun onCreateInputView(): View? {
val decorView = window!!.window!!.decorView
ViewTreeLifecycleOwner.set(decorView, this)
return null
}

@CallSuper
override fun onDestroy() {
super.onDestroy()
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
}
}

0 comments on commit a4290fa

Please sign in to comment.