diff --git a/app.json b/app.json
index 19aa076..30c5f79 100644
--- a/app.json
+++ b/app.json
@@ -3,9 +3,24 @@
"name": "JR四国運行状況",
"slug": "jrshikoku",
"privacy": "public",
- "platforms": [
- "ios",
- "android"
+ "platforms": ["ios", "android"],
+ "plugins": [
+ [
+ "react-native-android-widget",
+ {
+ "widgets": [
+ {
+ "name": "JR_shikoku_train_info",
+ "label": "My Hello Widget",
+ "minWidth": "320dp",
+ "minHeight": "120dp",
+ "description": "This is my first widget",
+ "previewImage": "./assets/icon.png",
+ "updatePeriodMillis": 1800000
+ }
+ ]
+ }
+ ]
],
"version": "4.6",
"orientation": "default",
@@ -19,9 +34,7 @@
"fallbackToCacheTimeout": 0,
"url": "https://u.expo.dev/398abf60-57a7-11e9-970c-8f04356d08bf"
},
- "assetBundlePatterns": [
- "**/*"
- ],
+ "assetBundlePatterns": ["**/*"],
"ios": {
"buildNumber": "31",
"supportsTablet": true,
@@ -33,9 +46,7 @@
"android": {
"package": "jrshikokuinfo.xprocess.hrkn",
"versionCode": 20,
- "permissions": [
- "ACCESS_FINE_LOCATION"
- ],
+ "permissions": ["ACCESS_FINE_LOCATION"],
"googleServicesFile": "./google-services.json",
"config": {
"googleMaps": {
diff --git a/components/AndroidWidget/HelloWidget.jsx b/components/AndroidWidget/HelloWidget.jsx
new file mode 100644
index 0000000..12741ad
--- /dev/null
+++ b/components/AndroidWidget/HelloWidget.jsx
@@ -0,0 +1,88 @@
+import React from "react";
+import { FlexWidget, TextWidget } from "react-native-android-widget";
+
+export function HelloWidget({ time, delayString }) {
+ return (
+
+
+
+
+
+
+
+ {delayString ? (
+ delayString.map((d) => {
+ let data = d.split(" ");
+ return (
+
+
+
+
+
+ );
+ })
+ ) : (
+
+ 現在、5分以上の遅れはありません。
+
+ )}
+
+
+ );
+}
diff --git a/components/AndroidWidget/HelloWidgetPreviewScreen.jsx b/components/AndroidWidget/HelloWidgetPreviewScreen.jsx
new file mode 100644
index 0000000..c2fa761
--- /dev/null
+++ b/components/AndroidWidget/HelloWidgetPreviewScreen.jsx
@@ -0,0 +1,25 @@
+import * as React from "react";
+import { StyleSheet, View } from "react-native";
+import { WidgetPreview } from "react-native-android-widget";
+
+import { HelloWidget } from "./HelloWidget";
+
+export function HelloWidgetPreviewScreen() {
+ return (
+
+ }
+ width={320}
+ height={200}
+ />
+
+ );
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ alignItems: "center",
+ justifyContent: "center",
+ },
+});
diff --git a/components/AndroidWidget/widget-task-handler.jsx b/components/AndroidWidget/widget-task-handler.jsx
new file mode 100644
index 0000000..f644228
--- /dev/null
+++ b/components/AndroidWidget/widget-task-handler.jsx
@@ -0,0 +1,55 @@
+import React from "react";
+import { HelloWidget } from "./HelloWidget";
+import dayjs from "dayjs";
+import { ToastAndroid } from "react-native";
+
+const nameToWidget = {
+ // Hello will be the **name** with which we will reference our widget.
+ JR_shikoku_train_info: HelloWidget,
+};
+
+export async function widgetTaskHandler(props) {
+ const widgetInfo = props.widgetInfo;
+ const Widget = nameToWidget[widgetInfo.widgetName];
+ const time = dayjs().format("HH:mm");
+ ToastAndroid.show(
+ `Widget Action: ${props.widgetAction} ${time}`,
+ ToastAndroid.SHORT
+ );
+ const delayString = await fetch(
+ "https://script.google.com/macros/s/AKfycbyKxch7z7l8e07LXulRHqxjVoIiB13kcgvoToLE-rqlxLmLSKdlmqz0FI1F2EuA7Zfg/exec"
+ )
+ .then((response) => response.text())
+ .then((data) => {
+ if (data !== "") {
+ return data.split("^");
+ }
+ return null;
+ });
+ ToastAndroid.show(`${delayString}`, ToastAndroid.SHORT);
+ switch (props.widgetAction) {
+ case "WIDGET_ADDED":
+ case "WIDGET_UPDATE":
+ // Not needed for now
+ case "WIDGET_CLICK":
+ // Not needed for now
+ case "WIDGET_RESIZED":
+ // Not needed for now
+ props.renderWidget();
+
+ break;
+
+ break;
+
+ break;
+
+ case "WIDGET_DELETED":
+ // Not needed for now
+ break;
+
+ break;
+
+ default:
+ break;
+ }
+}
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..9f717eb
--- /dev/null
+++ b/index.js
@@ -0,0 +1,11 @@
+import { registerRootComponent } from "expo";
+import { registerWidgetTaskHandler } from "react-native-android-widget";
+
+import App from "./App";
+import { widgetTaskHandler } from "./components/AndroidWidget/widget-task-handler";
+
+// registerRootComponent calls AppRegistry.registerComponent('main', () => App);
+// It also ensures that whether you load the app in Expo Go or in a native build,
+// the environment is set up appropriately
+registerRootComponent(App);
+registerWidgetTaskHandler(widgetTaskHandler);
diff --git a/package.json b/package.json
index bb9b5d2..a581036 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,5 @@
{
- "main": "node_modules/expo/AppEntry.js",
+ "main": "index.js",
"scripts": {
"start": "expo start",
"android": "expo start --android",
@@ -31,6 +31,7 @@
"react": "18.2.0",
"react-native": "0.72.6",
"react-native-actions-sheet": "0.8.21",
+ "react-native-android-widget": "^0.11.2",
"react-native-auto-height-image": "^3.2.4",
"react-native-elements": "^3.4.2",
"react-native-gesture-handler": "~2.12.0",
diff --git a/yarn.lock b/yarn.lock
index f14e0f2..a62d5b4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8684,6 +8684,11 @@ react-native-actions-sheet@0.8.21:
resolved "https://registry.yarnpkg.com/react-native-actions-sheet/-/react-native-actions-sheet-0.8.21.tgz#d9175e7d5d862217f990b2ccc8a216fb4fc35b06"
integrity sha512-WUtrGbPSlY8YuVSxKVJ36f3PrVMGMOQ5Cp5dtpurc71Uih4LEGGhEEk8yme/QOquiGsu77be0sZT4CrSUOSXag==
+react-native-android-widget@^0.11.2:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/react-native-android-widget/-/react-native-android-widget-0.11.2.tgz#541cc4931f6cf362b533d0e079a740ee595cd88e"
+ integrity sha512-Ro4inoMaXFtcMX/9p+O+e/Cm0ckg6tkbIB/PFdF+xX90+B/2sWjXDL9qgGRAsFN7Auj38hMqTl8bWBlImFCC2A==
+
react-native-auto-height-image@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/react-native-auto-height-image/-/react-native-auto-height-image-3.2.4.tgz#c7a95d4d9701055c680c8dc02076def1107f9522"