diff --git a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt index 7a51857..ef9be7a 100644 --- a/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt +++ b/app/.externalNativeBuild/ndkBuild/debug/armeabi-v7a/android_gradle_build_lorie_armeabi-v7a.stdout.txt @@ -2,5 +2,6 @@ Android NDK: WARNING:/home/twaik/TermuxX11/app/src/main/jni/lorie/Android.mk:lor Android NDK: This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES Android NDK: or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the Android NDK: current module -[armeabi-v7a] Compile++ thumb: lorie <= egl-helper.cpp +[armeabi-v7a] Compile++ thumb: lorie <= renderer.cpp +[armeabi-v7a] Compile++ thumb: lorie <= surface.cpp [armeabi-v7a] SharedLibrary : liblorie.so diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5c0e5c5..b37595a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,8 +29,7 @@ + android:configChanges="fontScale|orientation|screenSize|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|screenLayout|touchscreen|uiMode|smallestScreenSize|density"> diff --git a/app/src/main/java/com/termux/x11/AdditionalKeyboardView.java b/app/src/main/java/com/termux/x11/AdditionalKeyboardView.java index 656fac6..686173f 100644 --- a/app/src/main/java/com/termux/x11/AdditionalKeyboardView.java +++ b/app/src/main/java/com/termux/x11/AdditionalKeyboardView.java @@ -13,14 +13,13 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewTreeObserver; -import android.view.inputmethod.InputMethodManager; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import java.util.HashMap; import java.util.Map; -@SuppressWarnings("unused") +@SuppressWarnings({"unused", "FieldCanBeLocal"}) public class AdditionalKeyboardView extends HorizontalScrollView implements ViewTreeObserver.OnGlobalLayoutListener { private final static int KEYCODE_BASE = 300; public final static int PREFERENCES_KEY = KEYCODE_BASE + 1; @@ -154,14 +153,14 @@ public class AdditionalKeyboardView extends HorizontalScrollView implements View toggle = false; } - setMinEms(4); - setPadding(10*density, 0, 10*density, 0); - setGravity(Gravity.CENTER); setTextColor(TEXT_COLOR); setBackgroundColor(BUTTON_COLOR); String text = keyCodesForString.get(keyCode); + float textWidth = getPaint().measureText(text); + setWidth((int) (textWidth + 20 * density)); setText(text); + setGravity(Gravity.CENTER); setOnClickListener(this); setOnTouchListener(this); } diff --git a/app/src/main/java/com/termux/x11/LorieService.java b/app/src/main/java/com/termux/x11/LorieService.java index 4e4486f..208a1da 100644 --- a/app/src/main/java/com/termux/x11/LorieService.java +++ b/app/src/main/java/com/termux/x11/LorieService.java @@ -106,7 +106,7 @@ public class LorieService extends Service { Notification notification = new NotificationCompat.Builder(this, channelId) .setContentTitle("Termux:X11") .setSmallIcon(R.drawable.ic_x11_icon) - .setContentText("is running in foreground") + .setContentText("Pull down to show options") .setContentIntent(pendingIntent) .setOngoing(true) .setPriority(priority) @@ -176,6 +176,7 @@ public class LorieService extends Service { sleep(500); act.finish(); stopSelf(); + System.exit(0); // This is needed to completely finish the process } onPreferencesChanged(); @@ -359,7 +360,7 @@ public class LorieService extends Service { } - void sleep(long millis) { + static void sleep(long millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { diff --git a/app/src/main/java/com/termux/x11/MainActivity.java b/app/src/main/java/com/termux/x11/MainActivity.java index 62be88b..a11193c 100644 --- a/app/src/main/java/com/termux/x11/MainActivity.java +++ b/app/src/main/java/com/termux/x11/MainActivity.java @@ -1,6 +1,8 @@ package com.termux.x11; +import android.app.Activity; import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Build; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; @@ -11,6 +13,8 @@ import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; public class MainActivity extends AppCompatActivity { @@ -34,6 +38,9 @@ public class MainActivity extends AppCompatActivity { LorieService.setMainActivity(this); LorieService.start(LorieService.ACTION_START_FROM_ACTIVITY); + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN| + WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main_activity); @@ -46,6 +53,23 @@ public class MainActivity extends AppCompatActivity { setPointerIcon(PointerIcon.getSystemIcon(this, PointerIcon.TYPE_NULL)); } + int orientation; + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + if (newConfig.orientation != orientation && kbd != null && kbd.getVisibility() == View.VISIBLE) { + InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); + View view = getCurrentFocus(); + if (view == null) { + view = new View(this); + } + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + orientation = newConfig.orientation; + } + public void onLorieServiceStart(LorieService instance) { SurfaceView lorieView = findViewById(R.id.lorieView); diff --git a/app/src/main/jni/lorie/backend/android/android-app.cpp b/app/src/main/jni/lorie/backend/android/android-app.cpp index 409fe3a..c97a1ef 100644 --- a/app/src/main/jni/lorie/backend/android/android-app.cpp +++ b/app/src/main/jni/lorie/backend/android/android-app.cpp @@ -27,7 +27,8 @@ public: void window_change_callback(EGLNativeWindowType win, uint32_t width, uint32_t height, uint32_t physical_width, uint32_t physical_height); void layout_change_callback(char *layout); - void egl_after_init(); + void on_egl_init(); + void on_egl_uninit(); LorieEGLHelper helper; @@ -43,16 +44,21 @@ LorieBackendAndroid::LorieBackendAndroid() -void LorieBackendAndroid::egl_after_init() { +void LorieBackendAndroid::on_egl_init() { renderer.init(); } +void LorieBackendAndroid::on_egl_uninit() { + renderer.uninit(); +} + void LorieBackendAndroid::backend_init() { if (!helper.init(EGL_DEFAULT_DISPLAY)) { LOGE("Failed to initialize EGL context"); } - helper.onInit = std::bind(std::mem_fn(&LorieBackendAndroid::egl_after_init), this); + helper.onInit = std::bind(std::mem_fn(&LorieBackendAndroid::on_egl_init), this); + //helper.onUninit = std::bind(std::mem_fn(&LorieBackendAndroid::on_egl_uninit), this); if (xkb_context == nullptr) { xkb_context = xkb_context_new((enum xkb_context_flags) 0); @@ -183,10 +189,9 @@ extern "C" JNIEXPORT void JNICALL JNI_DECLARE(LorieService, terminate)(JNIEnv __unused *env, jobject __unused instance, jlong jcompositor) { if (jcompositor == 0) return; LorieBackendAndroid *b = fromLong(jcompositor); - + LOGI("JNI: requested termination"); b->terminate(); b->self.join(); - DBG; } extern "C" JNIEXPORT void JNICALL diff --git a/app/src/main/jni/lorie/renderer.cpp b/app/src/main/jni/lorie/renderer.cpp index 884b267..8e8f750 100644 --- a/app/src/main/jni/lorie/renderer.cpp +++ b/app/src/main/jni/lorie/renderer.cpp @@ -239,7 +239,7 @@ void LorieRenderer::redraw() { if (cursorVisible) drawCursor(); - + compositor.swap_buffers(); } diff --git a/app/src/main/jni/lorie/surface.cpp b/app/src/main/jni/lorie/surface.cpp index 3adf89a..de07624 100644 --- a/app/src/main/jni/lorie/surface.cpp +++ b/app/src/main/jni/lorie/surface.cpp @@ -30,8 +30,8 @@ void LorieSurface::request_frame(uint32_t callback) { } void LorieSurface::request_commit() { - //if (!buffer) return; - //wl_buffer_send_release (buffer); + if (!buffer) return; + wl_buffer_send_release (buffer); if (frame_callback) { wl_callback_send_done (frame_callback, LorieUtils::timestamp());