Begining to refactor intent receivers to support GPX imports from more sources
This commit is contained in:
parent
8242680137
commit
f82181347c
|
@ -46,8 +46,32 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="application/gpx+xml" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND" />
|
<action android:name="android.intent.action.SEND" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="application/xml" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="application/xml" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<data android:mimeType="text/xml" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
<data android:mimeType="text/xml" />
|
<data android:mimeType="text/xml" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
@ -70,8 +94,10 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.darryncampbell.cordova.plugin.intent.ACTION"/>
|
<action
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
android:name="com.darryncampbell.cordova.plugin.intent.ACTION"
|
||||||
|
/>
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter android:autoVerify="true">
|
<intent-filter android:autoVerify="true">
|
||||||
|
|
|
@ -53,6 +53,7 @@ import Invitation, {
|
||||||
import { returnOrUpdate } from 'ol/extent';
|
import { returnOrUpdate } from 'ol/extent';
|
||||||
import Updater from '../updater';
|
import Updater from '../updater';
|
||||||
import SystemDrawer from '../system-drawer';
|
import SystemDrawer from '../system-drawer';
|
||||||
|
import { receiveIntent } from '../../lib/intent-receivers';
|
||||||
|
|
||||||
const [getState, setState] = createSignal({
|
const [getState, setState] = createSignal({
|
||||||
lon: 0,
|
lon: 0,
|
||||||
|
@ -101,6 +102,9 @@ const Map: Component = () => {
|
||||||
if (searchInvitationInIntent(intent)) {
|
if (searchInvitationInIntent(intent)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (receiveIntent(intent)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (intent.action === 'android.intent.action.VIEW') {
|
if (intent.action === 'android.intent.action.VIEW') {
|
||||||
const url = new URL(intent.data);
|
const url = new URL(intent.data);
|
||||||
console.log({ caller: 'Intent receiver', intent, url });
|
console.log({ caller: 'Intent receiver', intent, url });
|
||||||
|
@ -166,13 +170,6 @@ const Map: Component = () => {
|
||||||
if (matches) {
|
if (matches) {
|
||||||
findLocation(navigate, [matches[3], matches[2]]);
|
findLocation(navigate, [matches[3], matches[2]]);
|
||||||
}
|
}
|
||||||
} else if (
|
|
||||||
intent.action === 'android.intent.action.SEND' &&
|
|
||||||
!!intent.extras['android.intent.extra.STREAM']
|
|
||||||
) {
|
|
||||||
const uri = intent.extras['android.intent.extra.STREAM'];
|
|
||||||
// intent.type is 'image/*' for gallery share
|
|
||||||
importUrls([uri]);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
import { importUrls } from '../../components/import';
|
||||||
|
|
||||||
|
const ACCEPTED_ACTIONS = [
|
||||||
|
'android.intent.action.VIEW',
|
||||||
|
'android.intent.action.SEND',
|
||||||
|
];
|
||||||
|
|
||||||
|
const ACCEPTED_PROTOCOLS = ['content:'];
|
||||||
|
|
||||||
|
const ACCEPTED_TYPES = [
|
||||||
|
'application/xml',
|
||||||
|
'application/gpx+xml',
|
||||||
|
'text/xml',
|
||||||
|
'text/plain',
|
||||||
|
'image/*',
|
||||||
|
'image/jpeg',
|
||||||
|
];
|
||||||
|
|
||||||
|
export const gpxReceiver = (intent: any, url: URL | undefined) => {
|
||||||
|
if (!ACCEPTED_ACTIONS.includes(intent.action)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!url) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ACCEPTED_PROTOCOLS.includes(url.protocol)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
importUrls([url.toString()]);
|
||||||
|
return true;
|
||||||
|
};
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { gpxReceiver } from './gpx-receiver';
|
||||||
|
|
||||||
|
const receivers = {
|
||||||
|
gpxReceiver,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const receiveIntent = (intent: any) => {
|
||||||
|
let url: URL | undefined;
|
||||||
|
try {
|
||||||
|
url = new URL(
|
||||||
|
intent.extras && intent.extras['android.intent.extra.STREAM']
|
||||||
|
? intent.extras['android.intent.extra.STREAM']
|
||||||
|
: intent.data
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.error({ caller: 'receiveIntent / URL', error });
|
||||||
|
}
|
||||||
|
|
||||||
|
const found = Object.values(receivers).some((receiver) =>
|
||||||
|
receiver(intent, url)
|
||||||
|
);
|
||||||
|
|
||||||
|
return found;
|
||||||
|
};
|
Loading…
Reference in New Issue