Skip to content

Commit 2534f46

Browse files
authored
Merge pull request #132 from aryaveer0710/flagFocusable
Added check to make overlay window focusable
2 parents 917ac5c + d91f6b0 commit 2534f46

File tree

5 files changed

+34
-18
lines changed

5 files changed

+34
-18
lines changed

android/src/main/java/in/jvapps/system_alert_window/services/WindowServiceNew.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public class WindowServiceNew extends Service implements View.OnTouchListener {
5858
private int windowHeight;
5959

6060
private boolean isDisableClicks = false;
61+
private boolean isFlagFocusable = false;
6162

6263
private FlutterView flutterView;
6364

@@ -137,6 +138,7 @@ private void setWindowManager() {
137138

138139
private void setWindowLayoutFromMap(HashMap<String, Object> paramsMap) {
139140
isDisableClicks = Commons.getIsClicksDisabled(paramsMap);
141+
isFlagFocusable = Commons.getIsFlagFocusable(paramsMap);
140142
LogUtils.getInstance().i(TAG, String.valueOf(isDisableClicks));
141143
windowGravity = (String) paramsMap.get(Constants.KEY_GRAVITY);
142144
windowWidth = NumberUtils.getInt(paramsMap.get(Constants.KEY_WIDTH));
@@ -152,18 +154,19 @@ private WindowManager.LayoutParams getLayoutParams() {
152154
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
153155
params.type = android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
154156
if (isDisableClicks) {
155-
params.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
157+
params.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
156158
} else {
157-
params.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
159+
params.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED ;
158160
}
159161
} else {
160162
params.type = android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
161163
if (isDisableClicks) {
162-
params.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
164+
params.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
163165
} else {
164-
params.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
166+
params.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
165167
}
166168
}
169+
if(!isFlagFocusable) params.flags|= android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
167170
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && isDisableClicks) {
168171
params.alpha = 0.8f;
169172
}

android/src/main/java/in/jvapps/system_alert_window/utils/Commons.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static android.content.Context.ACTIVITY_SERVICE;
44
import static in.jvapps.system_alert_window.utils.Constants.KEY_BACKGROUND_COLOR;
55
import static in.jvapps.system_alert_window.utils.Constants.KEY_IS_DISABLE_CLICKS;
6+
import static in.jvapps.system_alert_window.utils.Constants.KEY_IS_FLAG_FOCUSABLE;
67

78
import android.app.ActivityManager;
89
import android.content.Context;
@@ -45,6 +46,15 @@ public static boolean getIsClicksDisabled(@NonNull Map<String, Object> paramsMap
4546
}
4647

4748

49+
public static boolean getIsFlagFocusable(@NonNull Map<String, Object> paramsMap) {
50+
Object isFlagFocusable = paramsMap.get(KEY_IS_FLAG_FOCUSABLE);
51+
if(isFlagFocusable != null){
52+
return (Boolean) isFlagFocusable;
53+
}
54+
return false;
55+
}
56+
57+
4858
public static int getPixelsFromDp(@NonNull Context context, int dp) {
4959
if (dp == -1) return -1;
5060
return (int) (TypedValue.applyDimension(

android/src/main/java/in/jvapps/system_alert_window/utils/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class Constants {
1717
public static final String KEY_FOOTER = "footer";
1818
public static final String KEY_IS_SHOW_FOOTER = "isShowFooter";
1919
public static final String KEY_IS_DISABLE_CLICKS = "isDisableClicks";
20+
public static final String KEY_IS_FLAG_FOCUSABLE = "isFlagFocusable";
2021
public static final String KEY_GRAVITY = "gravity";
2122
public static final String KEY_WIDTH = "width";
2223
public static final String KEY_HEIGHT = "height";

example/lib/main.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ class _MyAppState extends State<MyApp> {
5858

5959
@override
6060
void dispose() {
61-
SystemAlertWindow.removeOnClickListener();
6261
super.dispose();
6362
}
6463

@@ -91,11 +90,11 @@ class _MyAppState extends State<MyApp> {
9190
if (!_isShowingWindow) {
9291
await SystemAlertWindow.sendMessageToOverlay('show system window');
9392
SystemAlertWindow.showSystemWindow(
94-
height: 200,
95-
width: MediaQuery.of(context).size.width.floor(),
96-
gravity: SystemWindowGravity.CENTER,
97-
prefMode: prefMode,
98-
);
93+
height: 200,
94+
width: MediaQuery.of(context).size.width.floor(),
95+
gravity: SystemWindowGravity.CENTER,
96+
prefMode: prefMode,
97+
isFlagFocusable: false);
9998
setState(() {
10099
_isShowingWindow = true;
101100
});
@@ -106,6 +105,7 @@ class _MyAppState extends State<MyApp> {
106105
width: MediaQuery.of(context).size.width.floor(),
107106
gravity: SystemWindowGravity.CENTER,
108107
prefMode: prefMode,
108+
isFlagFocusable: true,
109109
isDisableClicks: true);
110110
setState(() {
111111
_isUpdatedWindow = true;

lib/system_alert_window.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,6 @@ class SystemAlertWindow {
4141
return await _channel.invokeMethod('requestPermissions', [Commons.getSystemWindowPrefMode(prefMode)]);
4242
}
4343

44-
static Future<bool> removeOnClickListener() async {
45-
return await _channel.invokeMethod("removeCallBackHandler");
46-
}
47-
4844
/// Show System Window
4945
///
5046
/// `gravity` Position of the window and default is [SystemWindowGravity.CENTER]
@@ -54,19 +50,22 @@ class SystemAlertWindow {
5450
/// `notificationBody` Notification body, applicable in case of bubble
5551
/// `prefMode` Preference for the system window. Default is [SystemWindowPrefMode.DEFAULT]
5652
/// `isDisableClicks` Disables the clicks across the system window. Default is false. This is not applicable for bubbles.
53+
/// `isFlagFocusable` Makes the overlay window focusable. Default is false.
5754
static Future<bool?> showSystemWindow(
5855
{SystemWindowGravity gravity = SystemWindowGravity.CENTER,
5956
int? width,
6057
int? height,
6158
String notificationTitle = "Title",
6259
String notificationBody = "Body",
6360
SystemWindowPrefMode prefMode = SystemWindowPrefMode.DEFAULT,
64-
bool isDisableClicks = false}) async {
61+
bool isDisableClicks = false,
62+
bool isFlagFocusable = false}) async {
6563
final Map<String, dynamic> params = <String, dynamic>{
6664
'gravity': Commons.getWindowGravity(gravity),
6765
'width': width ?? Constants.MATCH_PARENT,
6866
'height': height ?? Constants.WRAP_CONTENT,
69-
'isDisableClicks': isDisableClicks
67+
'isDisableClicks': isDisableClicks,
68+
'isFlagFocusable': isFlagFocusable
7069
};
7170
return await _channel.invokeMethod('showSystemWindow', [notificationTitle, notificationBody, params, Commons.getSystemWindowPrefMode(prefMode)]);
7271
}
@@ -80,19 +79,22 @@ class SystemAlertWindow {
8079
/// `notificationBody` Notification body, applicable in case of bubble
8180
/// `prefMode` Preference for the system window. Default is [SystemWindowPrefMode.DEFAULT]
8281
/// `isDisableClicks` Disables the clicks across the system window. Default is false. This is not applicable for bubbles.
82+
/// `isFlagFocusable`Makes the overlay window focusable. Default is false.
8383
static Future<bool?> updateSystemWindow(
8484
{SystemWindowGravity gravity = SystemWindowGravity.CENTER,
8585
int? width,
8686
int? height,
8787
String notificationTitle = "Title",
8888
String notificationBody = "Body",
8989
SystemWindowPrefMode prefMode = SystemWindowPrefMode.DEFAULT,
90-
bool isDisableClicks = false}) async {
90+
bool isDisableClicks = false,
91+
bool isFlagFocusable = false}) async {
9192
final Map<String, dynamic> params = <String, dynamic>{
9293
'gravity': Commons.getWindowGravity(gravity),
9394
'width': width ?? Constants.MATCH_PARENT,
9495
'height': height ?? Constants.WRAP_CONTENT,
95-
'isDisableClicks': isDisableClicks
96+
'isDisableClicks': isDisableClicks,
97+
'isFlagFocusable': isFlagFocusable
9698
};
9799
return await _channel
98100
.invokeMethod('updateSystemWindow', [notificationTitle, notificationBody, params, Commons.getSystemWindowPrefMode(prefMode)]);

0 commit comments

Comments
 (0)