From 5931e61ade8ebd5f613abecad75e622e66295192 Mon Sep 17 00:00:00 2001 From: Aleksei Kliuev Date: Mon, 11 Sep 2017 14:03:30 +0300 Subject: [PATCH] Add Samsung DeX support --- client/Android/Studio/.gitignore | 10 +++++--- client/Android/Studio/aFreeRDP/build.gradle | 22 +++++----------- .../Studio/aFreeRDP/src/main/AndroidManifest.xml | 11 ++++++-- client/Android/Studio/build.gradle | 25 ++---------------- client/Android/Studio/freeRDPCore/build.gradle | 12 ++++----- .../freeRDPCore/src/main/AndroidManifest.xml | 7 ++--- .../freerdp/freerdpcore/application/GlobalApp.java | 2 +- .../presentation/ApplicationSettingsActivity.java | 21 ++++++++++----- .../freerdpcore/presentation/HomeActivity.java | 13 ++++++++++ .../freerdpcore/presentation/SessionActivity.java | 30 +++++++++++++++++++++- .../freerdpcore/presentation/SessionView.java | 21 +++++++++++++-- .../freeRDPCore/src/main/res/values-de/strings.xml | 1 + .../freeRDPCore/src/main/res/values-es/strings.xml | 1 + .../freeRDPCore/src/main/res/values-fr/strings.xml | 1 + .../freeRDPCore/src/main/res/values-nl/strings.xml | 1 + .../freeRDPCore/src/main/res/values-zh/strings.xml | 1 + .../freeRDPCore/src/main/res/values/strings.xml | 2 ++ .../src/main/res/xml/settings_app_ui.xml | 11 +++++++- 18 files changed, 127 insertions(+), 65 deletions(-) diff --git a/client/Android/Studio/.gitignore b/client/Android/Studio/.gitignore index a2dc231..f15db27 100644 --- a/client/Android/Studio/.gitignore +++ b/client/Android/Studio/.gitignore @@ -29,9 +29,13 @@ Thumbs.db *.iml .idea #.idea/workspace.xml - remove # and delete .idea if it better suit your needs. -.gradle -build/ +/.gradle +/.idea/ +/local.properties +build +*.iml #NDK obj/ -jniLibs/ + + diff --git a/client/Android/Studio/aFreeRDP/build.gradle b/client/Android/Studio/aFreeRDP/build.gradle index 62347de..1b44f7f 100644 --- a/client/Android/Studio/aFreeRDP/build.gradle +++ b/client/Android/Studio/aFreeRDP/build.gradle @@ -1,32 +1,22 @@ apply plugin: 'com.android.application' android { - compileSdkVersion = rootProject.ext.compileSdk - buildToolsVersion = rootProject.ext.buildToolsVersion + compileSdkVersion 25 + buildToolsVersion "25.0.2" defaultConfig { applicationId "com.freerdp.afreerdp" - minSdkVersion rootProject.ext.minSdk - targetSdkVersion rootProject.ext.targetSdk + minSdkVersion 20 + targetSdkVersion 25 vectorDrawables.useSupportLibrary = true - versionCode = rootProject.ext.versionCode - versionName = rootProject.ext.versionName + versionCode 1 + versionName "1" } - signingConfigs { - release { - storeFile file(RELEASE_STORE_FILE) - storePassword RELEASE_STORE_PASSWORD - keyAlias RELEASE_KEY_ALIAS - keyPassword RELEASE_KEY_PASSWORD - storeType "jks" - } - } buildTypes { release { minifyEnabled false - signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } debug { diff --git a/client/Android/Studio/aFreeRDP/src/main/AndroidManifest.xml b/client/Android/Studio/aFreeRDP/src/main/AndroidManifest.xml index 94dcede..7d7558d 100644 --- a/client/Android/Studio/aFreeRDP/src/main/AndroidManifest.xml +++ b/client/Android/Studio/aFreeRDP/src/main/AndroidManifest.xml @@ -7,14 +7,19 @@ + android:label="aFreeRDP" + android:resizeableActivity="true"> + + + android:theme="@style/Theme.Main" + android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize|density|screenLayout"> + @@ -93,6 +98,8 @@ android:name="com.freerdp.freerdpcore.services.FreeRDPSuggestionProvider" android:authorities="com.freerdp.afreerdp.services.freerdpsuggestionprovider"> + + diff --git a/client/Android/Studio/build.gradle b/client/Android/Studio/build.gradle index 01d2fab..37e8774 100644 --- a/client/Android/Studio/build.gradle +++ b/client/Android/Studio/build.gradle @@ -7,39 +7,18 @@ if (file.canRead()) { def getVersionName = { -> def stdout = new ByteArrayOutputStream() - exec { - commandLine 'git', 'describe', '--tags' - standardOutput = stdout - } + return stdout.toString().trim() } -ext { - versionCode = properties.get('VERSION', "10").toInteger() - minSdk = properties.get('MIN_SDK', "14").toInteger() - targetSdk = properties.get('TARGET_SDK', "25").toInteger() - compileSdk = properties.get('COMPILE_SDK', "25").toInteger() - buildToolsVersion = properties.get('BUILD_TOOLS', "25.0.2") - versionName = properties.get('VERSION_NAME', getVersionName()) - println '----------------- Project configuration -------------------' - println 'VERSION: ' + versionCode - println 'MIN_SDK: ' + minSdk - println 'TARGET_SDK: ' + targetSdk - println 'COMPILE_SDK: ' + compileSdk - println 'BUILD_TOOLS: ' + buildToolsVersion - println 'VERSION_NAME: ' + versionName - println 'RELEASE_STORE_FILE: '+ RELEASE_STORE_FILE - println 'RELEASE_KEY_ALIAS: '+ RELEASE_KEY_ALIAS - println '-----------------------------------------------------------' -} buildscript { repositories { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.0' + classpath 'com.android.tools.build:gradle:2.3.1' } } diff --git a/client/Android/Studio/freeRDPCore/build.gradle b/client/Android/Studio/freeRDPCore/build.gradle index 1f66bac..a147478 100644 --- a/client/Android/Studio/freeRDPCore/build.gradle +++ b/client/Android/Studio/freeRDPCore/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.library' android { - compileSdkVersion = rootProject.ext.compileSdk - buildToolsVersion = rootProject.ext.buildToolsVersion + compileSdkVersion 25 + buildToolsVersion "25.0.2" defaultConfig { - minSdkVersion rootProject.ext.minSdk - targetSdkVersion rootProject.ext.targetSdk + minSdkVersion 20 + targetSdkVersion 25 vectorDrawables.useSupportLibrary = true - versionCode = rootProject.ext.versionCode - versionName = rootProject.ext.versionName + versionCode 1 + versionName "1" } buildTypes { diff --git a/client/Android/Studio/freeRDPCore/src/main/AndroidManifest.xml b/client/Android/Studio/freeRDPCore/src/main/AndroidManifest.xml index 3293718..570cdc5 100644 --- a/client/Android/Studio/freeRDPCore/src/main/AndroidManifest.xml +++ b/client/Android/Studio/freeRDPCore/src/main/AndroidManifest.xml @@ -18,8 +18,8 @@ android:smallScreens="true" android:xlargeScreens="true" /> - - + + + diff --git a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/application/GlobalApp.java b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/application/GlobalApp.java index ce6c4d8..0686af2 100644 --- a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/application/GlobalApp.java +++ b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/application/GlobalApp.java @@ -106,7 +106,7 @@ public class GlobalApp extends Application implements LibFreeRDP.EventListener { static public void freeSession(long instance) { if (GlobalApp.sessionMap.containsKey(instance)) { GlobalApp.sessionMap.remove(instance); - LibFreeRDP.freeInstance(instance); + //LibFreeRDP.freeInstance(instance); } } diff --git a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/ApplicationSettingsActivity.java b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/ApplicationSettingsActivity.java index bbffc10..05fb792 100644 --- a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/ApplicationSettingsActivity.java +++ b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/ApplicationSettingsActivity.java @@ -81,13 +81,15 @@ public class ApplicationSettingsActivity extends AppCompatPreferenceActivity { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - final String clientNameKey = getString(R.string.preference_key_client_name); - - get(getActivity()); - if (key.equals(clientNameKey)) { - final String clientNameValue = sharedPreferences.getString(clientNameKey, ""); - EditTextPreference pref = (EditTextPreference) findPreference(clientNameKey); - pref.setText(clientNameValue); + if (isAdded()) { + final String clientNameKey = getString(R.string.preference_key_client_name); + + get(getActivity()); + if (key.equals(clientNameKey)) { + final String clientNameValue = sharedPreferences.getString(clientNameKey, ""); + EditTextPreference pref = (EditTextPreference) findPreference(clientNameKey); + pref.setText(clientNameValue); + } } } } @@ -203,6 +205,11 @@ public class ApplicationSettingsActivity extends AppCompatPreferenceActivity { return preferences.getBoolean(context.getString(R.string.preference_key_ui_hide_status_bar), false); } + public static boolean getHideActionBar(Context context) { + SharedPreferences preferences = get(context); + return preferences.getBoolean(context.getString(R.string.preference_key_ui_hide_action_bar), false); + } + public static boolean getAcceptAllCertificates(Context context) { SharedPreferences preferences = get(context); return preferences.getBoolean(context.getString(R.string.preference_key_accept_certificates), false); diff --git a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/HomeActivity.java b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/HomeActivity.java index 19f1423..7407373 100644 --- a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/HomeActivity.java +++ b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/HomeActivity.java @@ -12,6 +12,7 @@ package com.freerdp.freerdpcore.presentation; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; +import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; @@ -56,6 +57,7 @@ public class HomeActivity extends AppCompatActivity { private PlaceholderBookmark addBookmarkPlaceholder; private String sectionLabelBookmarks; + View mDecor; @Override public void onCreate(Bundle savedInstanceState) { @@ -63,6 +65,9 @@ public class HomeActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.home); + mDecor = getWindow().getDecorView(); + mDecor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + long heapSize = Runtime.getRuntime().maxMemory(); Log.i(TAG, "Max HeapSize: " + heapSize); Log.i(TAG, "App data folder: " + getFilesDir().toString()); @@ -149,6 +154,14 @@ public class HomeActivity extends AppCompatActivity { }); } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + // ignore orientation/keyboard change + super.onConfigurationChanged(newConfig); + mDecor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + } + @Override public boolean onSearchRequested() { superBarEditText.requestFocus(); diff --git a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/SessionActivity.java b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/SessionActivity.java index 630d97e..4ea43db 100644 --- a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/SessionActivity.java +++ b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/SessionActivity.java @@ -17,6 +17,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; +import android.content.SharedPreferences; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; @@ -35,6 +36,7 @@ import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; +import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; import android.view.ViewConfiguration; @@ -114,6 +116,7 @@ public class SessionActivity extends AppCompatActivity implements private int discardedMoveEvents = 0; private ClipboardManagerProxy mClipboardManager; private boolean callbackDialogResult; + View mDecor; private void createDialogs() { // build verify certificate dialog @@ -199,7 +202,7 @@ public class SessionActivity extends AppCompatActivity implements } this.setContentView(R.layout.session); - if (hasHardwareMenuButton()) { + if (hasHardwareMenuButton() || ApplicationSettingsActivity.getHideActionBar(this)) { this.getSupportActionBar().hide(); } else this.getSupportActionBar().show(); @@ -297,6 +300,9 @@ public class SessionActivity extends AppCompatActivity implements mClipboardManager = ClipboardManagerProxy.getClipboardManager(this); mClipboardManager.addClipboardChangedListener(this); + + mDecor = getWindow().getDecorView(); + mDecor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } @Override @@ -353,6 +359,7 @@ public class SessionActivity extends AppCompatActivity implements // free session GlobalApp.freeSession(session.getInstance()); + session = null; } @@ -373,6 +380,8 @@ public class SessionActivity extends AppCompatActivity implements // apply loaded keyboards keyboardView.setKeyboard(specialkeysKeyboard); modifiersKeyboardView.setKeyboard(modifiersKeyboard); + + mDecor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } private void processIntent(Intent intent) { @@ -482,6 +491,8 @@ public class SessionActivity extends AppCompatActivity implements sessionView.onSurfaceChange(session); scrollView.requestLayout(); keyboardMapper.reset(this); + mDecor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + } private void hideSoftInput() { @@ -1092,6 +1103,23 @@ public class SessionActivity extends AppCompatActivity implements scrollView.scrollTo(0, 0); } + @Override + public boolean onGenericMotionEvent(MotionEvent e) { + super.onGenericMotionEvent(e); + switch (e.getAction()) { + case MotionEvent.ACTION_SCROLL: + final float vScroll = e.getAxisValue(MotionEvent.AXIS_VSCROLL); + if (vScroll < 0) { + LibFreeRDP.sendCursorEvent(session.getInstance(), 0, 0, Mouse.getScrollEvent(this, false)); + } + if (vScroll > 0) { + LibFreeRDP.sendCursorEvent(session.getInstance(), 0, 0, Mouse.getScrollEvent(this, true)); + } + break; + } + return true; + } + // **************************************************************************** // ClipboardManagerProxy.OnClipboardChangedListener @Override diff --git a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/SessionView.java b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/SessionView.java index ff24c65..df80197 100644 --- a/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/SessionView.java +++ b/client/Android/Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore/presentation/SessionView.java @@ -18,14 +18,17 @@ import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.util.Log; +import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; import com.freerdp.freerdpcore.application.SessionState; +import com.freerdp.freerdpcore.services.LibFreeRDP; import com.freerdp.freerdpcore.utils.DoubleGestureDetector; import com.freerdp.freerdpcore.utils.GestureDetector; +import com.freerdp.freerdpcore.utils.Mouse; import java.util.Stack; @@ -49,6 +52,7 @@ public class SessionView extends View { private Matrix invScaleMatrix; private RectF invalidRegionF; private GestureDetector gestureDetector; + private SessionState currentSession; //private static final String TAG = "FreeRDP.SessionView"; private DoubleGestureDetector doubleGestureDetector; @@ -76,6 +80,8 @@ public class SessionView extends View { scaleMatrix = new Matrix(); invScaleMatrix = new Matrix(); invalidRegionF = new RectF(); + + setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } public void setScaleGestureDetector(ScaleGestureDetector scaleGestureDetector) { @@ -110,6 +116,7 @@ public class SessionView extends View { setMinimumHeight(height); requestLayout(); + currentSession = session; } public float getZoom() { @@ -281,8 +288,18 @@ public class SessionView extends View { // send single click MotionEvent mappedEvent = mapTouchEvent(e); sessionViewListener.onSessionViewBeginTouch(); - sessionViewListener.onSessionViewLeftTouch((int) mappedEvent.getX(), (int) mappedEvent.getY(), true); - sessionViewListener.onSessionViewLeftTouch((int) mappedEvent.getX(), (int) mappedEvent.getY(), false); + switch (e.getButtonState()) { + case MotionEvent.BUTTON_PRIMARY: + sessionViewListener.onSessionViewLeftTouch((int) mappedEvent.getX(), (int) mappedEvent.getY(), true); + sessionViewListener.onSessionViewLeftTouch((int) mappedEvent.getX(), (int) mappedEvent.getY(), false); + break; + case MotionEvent.BUTTON_SECONDARY: + LibFreeRDP.sendCursorEvent(currentSession.getInstance(), + (int) mappedEvent.getX(), (int) mappedEvent.getY(), Mouse.getRightButtonEvent(getContext(), true)); + LibFreeRDP.sendCursorEvent(currentSession.getInstance(), + (int) mappedEvent.getX(), (int) mappedEvent.getY(), Mouse.getRightButtonEvent(getContext(), false)); + break; + } sessionViewListener.onSessionViewEndTouch(); return true; } diff --git a/client/Android/Studio/freeRDPCore/src/main/res/values-de/strings.xml b/client/Android/Studio/freeRDPCore/src/main/res/values-de/strings.xml index 0e94944..0cd91f4 100644 --- a/client/Android/Studio/freeRDPCore/src/main/res/values-de/strings.xml +++ b/client/Android/Studio/freeRDPCore/src/main/res/values-de/strings.xml @@ -122,6 +122,7 @@ nicht gesetzt Benutzeroberfläche verstecke Statusleiste + Aktionsleiste ausblenden verstecke Zoom Tasten Vertausche Maustasten Invertiere Bildlauf diff --git a/client/Android/Studio/freeRDPCore/src/main/res/values-es/strings.xml b/client/Android/Studio/freeRDPCore/src/main/res/values-es/strings.xml index 5b1ae0b..89a0657 100644 --- a/client/Android/Studio/freeRDPCore/src/main/res/values-es/strings.xml +++ b/client/Android/Studio/freeRDPCore/src/main/res/values-es/strings.xml @@ -123,6 +123,7 @@ no configurado Interfaze Usuario Ocultar barra de estado + \"Ocultar barra de acción\" Ocultar controles de zoom Intercambiar botones del mouse invertir desplazamiento diff --git a/client/Android/Studio/freeRDPCore/src/main/res/values-fr/strings.xml b/client/Android/Studio/freeRDPCore/src/main/res/values-fr/strings.xml index 278d758..cbe6439 100644 --- a/client/Android/Studio/freeRDPCore/src/main/res/values-fr/strings.xml +++ b/client/Android/Studio/freeRDPCore/src/main/res/values-fr/strings.xml @@ -122,6 +122,7 @@ "Valeur non définie" "Interface utilisateur" "Masquer la barre d'état" + \"Masquer la barre d\'action\" "Masquer les contrôles zoom" "Inverser les boutons de la souris" "Inverser le défilement de la souris" diff --git a/client/Android/Studio/freeRDPCore/src/main/res/values-nl/strings.xml b/client/Android/Studio/freeRDPCore/src/main/res/values-nl/strings.xml index af0f754..f9886c2 100644 --- a/client/Android/Studio/freeRDPCore/src/main/res/values-nl/strings.xml +++ b/client/Android/Studio/freeRDPCore/src/main/res/values-nl/strings.xml @@ -123,6 +123,7 @@ Niet ingesteld Gebruikersinterface Verberg statusbalk + Verkeersbalk verbergen Verberg Zoom Controls Wissel muisknoppen Scrollen omkeren diff --git a/client/Android/Studio/freeRDPCore/src/main/res/values-zh/strings.xml b/client/Android/Studio/freeRDPCore/src/main/res/values-zh/strings.xml index 42720c5..e5b040f 100644 --- a/client/Android/Studio/freeRDPCore/src/main/res/values-zh/strings.xml +++ b/client/Android/Studio/freeRDPCore/src/main/res/values-zh/strings.xml @@ -122,6 +122,7 @@ 未设置 用户界面 隐藏状态栏 + 隱藏操作欄 隐藏缩放控件 交换鼠标左右键 翻转滚动 diff --git a/client/Android/Studio/freeRDPCore/src/main/res/values/strings.xml b/client/Android/Studio/freeRDPCore/src/main/res/values/strings.xml index 263e60c..c119111 100644 --- a/client/Android/Studio/freeRDPCore/src/main/res/values/strings.xml +++ b/client/Android/Studio/freeRDPCore/src/main/res/values/strings.xml @@ -163,6 +163,7 @@ not set User Interface Hide Status Bar + Hide Action Bar Hide Zoom Controls Swap Mouse Buttons Invert Scrolling @@ -224,6 +225,7 @@ ui.invert_scrolling ui.swap_mouse_buttons ui.hide_zoom_controls + ui.hide_action_bar OFF FATAL diff --git a/client/Android/Studio/freeRDPCore/src/main/res/xml/settings_app_ui.xml b/client/Android/Studio/freeRDPCore/src/main/res/xml/settings_app_ui.xml index 833eb7a..9f1b2e4 100644 --- a/client/Android/Studio/freeRDPCore/src/main/res/xml/settings_app_ui.xml +++ b/client/Android/Studio/freeRDPCore/src/main/res/xml/settings_app_ui.xml @@ -1,21 +1,30 @@ - + + \ No newline at end of file -- 2.7.4