Skip to content

Commit ce4683d

Browse files
committed
feat(app): add edge gesture listener and toggle button
1 parent 3b4933f commit ce4683d

2 files changed

Lines changed: 50 additions & 5 deletions

File tree

android/app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
android:label="@string/app_name"
99
android:roundIcon="@mipmap/ic_launcher_round"
1010
android:supportsRtl="true"
11+
android:enableOnBackInvokedCallback="true"
1112
android:theme="@style/AppTheme">
1213

14+
1315
<activity
1416
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation|density"
1517
android:name="com.capacitorjs.app.testapp.MainActivity"

src/pages/App.tsx

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,38 @@ import {
1717
ExceptionCode,
1818
PluginListenerHandle,
1919
} from '@capacitor/core';
20-
import { App, AppState } from '@capacitor/app';
20+
import { App, AppState, EdgeGestureListenerEvent } from '@capacitor/app';
2121
import { AppLauncher } from '@capacitor/app-launcher';
2222

23+
function sortedStringify(obj: unknown, indent: number = 2): string {
24+
return JSON.stringify(
25+
obj,
26+
(key: string, value: unknown) => {
27+
if (value && typeof value === 'object' && !Array.isArray(value)) {
28+
return Object.keys(value as object)
29+
.sort()
30+
.reduce<Record<string, unknown>>((acc, k) => {
31+
acc[k] = (value as Record<string, unknown>)[k];
32+
return acc;
33+
}, {});
34+
}
35+
return value;
36+
},
37+
indent,
38+
);
39+
}
40+
2341
const AppPage: React.FC = () => {
2442
const [appInfoJson, setAppInfoJson] = useState('');
43+
const [gestureInfoJson, setGestureInfoJson] = useState('');
44+
const [edgeHandlingEnabled, setEdgeHandlingEnabled] =
45+
useState<boolean>(false);
2546
let stateChangeHandler: PluginListenerHandle;
2647
let pauseHandler: PluginListenerHandle;
2748
let resumeHandler: PluginListenerHandle;
2849
let urlOpenHandler: PluginListenerHandle;
2950
let restoredResultHandler: PluginListenerHandle;
51+
let edgeGestureHandler: PluginListenerHandle;
3052

3153
useIonViewDidEnter(() => {
3254
setListeners();
@@ -61,6 +83,14 @@ const AppPage: React.FC = () => {
6183
console.log('Restored result:', data);
6284
},
6385
);
86+
87+
edgeGestureHandler = await App.addListener(
88+
'edgeGesture',
89+
(data: EdgeGestureListenerEvent) => {
90+
console.log('gesture info', data);
91+
setGestureInfoJson(sortedStringify(data, 2));
92+
},
93+
);
6494
};
6595

6696
const getLaunchUrl = async () => {
@@ -123,12 +153,18 @@ const AppPage: React.FC = () => {
123153
setAppInfoJson(JSON.stringify(info, null, 2));
124154
};
125155

156+
const toggleEdgeGestureHandlers = async () => {
157+
await App.toggleEdgeGestureHandler({ enabled: !edgeHandlingEnabled });
158+
setEdgeHandlingEnabled(!edgeHandlingEnabled);
159+
};
160+
126161
useIonViewDidLeave(() => {
127162
stateChangeHandler.remove();
128163
urlOpenHandler.remove();
129164
restoredResultHandler.remove();
130165
pauseHandler.remove();
131166
resumeHandler.remove();
167+
edgeGestureHandler.remove();
132168
});
133169

134170
return (
@@ -168,29 +204,36 @@ const AppPage: React.FC = () => {
168204
<IonButton expand="block" onClick={getAppLanguage}>
169205
Get App Language
170206
</IonButton>
171-
<IonButton expand="block" href="https://flems.io/#0=N4IgzgpgNhDGAuEAmIBcIB0ALeBbKIANCAGYCWMYaA2qAHYCGuEamO+RIsA9nYn6wA8WAIwA+ADp1BDAARYAThBIBeCSDJ8IfVAHpdWbswDEASS18A3GFhYIzFT1wZYDAA4NYZeNwUArMAx3NwxEMHhgyw9YAGsGAHMIRyMXd09vXwCgtxCwiJzLT3gyXhUGOiQFbjIkDE1+eCCEEroMADVTAFEAdUttJEt1STpZWQAVCHDUWQB5N21ZAEEABWWpQV0GYY3RMU5IGGbeKnQAJlQRADYQAF9CeiYWdAwAzh4LeCE5RWU1LhTXNEMv5AsFQpN8m49AYjBAAPwkKq4FRICAQNxQTQxIZjToAZTGGy2+2gcGKx1YAAZUJcAOy3e4gRjMVguMBUYjvBqsW4AXRuQA">
172-
{/* If the link above ever expires, this is the HTML to test opening an intent for this app.
207+
<IonButton
208+
expand="block"
209+
href="https://flems.io/#0=N4IgzgpgNhDGAuEAmIBcIB0ALeBbKIANCAGYCWMYaA2qAHYCGuEamO+RIsA9nYn6wA8WAIwA+ADp1BDAARYAThBIBeCSDJ8IfVAHpdWbswDEASS18A3GFhYIzFT1wZYDAA4NYZeNwUArMAx3NwxEMHhgyw9YAGsGAHMIRyMXd09vXwCgtxCwiJzLT3gyXhUGOiQFbjIkDE1+eCCEEroMADVTAFEAdUttJEt1STpZWQAVCHDUWQB5N21ZAEEABWWpQV0GYY3RMU5IGGbeKnQAJlQRADYQAF9CeiYWdAwAzh4LeCE5RWU1LhTXNEMv5AsFQpN8m49AYjBAAPwkKq4FRICAQNxQTQxIZjToAZTGGy2+2gcGKx1YAAZUJcAOy3e4gRjMVguMBUYjvBqsW4AXRuQA">
210+
{/* If the link above ever expires, this is the HTML to test opening an intent for this app.
173211
<h1>
174212
<a href="intent://home#Intent;scheme=com.capacitorjs.app.testapp;package=com.capacitorjs.app.testapp;action=android.intent.action.VIEW;end;">
175213
Test: Open APP
176214
</a>
177215
</h1> */}
178216
Test Intents
179217
</IonButton>
218+
<IonButton expand="block" onClick={toggleEdgeGestureHandlers}>
219+
Toggle `edgeGesture` Listener
220+
</IonButton>
180221
<p>
181222
<a href="tel:212-549-2543">Telephone Test</a>
182223
<a href="mailto:name@email.com">Email Test</a>
183224
<a
184225
href="https://capacitorjs.com/"
185226
target="_blank"
186-
rel="noopener noreferrer"
187-
>
227+
rel="noopener noreferrer">
188228
Read more
189229
</a>
190230
</p>
191231
<div>
192232
<pre>{appInfoJson}</pre>
193233
</div>
234+
<div>
235+
<pre>{gestureInfoJson}</pre>
236+
</div>
194237
</IonContent>
195238
</IonPage>
196239
);

0 commit comments

Comments
 (0)