From fec2273aecb5bb4e94eeb4a7bda9d3f60c039928 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Drahom=C3=ADr=20Karch=C5=88=C3=A1k?=
 <drahomir.karchnak@nic.cz>
Date: Tue, 19 Jul 2016 14:02:55 +0200
Subject: [PATCH] #361 Dialog for user synchronization shouldn't be getting
 covered by virtual keyboard anymore...

---
 .../src/cz/nic/tablexia/TablexiaSettings.java |  8 ++++
 .../cz/nic/tablexia/menu/user/UserMenu.java   | 41 +++++++++++++++++--
 .../components/TextFiledDialogComponent.java  | 16 +++++---
 3 files changed, 57 insertions(+), 8 deletions(-)

diff --git a/core/src/cz/nic/tablexia/TablexiaSettings.java b/core/src/cz/nic/tablexia/TablexiaSettings.java
index 1a0a5ed5d..af12011d8 100644
--- a/core/src/cz/nic/tablexia/TablexiaSettings.java
+++ b/core/src/cz/nic/tablexia/TablexiaSettings.java
@@ -1,5 +1,6 @@
 package cz.nic.tablexia;
 
+import com.badlogic.gdx.Application;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.Preferences;
 import com.badlogic.gdx.graphics.Color;
@@ -537,4 +538,11 @@ public class TablexiaSettings {
 	public static float getActorSceneVerticalCenter(Stage stage, Actor actor) {
 		return getViewportHeight(stage) / 2f - actor.getHeight() / 2f + getViewportBottomY(stage);
 	}
+
+//////////////////////////// DEVICE INFO
+
+    public boolean isRunningOnMobileDevice() {
+        return  Gdx.app.getType() == Application.ApplicationType.Android ||
+                Gdx.app.getType() == Application.ApplicationType.iOS;
+    }
 }
\ No newline at end of file
diff --git a/core/src/cz/nic/tablexia/menu/user/UserMenu.java b/core/src/cz/nic/tablexia/menu/user/UserMenu.java
index 2efbc6970..821ea64b2 100644
--- a/core/src/cz/nic/tablexia/menu/user/UserMenu.java
+++ b/core/src/cz/nic/tablexia/menu/user/UserMenu.java
@@ -4,11 +4,13 @@ import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.Group;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.badlogic.gdx.scenes.scene2d.ui.Container;
 import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
 import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup;
 import com.badlogic.gdx.scenes.scene2d.utils.ActorGestureListener;
 import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
+import com.badlogic.gdx.scenes.scene2d.utils.FocusListener;
 
 import net.engio.mbassy.listener.Handler;
 
@@ -17,6 +19,7 @@ import java.util.List;
 
 import cz.nic.tablexia.Tablexia;
 import cz.nic.tablexia.TablexiaApplication;
+import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.bus.event.DeleteUserSynchronizationEvent;
 import cz.nic.tablexia.bus.event.MenuControlEvent;
@@ -31,6 +34,7 @@ import cz.nic.tablexia.sync.work.DownloadUser;
 import cz.nic.tablexia.sync.work.PushDataToServer;
 import cz.nic.tablexia.sync.work.SyncWork;
 import cz.nic.tablexia.util.ui.ClickListenerWithSound;
+import cz.nic.tablexia.util.ui.dialog.TablexiaComponentDialog;
 import cz.nic.tablexia.util.ui.dialog.TablexiaComponentDialogFactory;
 import cz.nic.tablexia.util.ui.dialog.components.AdaptiveSizeDialogComponent;
 import cz.nic.tablexia.util.ui.dialog.components.BackButtonHideComponent;
@@ -148,12 +152,12 @@ public class UserMenu extends AbstractMenu {
             public void performAction() {
                 final TextFiledDialogComponent textFiledDialogComponent = new TextFiledDialogComponent(SYNC_REQUEST_DIALOG_MAXIMUM_LENGTH, SYNC_REQUEST_DIALOG_PLACEHOLDER_TEXT);
 				textFiledDialogComponent.setTextFieldWidthPercent(DOWNLOAD_DIALOG_INPUT_WIDTH_PERCENT);
-                TablexiaComponentDialogFactory.getInstance().createDialog(
+
+                final TablexiaComponentDialog dialog = TablexiaComponentDialogFactory.getInstance().createDialog(
                         new CenterPositionDialogComponent(),
                         new DimmerDialogComponent(),
                         new ViewportMaximumSizeComponent(),
                         new AdaptiveSizeDialogComponent(),
-
                         new ResizableSpaceContentDialogComponent(),
                         new TextContentDialogComponent(ApplicationTextManager.getInstance().getText(ApplicationTextManager.ApplicationTextsAssets.SYNC_REQUEST_DIALOG_TEXT)),
                         new ResizableSpaceContentDialogComponent(),
@@ -171,12 +175,33 @@ public class UserMenu extends AbstractMenu {
                                         }
                                     });
                                     RestSynchronizationService.doSyncWork(syncWork);
+                                    //Prevents keyboard getting stuck
+                                    Gdx.input.setOnscreenKeyboardVisible(false);
+                                }
+                            },
+                            new ClickListener() {
+                                @Override
+                                public void clicked(InputEvent event, float x, float y) {
+                                    super.clicked(event, x, y);
+                                    //Prevents keyboard getting stuck
+                                    Gdx.input.setOnscreenKeyboardVisible(false);
                                 }
                             },
                             PositiveNegativeButtonContentDialogComponent.PositiveNegativeButtonType.CONFIRM_DECLINE),
                         new FixedSpaceContentDialogComponent(),
 						new BackButtonHideComponent()
-                ).show(SYNC_REQUEST_DIALOG_WIDTH, SYNC_REQUEST_DIALOG_HEIGHT);
+                );
+
+                dialog.show(SYNC_REQUEST_DIALOG_WIDTH, SYNC_REQUEST_DIALOG_HEIGHT);
+
+                if(TablexiaSettings.getInstance().isRunningOnMobileDevice()) {
+                    textFiledDialogComponent.getTextField().addListener(new FocusListener() {
+                        @Override
+                        public void keyboardFocusChanged(FocusListener.FocusEvent event, Actor actor, boolean focused) {
+                            if(focused) repositionDialog(dialog);
+                        }
+                    });
+                }
             }
 
             @Override
@@ -198,6 +223,16 @@ public class UserMenu extends AbstractMenu {
         layoutContainer.setActor(container);
     }
 
+    private void repositionDialog(TablexiaComponentDialog dialog) {
+        Stage stage;
+        if(dialog == null || (stage = dialog.getStage()) == null) return;
+
+        dialog.setPosition(
+                TablexiaSettings.getViewportLeftX(stage) + TablexiaSettings.getViewportWidth(stage) / 2f - dialog.getInnerWidth()/2f,
+                TablexiaSettings.getViewportBottomY(stage) + TablexiaSettings.getViewportHeight(stage) - dialog.getOutterHeight()
+        );
+    }
+
     @Override
     public void dispose() {
         ApplicationBus.getInstance().unsubscribe(this);
diff --git a/core/src/cz/nic/tablexia/util/ui/dialog/components/TextFiledDialogComponent.java b/core/src/cz/nic/tablexia/util/ui/dialog/components/TextFiledDialogComponent.java
index ef750d7e2..af0edbd7c 100644
--- a/core/src/cz/nic/tablexia/util/ui/dialog/components/TextFiledDialogComponent.java
+++ b/core/src/cz/nic/tablexia/util/ui/dialog/components/TextFiledDialogComponent.java
@@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.scenes.scene2d.ui.Cell;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.TextField;
 import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
 import com.badlogic.gdx.utils.Align;
 
@@ -32,7 +33,7 @@ public class TextFiledDialogComponent extends TablexiaDialogComponentAdapter {
     private ApplicationFontManager.FontType_NEW             actualFontType;
 	private float 											textFieldWidthPercent 	= DEFAULT_TEXT_FIELD_WIDTH_PERCENT;
 
-    private TextFieldWithPlaceholder                        uuidTextField;
+    private TextFieldWithPlaceholder                        textField;
     private Cell                                            content;
 
     public TextFiledDialogComponent() {
@@ -53,10 +54,12 @@ public class TextFiledDialogComponent extends TablexiaDialogComponentAdapter {
         this.actualFontType     = fontType;
         this.fontColor          = fontColor;
         this.maximumLength      = maximumLength;
+
+        textField = prepareTextField(placeholderText);
     }
 
     public String getText() {
-        return uuidTextField.getText();
+        return textField.getText();
     }
 
 	public float getTextFieldWidthPercent() {
@@ -70,9 +73,8 @@ public class TextFiledDialogComponent extends TablexiaDialogComponentAdapter {
 	@Override
     public void prepareContent(Cell content) {
         this.content = content;
-        uuidTextField = prepareTextField(placeholderText);
 		content.width(getDialog().getWidth() * getTextFieldWidthPercent());
-        content.setActor(uuidTextField);
+        content.setActor(textField);
     }
 
     @Override
@@ -88,7 +90,7 @@ public class TextFiledDialogComponent extends TablexiaDialogComponentAdapter {
                 isScaled = false;
             }
         }
-        uuidTextField.setTablexiaTextFieldStyle(prepareTextFieldStyle());
+        textField.setTablexiaTextFieldStyle(prepareTextFieldStyle());
         content.width(getDialog().getWidth() * getTextFieldWidthPercent());
     }
 
@@ -105,6 +107,10 @@ public class TextFiledDialogComponent extends TablexiaDialogComponentAdapter {
         return new TextFieldWithPlaceholder.TablexiaTextFieldStyle(actualFontType, fontColor, createCursorForTextField(), null, null);
     }
 
+    public TextField getTextField() {
+        return textField;
+    }
+
     private Drawable createCursorForTextField() {
         Texture texture = ApplicationAtlasManager.getInstance().getColorTexture(Color.BLACK);
         return new Image(texture).getDrawable();
-- 
GitLab