Kaynağa Gözat

0.0.44.beta7

kongzue 3 yıl önce
ebeveyn
işleme
89dd034bcb

+ 2 - 1
.idea/misc.xml

@@ -27,6 +27,7 @@
         <entry key="..\:/WorkSpace/Android/DialogXDemo/DialogX/src/main/res/layout/layout_dialogx_bottom_material.xml" value="0.36944444444444446" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/DialogX/src/main/res/layout/layout_dialogx_bottom_material_dark.xml" value="0.5411458333333333" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/DialogX/src/main/res/layout/layout_dialogx_custom.xml" value="0.5328205128205128" />
+        <entry key="..\:/WorkSpace/Android/DialogXDemo/DialogX/src/main/res/layout/layout_dialogx_empty.xml" value="0.30648148148148147" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/DialogX/src/main/res/layout/layout_dialogx_fullscreen.xml" value="0.5411458333333333" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/DialogX/src/main/res/layout/layout_dialogx_fullscreen_dark.xml" value="0.5411458333333333" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/DialogX/src/main/res/layout/layout_dialogx_material.xml" value="0.5411458333333333" />
@@ -101,7 +102,7 @@
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/drawable/ios_edit_box_bkg.xml" value="0.425" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/drawable/rect_ios_edit_box_bkg_focus.xml" value="0.425" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/activity_app_compat_test.xml" value="0.5328205128205128" />
-        <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/activity_main.xml" value="0.5328205128205128" />
+        <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/activity_main.xml" value="0.4535855697316322" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/fragment_custom.xml" value="0.5411458333333333" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/item_custom_recycleview.xml" value="0.5411458333333333" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/layout_custom_dialog.xml" value="0.36944444444444446" />

+ 1 - 1
DialogX/src/main/java/com/kongzue/dialogx/DialogX.java

@@ -129,7 +129,7 @@ public class DialogX {
     }
     
     public enum IMPL_MODE {
-        VIEW, WINDOW, DIALOG_FRAGMENT
+        VIEW, WINDOW, DIALOG_FRAGMENT, FLOATING_ACTIVITY
     }
     
     public static void init(Context context) {

+ 5 - 1
DialogX/src/main/java/com/kongzue/dialogx/impl/ActivityLifecycleImpl.java

@@ -19,6 +19,7 @@ import androidx.appcompat.app.AppCompatActivity;
 
 import com.kongzue.dialogx.DialogX;
 import com.kongzue.dialogx.interfaces.BaseDialog;
+import com.kongzue.dialogx.util.DialogXFloatingWindowActivity;
 
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Field;
@@ -119,6 +120,9 @@ public class ActivityLifecycleImpl implements Application.ActivityLifecycleCallb
                     window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
                 }
             }
+            if (activity instanceof DialogXFloatingWindowActivity) {
+                return;
+            }
             onActivityResumeCallBack.getActivity(activity);
         }
     }
@@ -130,7 +134,7 @@ public class ActivityLifecycleImpl implements Application.ActivityLifecycleCallb
     
     @Override
     public void onActivityResumed(@NonNull Activity activity) {
-        if (activity.isDestroyed() || activity.isFinishing()) {
+        if (activity.isDestroyed() || activity.isFinishing() || activity instanceof DialogXFloatingWindowActivity) {
             return;
         }
         if (onActivityResumeCallBack != null) {

+ 112 - 0
DialogX/src/main/java/com/kongzue/dialogx/interfaces/BaseDialog.java

@@ -2,6 +2,7 @@ package com.kongzue.dialogx.interfaces;
 
 import android.app.Activity;
 import android.content.Context;
+import android.content.Intent;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -30,13 +31,17 @@ import com.kongzue.dialogx.R;
 import com.kongzue.dialogx.dialogs.PopTip;
 import com.kongzue.dialogx.impl.ActivityLifecycleImpl;
 import com.kongzue.dialogx.impl.DialogFragmentImpl;
+import com.kongzue.dialogx.util.ActivityRunnable;
+import com.kongzue.dialogx.util.DialogXFloatingWindowActivity;
 import com.kongzue.dialogx.util.TextInfo;
 import com.kongzue.dialogx.util.WindowUtil;
 import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import static com.kongzue.dialogx.DialogX.DEBUGMODE;
@@ -57,6 +62,7 @@ public abstract class BaseDialog {
     private WeakReference<View> dialogView;
     protected WeakReference<DialogFragmentImpl> ownDialogFragmentImpl;
     protected DialogX.IMPL_MODE dialogImplMode = DialogX.implIMPLMode;
+    protected WeakReference<DialogXFloatingWindowActivity> floatingWindowActivity;
     
     public static void init(Context context) {
         if (context == null) context = ActivityLifecycleImpl.getTopActivity();
@@ -150,6 +156,48 @@ public abstract class BaseDialog {
                     dialogFragment.show(getSupportFragmentManager(contextWeakReference.get()), "DialogX");
                     baseDialog.ownDialogFragmentImpl = new WeakReference<>(dialogFragment);
                     break;
+                case FLOATING_ACTIVITY:
+                    if (waitRunDialogX == null) {
+                        waitRunDialogX = new HashMap<>();
+                    }
+                    waitRunDialogX.put(baseDialog.dialogKey(), new ActivityRunnable() {
+                        @Override
+                        public void run(Activity activity) {
+                            baseDialog.floatingWindowActivity = new WeakReference<>((DialogXFloatingWindowActivity) activity);
+                            final FrameLayout activityRootView = (FrameLayout) activity.getWindow().getDecorView();
+                            if (activityRootView == null) {
+                                return;
+                            }
+                            runOnMain(new Runnable() {
+                                @Override
+                                public void run() {
+                                    if (view.getParent() == rootFrameLayout.get()) {
+                                        error(((BaseDialog) view.getTag()).dialogKey() + "已处于显示状态,请勿重复执行 show() 指令。");
+                                        return;
+                                    }
+                                    if (view.getParent() != null) {
+                                        ((ViewGroup) view.getParent()).removeView(view);
+                                    }
+                                    activityRootView.addView(view);
+                                }
+                            });
+                        }
+                    });
+                    DialogXFloatingWindowActivity dialogXFloatingWindowActivity = DialogXFloatingWindowActivity.getDialogXFloatingWindowActivity();
+                    if (dialogXFloatingWindowActivity != null && dialogXFloatingWindowActivity.isSameFrom(contextWeakReference.get().hashCode())) {
+                        dialogXFloatingWindowActivity.showDialogX(baseDialog.dialogKey());
+                        return;
+                    }
+                    Intent intent = new Intent(contextWeakReference.get(), DialogXFloatingWindowActivity.class);
+                    intent.putExtra("dialogXKey", baseDialog.dialogKey());
+                    intent.putExtra("fromActivityUiStatus", contextWeakReference.get().getWindow().getDecorView().getSystemUiVisibility());
+                    intent.putExtra("from", contextWeakReference.get().hashCode());
+                    contextWeakReference.get().startActivity(intent);
+                    int version = Integer.valueOf(Build.VERSION.SDK_INT);
+                    if (version > 5) {
+                        contextWeakReference.get().overridePendingTransition(0, 0);
+                    }
+                    break;
                 default:
                     if (rootFrameLayout == null || rootFrameLayout.get() == null) return;
                     runOnMain(new Runnable() {
@@ -174,6 +222,13 @@ public abstract class BaseDialog {
         return (activity instanceof AppCompatActivity) ? ((AppCompatActivity) activity).getSupportFragmentManager() : null;
     }
     
+    private static Map<String, ActivityRunnable> waitRunDialogX;
+    
+    public static ActivityRunnable getActivityRunnable(String dialogXKey) {
+        if (dialogXKey == null) return null;
+        return waitRunDialogX.get(dialogXKey);
+    }
+    
     protected static void show(final Activity activity, final View view) {
         if (activity == null || view == null) return;
         if (contextWeakReference == null || contextWeakReference.get() == null) {
@@ -211,6 +266,48 @@ public abstract class BaseDialog {
                     dialogFragment.show(getSupportFragmentManager(activity), "DialogX");
                     baseDialog.ownDialogFragmentImpl = new WeakReference<>(dialogFragment);
                     break;
+                case FLOATING_ACTIVITY:
+                    if (waitRunDialogX == null) {
+                        waitRunDialogX = new HashMap<>();
+                    }
+                    waitRunDialogX.put(baseDialog.dialogKey(), new ActivityRunnable() {
+                        @Override
+                        public void run(Activity activity) {
+                            baseDialog.floatingWindowActivity = new WeakReference<>((DialogXFloatingWindowActivity) activity);
+                            final FrameLayout activityRootView = (FrameLayout) activity.getWindow().getDecorView();
+                            if (activityRootView == null) {
+                                return;
+                            }
+                            runOnMain(new Runnable() {
+                                @Override
+                                public void run() {
+                                    if (view.getParent() == rootFrameLayout.get()) {
+                                        error(((BaseDialog) view.getTag()).dialogKey() + "已处于显示状态,请勿重复执行 show() 指令。");
+                                        return;
+                                    }
+                                    if (view.getParent() != null) {
+                                        ((ViewGroup) view.getParent()).removeView(view);
+                                    }
+                                    activityRootView.addView(view);
+                                }
+                            });
+                        }
+                    });
+                    DialogXFloatingWindowActivity dialogXFloatingWindowActivity = DialogXFloatingWindowActivity.getDialogXFloatingWindowActivity();
+                    if (dialogXFloatingWindowActivity != null && dialogXFloatingWindowActivity.isSameFrom(activity.hashCode())) {
+                        dialogXFloatingWindowActivity.showDialogX(baseDialog.dialogKey());
+                        return;
+                    }
+                    Intent intent = new Intent(activity, DialogXFloatingWindowActivity.class);
+                    intent.putExtra("dialogXKey", baseDialog.dialogKey());
+                    intent.putExtra("from", activity.hashCode());
+                    intent.putExtra("fromActivityUiStatus", activity.getWindow().getDecorView().getSystemUiVisibility());
+                    activity.startActivity(intent);
+                    int version = Integer.valueOf(Build.VERSION.SDK_INT);
+                    if (version > 5) {
+                        activity.overridePendingTransition(0, 0);
+                    }
+                    break;
                 default:
                     final FrameLayout activityRootView = (FrameLayout) activity.getWindow().getDecorView();
                     if (activityRootView == null) {
@@ -255,6 +352,14 @@ public abstract class BaseDialog {
                     baseDialog.ownDialogFragmentImpl.get().dismiss();
                 }
                 break;
+            case FLOATING_ACTIVITY:
+                if (baseDialog.floatingWindowActivity != null && baseDialog.floatingWindowActivity.get() != null) {
+                    FrameLayout rootView = ((FrameLayout) baseDialog.floatingWindowActivity.get().getWindow().getDecorView());
+                    if (rootView != null) rootView.removeView(dialogView);
+                    baseDialog.floatingWindowActivity.get().finish(baseDialog.dialogKey());
+                    requestDialogFocus();
+                }
+                break;
             default:
                 runOnMain(new Runnable() {
                     @Override
@@ -554,6 +659,9 @@ public abstract class BaseDialog {
                         }
                     }
                 }
+                break;
+            case FLOATING_ACTIVITY:
+                
                 break;
             default:
                 if (runningDialogList != null) {
@@ -617,4 +725,8 @@ public abstract class BaseDialog {
             }
         }
     }
+    
+    protected void bindFloatingActivity(DialogXFloatingWindowActivity activity) {
+        floatingWindowActivity = new WeakReference<>(activity);
+    }
 }

+ 14 - 0
DialogX/src/main/java/com/kongzue/dialogx/util/ActivityRunnable.java

@@ -0,0 +1,14 @@
+package com.kongzue.dialogx.util;
+
+import android.app.Activity;
+
+/**
+ * @author: Kongzue
+ * @github: https://github.com/kongzue/
+ * @homepage: http://kongzue.com/
+ * @mail: myzcxhh@live.cn
+ * @createTime: 2021/12/20 15:21
+ */
+public interface ActivityRunnable {
+    void run(Activity activity);
+}

+ 116 - 0
DialogX/src/main/java/com/kongzue/dialogx/util/DialogXFloatingWindowActivity.java

@@ -0,0 +1,116 @@
+package com.kongzue.dialogx.util;
+
+import android.app.Activity;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.MotionEvent;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.kongzue.dialogx.R;
+import com.kongzue.dialogx.dialogs.PopTip;
+import com.kongzue.dialogx.interfaces.BaseDialog;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author: Kongzue
+ * @github: https://github.com/kongzue/
+ * @homepage: http://kongzue.com/
+ * @mail: myzcxhh@live.cn
+ * @createTime: 2021/12/20 14:58
+ */
+public class DialogXFloatingWindowActivity extends AppCompatActivity {
+    
+    static WeakReference<DialogXFloatingWindowActivity> dialogXFloatingWindowActivity;
+    int fromActivityHashCode;
+    List<String> shownDialogXList = new ArrayList<>();
+    
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        dialogXFloatingWindowActivity = new WeakReference<>(this);
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.layout_dialogx_empty);
+        
+        int fromActivityUiStatus = getIntent().getIntExtra("fromActivityUiStatus", 0);
+        if (fromActivityUiStatus == 0) {
+            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
+        } else {
+            getWindow().getDecorView().setSystemUiVisibility(fromActivityUiStatus | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
+        }
+        
+        setFromActivityHashCode(getIntent().getIntExtra("from", 0));
+        String dialogXKey;
+        ActivityRunnable activityRunnable = BaseDialog.getActivityRunnable(dialogXKey = getIntent().getStringExtra("dialogXKey"));
+        if (activityRunnable == null) {
+            finish();
+        } else {
+            shownDialogXList.add(dialogXKey);
+            activityRunnable.run(this);
+        }
+        
+        getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                if (event.getAction() != MotionEvent.ACTION_CANCEL) {
+                    return ((Activity) BaseDialog.getContext()).dispatchTouchEvent(event);
+                }
+                return false;
+            }
+        });
+    }
+    
+    public boolean isSameFrom(int fromActivityHashCode) {
+        return fromActivityHashCode == this.fromActivityHashCode;
+    }
+    
+    public void showDialogX(String dialogXKey) {
+        ActivityRunnable activityRunnable = BaseDialog.getActivityRunnable(dialogXKey);
+        if (activityRunnable != null) {
+            shownDialogXList.add(dialogXKey);
+            activityRunnable.run(this);
+        }
+    }
+    
+    public int getFromActivityHashCode() {
+        return fromActivityHashCode;
+    }
+    
+    public DialogXFloatingWindowActivity setFromActivityHashCode(int fromActivityHashCode) {
+        this.fromActivityHashCode = fromActivityHashCode;
+        return this;
+    }
+    
+    public static DialogXFloatingWindowActivity getDialogXFloatingWindowActivity() {
+        if (dialogXFloatingWindowActivity == null) return null;
+        return dialogXFloatingWindowActivity.get();
+    }
+    
+    public void finish(String dialogXKey) {
+        shownDialogXList.remove(dialogXKey);
+        if (shownDialogXList.isEmpty()) {
+            dialogXFloatingWindowActivity.clear();
+            dialogXFloatingWindowActivity = null;
+            super.finish();
+            int version = Integer.valueOf(Build.VERSION.SDK_INT);
+            if (version > 5) {
+                overridePendingTransition(0, 0);
+            }
+        }
+    }
+    
+    public void finish() {
+        dialogXFloatingWindowActivity.clear();
+        dialogXFloatingWindowActivity = null;
+        super.finish();
+        int version = Integer.valueOf(Build.VERSION.SDK_INT);
+        if (version > 5) {
+            overridePendingTransition(0, 0);
+        }
+    }
+}

+ 6 - 0
DialogX/src/main/res/layout/layout_dialogx_empty.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</RelativeLayout>

+ 16 - 0
DialogX/src/main/res/values-v21/styles.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <style name="DialogXFloatingWindow" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="android:windowAnimationStyle">@style/DialogXNoAnimation</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowBackground">@color/empty</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:windowFrame">@null</item>
+        <item name="android:windowIsFloating">false</item>
+        <item name="android:backgroundDimEnabled">false</item>
+        <item name="android:navigationBarColor">@color/empty</item>
+        <item name="android:statusBarColor">@color/empty</item>
+    </style>
+</resources>

+ 25 - 0
DialogX/src/main/res/values/styles.xml

@@ -9,4 +9,29 @@
         <item name="android:windowBackground">@android:color/transparent</item>
     </style>
 
+    <style name="DialogXFloatingWindow" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="android:windowAnimationStyle">@style/DialogXNoAnimation</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowBackground">@color/empty</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="android:windowFrame">@null</item>
+        <item name="android:windowIsFloating">false</item>
+        <item name="android:backgroundDimEnabled">false</item>
+    </style>
+
+    <style name="DialogXNoAnimation">
+        <item name="android:activityOpenEnterAnimation">@null</item>
+        <item name="android:activityOpenExitAnimation">@null</item>
+        <item name="android:activityCloseEnterAnimation">@null</item>
+        <item name="android:activityCloseExitAnimation">@null</item>
+        <item name="android:taskOpenEnterAnimation">@null</item>
+        <item name="android:taskOpenExitAnimation">@null</item>
+        <item name="android:taskCloseEnterAnimation">@null</item>
+        <item name="android:taskCloseExitAnimation">@null</item>
+        <item name="android:taskToFrontEnterAnimation">@null</item>
+        <item name="android:taskToFrontExitAnimation">@null</item>
+        <item name="android:taskToBackEnterAnimation">@null</item>
+        <item name="android:taskToBackExitAnimation">@null</item>
+    </style>
 </resources>

+ 11 - 2
app/src/main/AndroidManifest.xml

@@ -12,8 +12,9 @@
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
-        <activity android:name=".activity.AppCompatActivityTest"
-            android:windowSoftInputMode="adjustResize"/>
+        <activity
+            android:name=".activity.AppCompatActivityTest"
+            android:windowSoftInputMode="adjustResize" />
         <activity
             android:name=".activity.MainActivity"
             android:configChanges="orientation|keyboardHidden|screenSize|uiMode|screenLayout|smallestScreenSize|layoutDirection">
@@ -23,6 +24,14 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <activity
+            android:name="com.kongzue.dialogx.util.DialogXFloatingWindowActivity"
+            android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|locale|touchscreen|keyboard|navigation|fontScale"
+            android:exported="false"
+            android:theme="@style/DialogXFloatingWindow"
+            android:windowSoftInputMode="adjustResize" />
+
     </application>
 
 </manifest>

+ 9 - 0
app/src/main/java/com/kongzue/dialogxdemo/activity/MainActivity.java

@@ -62,6 +62,7 @@ import com.kongzue.dialogx.style.IOSStyle;
 import com.kongzue.dialogx.style.KongzueStyle;
 import com.kongzue.dialogx.style.MIUIStyle;
 import com.kongzue.dialogx.style.MaterialStyle;
+import com.kongzue.dialogx.util.DialogXFloatingWindowActivity;
 import com.kongzue.dialogx.util.TextInfo;
 import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
 import com.kongzue.dialogxdemo.BuildConfig;
@@ -89,6 +90,7 @@ public class MainActivity extends BaseActivity {
     private RadioButton rdoModeView;
     private RadioButton rdoModeWindow;
     private RadioButton rdoModeDialogFragment;
+    private RadioButton rdoModeFloatingActivity;
     private RadioGroup grpStyle;
     private RadioButton rdoMaterial;
     private RadioButton rdoIos;
@@ -140,6 +142,7 @@ public class MainActivity extends BaseActivity {
         rdoModeView = findViewById(R.id.rdo_mode_view);
         rdoModeWindow = findViewById(R.id.rdo_mode_window);
         rdoModeDialogFragment = findViewById(R.id.rdo_mode_dialogFragment);
+        rdoModeFloatingActivity = findViewById(R.id.rdo_mode_floatingActivity);
         grpStyle = findViewById(R.id.grp_style);
         rdoMaterial = findViewById(R.id.rdo_material);
         rdoIos = findViewById(R.id.rdo_ios);
@@ -224,6 +227,9 @@ public class MainActivity extends BaseActivity {
             case DIALOG_FRAGMENT:
                 rdoModeDialogFragment.setChecked(true);
                 break;
+            case FLOATING_ACTIVITY:
+                rdoModeFloatingActivity.setChecked(true);
+                break;
         }
         
         txtVer.setText("当前版本:" + BuildConfig.VERSION_NAME);
@@ -270,6 +276,9 @@ public class MainActivity extends BaseActivity {
                     case R.id.rdo_mode_dialogFragment:
                         DialogX.implIMPLMode = DialogX.IMPL_MODE.DIALOG_FRAGMENT;
                         break;
+                    case R.id.rdo_mode_floatingActivity:
+                        DialogX.implIMPLMode = DialogX.IMPL_MODE.FLOATING_ACTIVITY;
+                        break;
                 }
             }
         });

+ 18 - 0
app/src/main/res/layout/activity_main.xml

@@ -111,6 +111,14 @@
                     android:textSize="14dp"
                     android:textStyle="bold" />
 
+
+                <HorizontalScrollView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:fadingEdge="horizontal"
+                    android:requiresFadingEdge="horizontal"
+                    android:scrollbars="none">
+
                 <RadioGroup
                     android:id="@+id/grp_mode"
                     android:layout_width="match_parent"
@@ -146,8 +154,18 @@
                         android:text="DialogFragment"
                         android:textColor="#7b000000" />
 
+                    <RadioButton
+                        android:id="@+id/rdo_mode_floatingActivity"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:padding="10dp"
+                        android:text="FloatingActivity"
+                        android:textColor="#7b000000" />
+
                 </RadioGroup>
 
+                </HorizontalScrollView>
+
                 <TextView
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"

+ 1 - 1
gradle.properties

@@ -18,5 +18,5 @@ android.useAndroidX=true
 # Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=true
 
-BUILD_VERSION=0.0.44.alpha6
+BUILD_VERSION=0.0.44.beta7
 BUILD_VERSION_INT=43