Skip to content

Commit

Permalink
refactor: display InitialKeyboard before deployment or lacks of per…
Browse files Browse the repository at this point in the history
…missions

If permissions are not granted, `RimeWrapper.canStart` will be set to false, so
`RimeWrapper` will save the `Runnable` and wait to start later.  When permission are
granted, `RimeWrapper.canStart` will be set to true in `onCreate()`, `onCreateInputView()`
and `onStartInputView()`.  And rime deployment will be triggered accordingly.

For UI display:  If permissions are not granted, an error message will be displayed
in `InitialKeyboard`.  If permissions are granted, `InitialKeyboard` with deployment
progress will be displayed.  If deployment is completed, the normal keyboard will be
displayed.

Do not set `initialKeyboard` to null to prevent NPE. As the callback in `RimeWrapper`
maybe perform faster or slower, we will not be sure when `setInputView()` will run.
We should either check for null for all call to `initialKeyboard`, or do not set it
to null.

Refs #1159
  • Loading branch information
goofyz committed Dec 30, 2023
1 parent 65182fa commit eb0e56e
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 8 deletions.
30 changes: 24 additions & 6 deletions app/src/main/java/com/osfans/trime/ime/core/Trime.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,13 @@
import com.osfans.trime.data.sound.SoundThemeManager;
import com.osfans.trime.data.theme.Theme;
import com.osfans.trime.databinding.CompositionRootBinding;
import com.osfans.trime.databinding.InputLoadingBinding;
import com.osfans.trime.databinding.InputRootBinding;
import com.osfans.trime.ime.broadcast.IntentReceiver;
import com.osfans.trime.ime.enums.Keycode;
import com.osfans.trime.ime.enums.PopupPosition;
import com.osfans.trime.ime.enums.SymbolKeyboardType;
import com.osfans.trime.ime.keyboard.Event;
import com.osfans.trime.ime.keyboard.InitialKeyboard;
import com.osfans.trime.ime.keyboard.InputFeedbackManager;
import com.osfans.trime.ime.keyboard.Key;
import com.osfans.trime.ime.keyboard.Keyboard;
Expand All @@ -83,6 +83,7 @@
import com.osfans.trime.ime.text.TextInputManager;
import com.osfans.trime.ime.util.UiUtil;
import com.osfans.trime.util.DimensionsKt;
import com.osfans.trime.util.PermissionUtils;
import com.osfans.trime.util.ShortcutUtils;
import com.osfans.trime.util.StringUtils;
import com.osfans.trime.util.ViewUtils;
Expand Down Expand Up @@ -131,6 +132,7 @@ private AppPrefs getPrefs() {
private int popupMargin; // 候選窗與邊緣空隙
private int popupMarginH; // 悬浮窗与屏幕两侧的间距
private boolean isCursorUpdated = false; // 光標是否移動
private InitialKeyboard initialKeyboard; // initial keyboard display
private int minPopupSize; // 上悬浮窗的候选词的最小词长
private int minPopupCheckSize; // 第一屏候选词数量少于设定值,则候选词上悬浮窗。(也就是说,第一屏存在长词)此选项大于1时,min_length等参数失效
private PopupPosition popupWindowPos; // 悬浮窗口彈出位置
Expand Down Expand Up @@ -363,9 +365,13 @@ public void onCreate() {
// and lead to a crash loop
Timber.d("onCreate");
final InputMethodService context = this;

initialKeyboard = new InitialKeyboard(this);
setRimeStatusAndInitialKeyboard();
RimeWrapper.INSTANCE.startup(
() -> {
Timber.d("Back to Trime.onCreate");
Timber.d("Running Trime.onCreate");
initialKeyboard.change(true);
textInputManager =
TextInputManager.Companion.getInstance(UiUtil.INSTANCE.isDarkMode(context));
activeEditorInstance = new EditorInstance(context);
Expand Down Expand Up @@ -736,8 +742,7 @@ public void onComputeInsets(InputMethodService.Insets outInsets) {
@Override
public View onCreateInputView() {
Timber.d("onCreateInputView()");
// 初始化键盘布局
super.onCreateInputView();
setRimeStatusAndInitialKeyboard();
RimeWrapper.INSTANCE.runAfterStarted(
() -> {
inputRootBinding = InputRootBinding.inflate(LayoutInflater.from(this));
Expand Down Expand Up @@ -776,11 +781,11 @@ public View onCreateInputView() {
bindKeyboardToInputView();

setInputView(inputRootBinding.inputRoot);
Timber.d("onCreateInputView - really ended");
Timber.d("onCreateInputView - completely ended");
});
Timber.i("onCreateInputView() finish");

return InputLoadingBinding.inflate(LayoutInflater.from(this)).getRoot();
return initialKeyboard.change(canRimeStart());
}

public void setShowComment(boolean show_comment) {
Expand All @@ -800,11 +805,24 @@ private boolean updateDarkMode() {
return setDarkMode(isDarkMode);
}

private boolean canRimeStart() {
return PermissionUtils.isAllGranted(this);
}

private void setRimeStatusAndInitialKeyboard() {
boolean canRimeStart = canRimeStart();
RimeWrapper.INSTANCE.setCanStart(canRimeStart);
if (initialKeyboard != null) {
initialKeyboard.change(canRimeStart);
}
}

@Override
public void onStartInputView(EditorInfo attribute, boolean restarting) {
Timber.d("onStartInputView: restarting=%s", restarting);
editorInfo = attribute;

setRimeStatusAndInitialKeyboard();
RimeWrapper.INSTANCE.runAfterStarted(
() -> {
if (updateDarkMode()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ class InitialKeyboard(context: Context) {

fun change(start: Boolean): View {
if (start) {
binding.progressBar.setVisibility(View.VISIBLE)
binding.progressBar.visibility = View.VISIBLE
binding.deploying.setText(R.string.deploy_progress)
} else {
binding.progressBar.setVisibility(View.INVISIBLE)
binding.progressBar.visibility = View.INVISIBLE
binding.deploying.setText(R.string.external_storage_permission_not_available)
}
return binding.root
Expand Down

0 comments on commit eb0e56e

Please sign in to comment.