This commit is contained in:
jjbrunton committed 2026-02-01 17:01:09 +00:00
1 parent 4c18afaeae
commit 785e73d6c0
19 files changed
+3808 -4748

No files matched your search

+2 -2
View File
@@ -91,8 +91,8 @@ android {
applicationId 'com.sauci.app'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 42
versionName "1.0.4"
versionCode 44
versionName "1.0.5"
}
signingConfigs {
debug {
@@ -40,7 +40,7 @@
<data android:scheme="exp+sauci"/>
</intent-filter>
</activity>
<receiver android:name=".widget.LiveDraw" android:exported="false" android:label="Live Draw">
<receiver android:name=".widget.LiveDraw" android:exported="true" android:label="Live Draw">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<action android:name="com.sauci.app.WIDGET_CLICK"/>
@@ -1,6 +1,84 @@
package com.sauci.app.widget;
import com.reactnativeandroidwidget.RNWidgetProvider;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.Base64;
import android.util.TypedValue;
import android.widget.RemoteViews;
public class LiveDraw extends RNWidgetProvider {
import com.sauci.app.R;
public class LiveDraw extends AppWidgetProvider {
private static final String PREFS_NAME_SUFFIX = ".widgetdata";
private static final String KEY_IMAGE = "LiveDrawImage";
private static final int BG_COLOR = 0xFF1A1A2E;
private static final int CORNER_RADIUS_DP = 16;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int widgetId : appWidgetIds) {
updateWidget(context, appWidgetManager, widgetId);
}
}
private void updateWidget(Context context, AppWidgetManager appWidgetManager, int widgetId) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_live_draw);
String base64 = getStoredImage(context);
if (base64 != null && !base64.isEmpty()) {
try {
byte[] bytes = Base64.decode(base64, Base64.DEFAULT);
Bitmap decoded = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
if (decoded != null) {
Bitmap rounded = addRoundedBackground(context, decoded);
views.setImageViewBitmap(R.id.widget_image, rounded);
decoded.recycle();
}
} catch (Exception e) {
setPlaceholder(views);
}
} else {
setPlaceholder(views);
}
appWidgetManager.updateAppWidget(widgetId, views);
}
private String getStoredImage(Context context) {
SharedPreferences prefs = context.getSharedPreferences(
context.getPackageName() + PREFS_NAME_SUFFIX, Context.MODE_PRIVATE);
return prefs.getString(KEY_IMAGE, null);
}
private void setPlaceholder(RemoteViews views) {
views.setImageViewResource(R.id.widget_image, R.drawable.widget_placeholder);
}
private Bitmap addRoundedBackground(Context context, Bitmap drawing) {
float radius = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS_DP,
context.getResources().getDisplayMetrics());
int w = drawing.getWidth();
int h = drawing.getHeight();
Bitmap output = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
bgPaint.setColor(BG_COLOR);
canvas.drawRoundRect(new RectF(0, 0, w, h), radius, radius, bgPaint);
canvas.drawBitmap(drawing, 0, 0, null);
return output;
}
}
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#1A1A2E" />
<corners android:radius="16dp" />
</shape>
</item>
</layer-list>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#1A1A2E">
<ImageView
android:id="@+id/widget_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerInside"
android:contentDescription="@string/widget_livedraw_description" />
</FrameLayout>
@@ -4,18 +4,10 @@
android:minHeight="110dp"
android:targetCellWidth="4"
android:targetCellHeight="2"
android:resizeMode="none"
android:description="@string/widget_livedraw_description"
android:initialLayout="@layout/rn_widget"
android:initialLayout="@layout/widget_live_draw"
android:previewImage="@drawable/livedraw_preview"
android:updatePeriodMillis="1800000"
android:widgetCategory="home_screen">
</appwidget-provider>
+12 -6
View File
@@ -2,7 +2,7 @@
"expo": {
"name": "Sauci",
"slug": "sauci",
"version": "1.0.4",
"version": "1.0.5",
"orientation": "portrait",
"icon": "./assets/icon.png",
"scheme": "app.sauci",
@@ -17,9 +17,11 @@
"supportsTablet": false,
"bundleIdentifier": "com.sauci.app",
"entitlements": {
"com.apple.security.application-groups": ["group.com.sauci.app"]
"com.apple.security.application-groups": [
"group.com.sauci.app"
]
},
"buildNumber": "35",
"buildNumber": "42",
"usesAppleSignIn": true,
"googleServicesFile": "./GoogleService-Info.plist",
"infoPlist": {
@@ -181,7 +183,7 @@
"backgroundColor": "#1a1a2e"
},
"package": "com.sauci.app",
"versionCode": 42,
"versionCode": 44,
"googleServicesFile": "./google-services.json",
"permissions": [
"RECEIVE_BOOT_COMPLETED",
@@ -197,6 +199,7 @@
"favicon": "./assets/favicon.png"
},
"plugins": [
"./plugins/withFixHoisting.js",
"@react-native-firebase/app",
[
"expo-build-properties",
@@ -260,11 +263,14 @@
"targetCellHeight": 2,
"description": "See your shared drawing with your partner.",
"previewImage": "./assets/widget-preview/live-draw.png",
"updatePeriodMillis": 1800000
"updatePeriodMillis": 1800000,
"nativeProvider": true
}
]
}
]
],
"./plugins/withWidgetExported.js",
"./plugins/withNativeWidget.js"
],
"experiments": {
"typedRoutes": true
+28 -22
View File
@@ -264,7 +264,7 @@ PODS:
- SDWebImageSVGCoder (~> 1.7.0)
- ExpoImagePicker (16.0.6):
- ExpoModulesCore
- ExpoKeepAwake (15.0.8):
- ExpoKeepAwake (14.0.3):
- ExpoModulesCore
- ExpoLinearGradient (14.0.2):
- ExpoModulesCore
@@ -304,6 +304,8 @@ PODS:
- ExpoModulesCore
- ExpoWidgets (3.0.2):
- ExpoModulesCore
- ExtensionStorage (1.0.0):
- ExpoModulesCore
- EXUpdatesInterface (1.0.0):
- ExpoModulesCore
- fast_float (6.1.4)
@@ -433,8 +435,8 @@ PODS:
- PromisesObjC (2.4.0)
- PromisesSwift (2.4.0):
- PromisesObjC (= 2.4.0)
- PurchasesHybridCommon (17.28.0):
- RevenueCat (= 5.55.1)
- PurchasesHybridCommon (17.30.1):
- RevenueCat (= 5.56.0)
- RCT-Folly (2024.10.14.00):
- boost
- DoubleConversion
@@ -2052,10 +2054,10 @@ PODS:
- React-logger
- React-perflogger
- React-utils (= 0.76.9)
- RevenueCat (5.55.1)
- RevenueCat (5.56.0)
- RNCAsyncStorage (1.23.1):
- React-Core
- RNFBAnalytics (23.8.3):
- RNFBAnalytics (23.8.5):
- DoubleConversion
- FirebaseAnalytics/Core (= 12.8.0)
- FirebaseAnalytics/IdentitySupport (= 12.8.0)
@@ -2079,7 +2081,7 @@ PODS:
- ReactCommon/turbomodule/core
- RNFBApp
- Yoga
- RNFBApp (23.8.4):
- RNFBApp (23.8.5):
- DoubleConversion
- Firebase/CoreOnly (= 12.8.0)
- glog
@@ -2101,7 +2103,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- RNFBCrashlytics (23.8.4):
- RNFBCrashlytics (23.8.5):
- DoubleConversion
- Firebase/Crashlytics (= 12.8.0)
- FirebaseCoreExtension
@@ -2149,8 +2151,8 @@ PODS:
- RNGoogleSignin (16.1.1):
- GoogleSignIn (~> 9.0)
- React-Core
- RNPurchases (9.7.1):
- PurchasesHybridCommon (= 17.28.0)
- RNPurchases (9.7.5):
- PurchasesHybridCommon (= 17.30.1)
- React-Core
- RNReanimated (3.16.7):
- DoubleConversion
@@ -2286,7 +2288,7 @@ DEPENDENCIES:
- EXJSONUtils (from `../../../node_modules/expo-json-utils/ios`)
- EXManifests (from `../../../node_modules/expo-manifests/ios`)
- EXNotifications (from `../../../node_modules/expo-notifications/ios`)
- Expo (from `../node_modules/expo`)
- Expo (from `../../../node_modules/expo`)
- expo-dev-client (from `../../../node_modules/expo-dev-client/ios`)
- expo-dev-launcher (from `../../../node_modules/expo-dev-launcher`)
- expo-dev-menu (from `../../../node_modules/expo-dev-menu`)
@@ -2309,8 +2311,9 @@ DEPENDENCIES:
- ExpoMediaLibrary (from `../../../node_modules/expo-media-library/ios`)
- ExpoModulesCore (from `../../../node_modules/expo-modules-core`)
- ExpoSecureStore (from `../../../node_modules/expo-secure-store/ios`)
- ExpoSharing (from `../node_modules/expo-sharing/ios`)
- ExpoSharing (from `../../../node_modules/expo-sharing/ios`)
- "ExpoWidgets (from `../../../node_modules/@bittingz/expo-widgets/ios`)"
- "ExtensionStorage (from `../../../node_modules/@bacons/apple-targets/ios`)"
- EXUpdatesInterface (from `../../../node_modules/expo-updates-interface/ios`)
- fast_float (from `../../../node_modules/react-native/third-party-podspecs/fast_float.podspec`)
- FBLazyVector (from `../../../node_modules/react-native/Libraries/FBLazyVector`)
@@ -2388,7 +2391,7 @@ DEPENDENCIES:
- RNPurchases (from `../../../node_modules/react-native-purchases`)
- RNReanimated (from `../../../node_modules/react-native-reanimated`)
- RNScreens (from `../../../node_modules/react-native-screens`)
- RNSVG (from `../node_modules/react-native-svg`)
- RNSVG (from `../../../node_modules/react-native-svg`)
- WidgetBridge (from `../modules/widget-bridge/ios`)
- Yoga (from `../../../node_modules/react-native/ReactCommon/yoga`)
@@ -2443,7 +2446,7 @@ EXTERNAL SOURCES:
EXNotifications:
:path: "../../../node_modules/expo-notifications/ios"
Expo:
:path: "../node_modules/expo"
:path: "../../../node_modules/expo"
expo-dev-client:
:path: "../../../node_modules/expo-dev-client/ios"
expo-dev-launcher:
@@ -2489,9 +2492,11 @@ EXTERNAL SOURCES:
ExpoSecureStore:
:path: "../../../node_modules/expo-secure-store/ios"
ExpoSharing:
:path: "../node_modules/expo-sharing/ios"
:path: "../../../node_modules/expo-sharing/ios"
ExpoWidgets:
:path: "../../../node_modules/@bittingz/expo-widgets/ios"
ExtensionStorage:
:path: "../../../node_modules/@bacons/apple-targets/ios"
EXUpdatesInterface:
:path: "../../../node_modules/expo-updates-interface/ios"
fast_float:
@@ -2644,7 +2649,7 @@ EXTERNAL SOURCES:
RNScreens:
:path: "../../../node_modules/react-native-screens"
RNSVG:
:path: "../node_modules/react-native-svg"
:path: "../../../node_modules/react-native-svg"
WidgetBridge:
:path: "../modules/widget-bridge/ios"
Yoga:
@@ -2678,7 +2683,7 @@ SPEC CHECKSUMS:
ExpoHead: 2a14db58219c0a506e4a409ea83f884eab23f555
ExpoImage: d840b256050f4428d2942bc2b6e9251f9e0d7021
ExpoImagePicker: 24e5ba8da111f74519b1e6dc556e0b438b2b8464
ExpoKeepAwake: 55f75eca6499bb9e4231ebad6f3e9cb8f99c0296
ExpoKeepAwake: b0171a73665bfcefcfcc311742a72a956e6aa680
ExpoLinearGradient: 35ebd83b16f80b3add053a2fd68cc328ed927f60
ExpoLinking: 8d12bee174ba0cdf31239706578e29e74a417402
ExpoLocalAuthentication: eb2be9c7bcdc68e9434d4be4bb5aa5cf7943e816
@@ -2687,6 +2692,7 @@ SPEC CHECKSUMS:
ExpoSecureStore: 9a3665d7161dd1031be386e278bffd623658f316
ExpoSharing: 849a5ce9985c22598c16ec027e32969be8062e8e
ExpoWidgets: 366fe61c681044e13b7cc344bdbd319ff5d54b28
ExtensionStorage: 5796de20bf181317c376d693fedb64c6781a33ba
EXUpdatesInterface: 7c977640bdd8b85833c19e3959ba46145c5719db
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
FBLazyVector: 7605ea4810e0e10ae4815292433c09bf4324ba45
@@ -2713,7 +2719,7 @@ SPEC CHECKSUMS:
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
PurchasesHybridCommon: c2f8f5fcd2e472c585fccd1ab2fe317a3dc1171e
PurchasesHybridCommon: c0bc3edee10a8742e9a238247944b4be044ff177
RCT-Folly: ea9d9256ba7f9322ef911169a9f696e5857b9e17
RCTDeprecation: ebe712bb05077934b16c6bf25228bdec34b64f83
RCTRequired: ca91e5dd26b64f577b528044c962baf171c6b716
@@ -2774,14 +2780,14 @@ SPEC CHECKSUMS:
React-utils: 59c5bbbc0e72be22c9d6eceb40afadf9be872819
ReactCodegen: 52b654894b5771d0085b24d4b1b897ebeaf939dc
ReactCommon: b2eb96a61b826ff327a773a74357b302cf6da678
RevenueCat: 347221fad5ab0ed5636546867deae2c32c64749f
RevenueCat: 9e2a13bead55198a72272ff105a7265e9510cd11
RNCAsyncStorage: aa75595c1aefa18f868452091fa0c411a516ce11
RNFBAnalytics: d1c906bbb01b3a6f6b99d6eaa977f04b1ae5d279
RNFBApp: 5c07dbcf30f00d7ea5400c3faae4e88e000b7685
RNFBCrashlytics: bd6ae7c83468c749e986707c0e54365832b3d237
RNFBAnalytics: 0213dc76b4bf1f83a687376be2ce4e8e395e270b
RNFBApp: 02a70215550d9890516c3b381019f6b0f0543b7c
RNFBCrashlytics: 8ae23057fe4254c5804225f5c328cd05312cc3bf
RNGestureHandler: 2dd124adb171aab16629e9387cf1830957d242c2
RNGoogleSignin: 5782dd7dad559608a06f3c6b1d4142c395fb5308
RNPurchases: e265e2ed27349b567b91b89d8712aa8c9c57f5b0
RNPurchases: ae1f8f522674a7938dd26eba6c103c40d049dfee
RNReanimated: 38e033fd1790c817678bc8a075277cdc49d6817c
RNScreens: ad2d0cfb3f15c9ed56ffb43651366ec0dcd70c36
RNSVG: 8542aa11770b27563714bbd8494a8436385fc85f
+111 -103
View File
@@ -10,14 +10,16 @@
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
170EE6B9AAF2430B9AB5101D /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6823268A39AC4F3D974A70BB /* noop-file.swift */; };
1963764A838740A9AB3B6EDB /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 943B28EF95A6439B9246862F /* GoogleService-Info.plist */; };
2BC8A1C04BCD698B29D2E6E8 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 70C97E8BE29E641DB4CA72F3 /* PrivacyInfo.xcprivacy */; };
2C1F3D17C413D275BE33BC07 /* Pods_Sauci.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCE00E1F3D8BD0B3956748EB /* Pods_Sauci.framework */; };
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; };
5254BDADE70741A0B2504FB1 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = F744EAD4ABA54509966475D6 /* noop-file.swift */; };
7B71EEB2AF682FA7AFF556D5 /* Pods_Sauci.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDDAD8C12C38D3BD0A76D345 /* Pods_Sauci.framework */; };
B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; };
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; };
CEF2F278ABBC5FBFD470A0F7 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D7B5C17768E3B74AC152531F /* PrivacyInfo.xcprivacy */; };
FDFABE1A1A3547B1B22DD2DD /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = A9280FDF3E0D43AC90382DBC /* GoogleService-Info.plist */; };
XX12B55A1EDABF083C3B51XX /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = XX470101BAEB8E0BBC8B0DXX /* WidgetKit.framework */; };
XX1A6800511A685AB346D2XX /* AppIntents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = XXA12889081EB894481655XX /* AppIntents.framework */; };
XX3C562DEF346B45594832XX /* ActivityKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = XXCAF23C3FC41F82140FA1XX /* ActivityKit.framework */; };
XX6A44985675A04437B8C4XX /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = XX4DFF38D47332D6BF0183XX /* SwiftUI.framework */; };
XXFA0BA4D1DD274640D183XX /* LiveDrawWidget.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = XXAC1FC213FDAA75508994XX /* LiveDrawWidget.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
@@ -53,20 +55,22 @@
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Sauci/Images.xcassets; sourceTree = "<group>"; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = text.plist.xml; name = Info.plist; path = Sauci/Info.plist; sourceTree = "<group>"; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Sauci/main.m; sourceTree = "<group>"; };
6823268A39AC4F3D974A70BB /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "Sauci/noop-file.swift"; sourceTree = "<group>"; };
6C2E3173556A471DD304B334 /* Pods-Sauci.debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sauci.debug.xcconfig"; path = "Target Support Files/Pods-Sauci/Pods-Sauci.debug.xcconfig"; sourceTree = "<group>"; };
70C97E8BE29E641DB4CA72F3 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sauci/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
7A4D352CD337FB3A3BF06240 /* Pods-Sauci.release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sauci.release.xcconfig"; path = "Target Support Files/Pods-Sauci/Pods-Sauci.release.xcconfig"; sourceTree = "<group>"; };
943B28EF95A6439B9246862F /* GoogleService-Info.plist */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Sauci/GoogleService-Info.plist"; sourceTree = "<group>"; };
A9280FDF3E0D43AC90382DBC /* GoogleService-Info.plist */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Sauci/GoogleService-Info.plist"; sourceTree = "<group>"; };
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Sauci/SplashScreen.storyboard; sourceTree = "<group>"; };
BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = "<group>"; };
D927CBDDA31C4219BE8F155B /* Sauci-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "Sauci-Bridging-Header.h"; path = "Sauci/Sauci-Bridging-Header.h"; sourceTree = "<group>"; };
DCE00E1F3D8BD0B3956748EB /* Pods_Sauci.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Sauci.framework; sourceTree = BUILT_PRODUCTS_DIR; };
D7B5C17768E3B74AC152531F /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 1; lastKnownFileType = undefined; name = PrivacyInfo.xcprivacy; path = Sauci/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
DA536CAC88B349A59DFC1F1E /* Sauci-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "Sauci-Bridging-Header.h"; path = "Sauci/Sauci-Bridging-Header.h"; sourceTree = "<group>"; };
DDDAD8C12C38D3BD0A76D345 /* Pods_Sauci.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; fileEncoding = 4; includeInIndex = undefined; path = Pods_Sauci.framework; sourceTree = BUILT_PRODUCTS_DIR; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = undefined; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
F744EAD4ABA54509966475D6 /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "Sauci/noop-file.swift"; sourceTree = "<group>"; };
FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Sauci/ExpoModulesProvider.swift"; sourceTree = "<group>"; };
XX470101BAEB8E0BBC8B0DXX /* WidgetKit.framework */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = undefined; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
XX4DFF38D47332D6BF0183XX /* SwiftUI.framework */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = undefined; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
XXA12889081EB894481655XX /* AppIntents.framework */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = undefined; lastKnownFileType = wrapper.framework; name = AppIntents.framework; path = System/Library/Frameworks/AppIntents.framework; sourceTree = SDKROOT; };
XXAC1FC213FDAA75508994XX /* LiveDrawWidget.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; fileEncoding = 4; includeInIndex = 0; path = LiveDrawWidget.appex; sourceTree = BUILT_PRODUCTS_DIR; };
XXCAF23C3FC41F82140FA1XX /* ActivityKit.framework */ = {isa = PBXFileReference; fileEncoding = 4; includeInIndex = undefined; lastKnownFileType = wrapper.framework; name = ActivityKit.framework; path = System/Library/Frameworks/ActivityKit.framework; sourceTree = SDKROOT; };
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
@@ -100,7 +104,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2C1F3D17C413D275BE33BC07 /* Pods_Sauci.framework in Frameworks */,
7B71EEB2AF682FA7AFF556D5 /* Pods_Sauci.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -110,6 +114,8 @@
files = (
XX12B55A1EDABF083C3B51XX /* WidgetKit.framework in Frameworks */,
XX6A44985675A04437B8C4XX /* SwiftUI.framework in Frameworks */,
XX3C562DEF346B45594832XX /* ActivityKit.framework in Frameworks */,
XX1A6800511A685AB346D2XX /* AppIntents.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -126,10 +132,10 @@
13B07FB61A68108700A75B9A /* Info.plist */,
13B07FB71A68108700A75B9A /* main.m */,
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */,
943B28EF95A6439B9246862F /* GoogleService-Info.plist */,
6823268A39AC4F3D974A70BB /* noop-file.swift */,
D927CBDDA31C4219BE8F155B /* Sauci-Bridging-Header.h */,
70C97E8BE29E641DB4CA72F3 /* PrivacyInfo.xcprivacy */,
A9280FDF3E0D43AC90382DBC /* GoogleService-Info.plist */,
F744EAD4ABA54509966475D6 /* noop-file.swift */,
DA536CAC88B349A59DFC1F1E /* Sauci-Bridging-Header.h */,
D7B5C17768E3B74AC152531F /* PrivacyInfo.xcprivacy */,
);
name = Sauci;
sourceTree = "<group>";
@@ -140,7 +146,9 @@
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
XX470101BAEB8E0BBC8B0DXX /* WidgetKit.framework */,
XX4DFF38D47332D6BF0183XX /* SwiftUI.framework */,
DCE00E1F3D8BD0B3956748EB /* Pods_Sauci.framework */,
DDDAD8C12C38D3BD0A76D345 /* Pods_Sauci.framework */,
XXCAF23C3FC41F82140FA1XX /* ActivityKit.framework */,
XXA12889081EB894481655XX /* AppIntents.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -228,16 +236,16 @@
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Sauci" */;
buildPhases = (
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
78092B71106F49D87690DCAF /* [Expo] Configure project */,
DC3D179C6B62F16DA5F17C2F /* [Expo] Configure project */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */,
XX72A8CFBF0FBA13A79902XX /* Embed Foundation Extensions */,
40AF2F5BA5CA84AF70BDCE64 /* [CP] Embed Pods Frameworks */,
D2EE170024D385D3D7E9FF8F /* [CP-User] [RNFB] Core Configuration */,
CCC1C00E4CE250301404ADA6 /* [CP-User] [RNFB] Crashlytics Configuration */,
A1248897D24903117793599B /* [CP] Embed Pods Frameworks */,
FB4B019D835055733ACDE109 /* [CP-User] [RNFB] Core Configuration */,
563ACE2651AC39438F3B399B /* [CP-User] [RNFB] Crashlytics Configuration */,
);
buildRules = (
);
@@ -251,7 +259,7 @@
};
XX540FB4ABC75CE91A6036XX /* LiveDrawWidget */ = {
isa = PBXNativeTarget;
buildConfigurationList = XXBAA32A968BCCE457D462XX /* Build configuration list for PBXNativeTarget "LiveDrawWidget" */;
buildConfigurationList = XX63FAB1BD532DA0D8AE18XX /* Build configuration list for PBXNativeTarget "LiveDrawWidget" */;
buildPhases = (
XX074B8811C1CF8E8A3D74XX /* Frameworks */,
XXE45443DC38DCFE1DB622XX /* Sources */,
@@ -314,8 +322,8 @@
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */,
1963764A838740A9AB3B6EDB /* GoogleService-Info.plist in Resources */,
2BC8A1C04BCD698B29D2E6E8 /* PrivacyInfo.xcprivacy in Resources */,
FDFABE1A1A3547B1B22DD2DD /* GoogleService-Info.plist in Resources */,
CEF2F278ABBC5FBFD470A0F7 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -370,42 +378,19 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
40AF2F5BA5CA84AF70BDCE64 /* [CP] Embed Pods Frameworks */ = {
563ACE2651AC39438F3B399B /* [CP-User] [RNFB] Crashlytics Configuration */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Sauci/Pods-Sauci-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}",
"$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)",
);
name = "[CP-User] [RNFB] Crashlytics Configuration";
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Sauci/Pods-Sauci-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
78092B71106F49D87690DCAF /* [Expo] Configure project */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "[Expo] Configure project";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Sauci/expo-configure-project.sh\"\n";
shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n";
};
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
@@ -485,21 +470,44 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Sauci/Pods-Sauci-resources.sh\"\n";
showEnvVarsInLog = 0;
};
CCC1C00E4CE250301404ADA6 /* [CP-User] [RNFB] Crashlytics Configuration */ = {
A1248897D24903117793599B /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}",
"$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)",
"${PODS_ROOT}/Target Support Files/Pods-Sauci/Pods-Sauci-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
);
name = "[CP-User] [RNFB] Crashlytics Configuration";
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\nif [[ ${PODS_ROOT} ]]; then\n echo \"info: Exec FirebaseCrashlytics Run from Pods\"\n \"${PODS_ROOT}/FirebaseCrashlytics/run\"\nelse\n echo \"info: Exec FirebaseCrashlytics Run from framework\"\n \"${PROJECT_DIR}/FirebaseCrashlytics.framework/run\"\nfi\n";
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Sauci/Pods-Sauci-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
D2EE170024D385D3D7E9FF8F /* [CP-User] [RNFB] Core Configuration */ = {
DC3D179C6B62F16DA5F17C2F /* [Expo] Configure project */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "[Expo] Configure project";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Sauci/expo-configure-project.sh\"\n";
};
FB4B019D835055733ACDE109 /* [CP-User] [RNFB] Core Configuration */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -522,7 +530,7 @@
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
13B07FC11A68108700A75B9A /* main.m in Sources */,
B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */,
170EE6B9AAF2430B9AB5101D /* noop-file.swift in Sources */,
5254BDADE70741A0B2504FB1 /* noop-file.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -561,7 +569,7 @@
INFOPLIST_FILE = Sauci/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 1.0.4;
MARKETING_VERSION = 1.0.5;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -590,7 +598,7 @@
INFOPLIST_FILE = Sauci/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 1.0.4;
MARKETING_VERSION = 1.0.5;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -746,44 +754,7 @@
};
name = Release;
};
XX7511AEB23A8B63601AE1XX /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = ../targets/widget/generated.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 35;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = BXVPBATDZY;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ../targets/widget/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = LiveDrawWidget;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 1.0.4;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = com.sauci.app.LiveDrawWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
XX917F28A41B713380F670XX /* Release */ = {
XX1230635DC14DD95E28A2XX /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
@@ -796,7 +767,7 @@
CODE_SIGN_ENTITLEMENTS = ../targets/widget/generated.entitlements;
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 35;
CURRENT_PROJECT_VERSION = 41;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = BXVPBATDZY;
GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -806,7 +777,7 @@
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 1.0.4;
MARKETING_VERSION = 1.0.5;
MTL_FAST_MATH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = com.sauci.app.LiveDrawWidget;
@@ -815,11 +786,48 @@
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
XX710DB962925BCE8D59ACXX /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = ../targets/widget/generated.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 41;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = BXVPBATDZY;
GCC_C_LANGUAGE_STANDARD = gnu11;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = ../targets/widget/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = LiveDrawWidget;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
MARKETING_VERSION = 1.0.5;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = com.sauci.app.LiveDrawWidget;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -841,11 +849,11 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
XXBAA32A968BCCE457D462XX /* Build configuration list for PBXNativeTarget "LiveDrawWidget" */ = {
XX63FAB1BD532DA0D8AE18XX /* Build configuration list for PBXNativeTarget "LiveDrawWidget" */ = {
isa = XCConfigurationList;
buildConfigurations = (
XX7511AEB23A8B63601AE1XX /* Debug */,
XX917F28A41B713380F670XX /* Release */,
XX710DB962925BCE8D59ACXX /* Debug */,
XX1230635DC14DD95E28A2XX /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
+2 -2
View File
@@ -21,7 +21,7 @@
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0.4</string>
<string>1.0.5</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
@@ -47,7 +47,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>35</string>
<string>42</string>
<key>GOOGLE_ANALYTICS_INAPURCHASE_COLLECTION_ENABLED</key>
<false/>
<key>LSMinimumSystemVersion</key>
@@ -59,5 +59,5 @@ android {
dependencies {
implementation project(':expo-modules-core')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${getKotlinVersion()}"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${rootProject.ext.has('kotlinVersion') ? rootProject.ext.kotlinVersion : '1.9.25'}"
}
+1 -1
View File
@@ -63,7 +63,7 @@
"react": "18.3.1",
"react-dom": "18.3.1",
"react-native": "0.76.9",
"react-native-android-widget": "^0.20.1",
"react-native-android-widget": "^0.17.2",
"react-native-compressor": "^1.13.0",
"react-native-gesture-handler": "~2.20.0",
"react-native-purchases": "^9.6.12",
+36
View File
@@ -0,0 +1,36 @@
/**
* Expo config plugin that ensures hoisted native packages are moved back
* to apps/mobile/node_modules BEFORE any other plugins try to resolve them.
*
* This runs at plugin load time (synchronously), not as a deferred mod,
* so it fixes the issue before @react-native-firebase/app plugin resolution.
*/
const fs = require('fs');
const path = require('path');
const ROOT = path.resolve(__dirname, '..', '..', '..'); // apps/mobile/../../..
const MOBILE_NM = path.join(ROOT, 'apps', 'mobile', 'node_modules');
const ROOT_NM = path.join(ROOT, 'node_modules');
const PACKAGES_TO_FIX = [
'@react-native-firebase/app',
'@react-native-firebase/analytics',
'@react-native-firebase/crashlytics',
'@shopify/react-native-skia',
];
for (const pkg of PACKAGES_TO_FIX) {
const rootPkg = path.join(ROOT_NM, pkg);
const localPkg = path.join(MOBILE_NM, pkg);
if (!fs.existsSync(rootPkg)) continue;
if (fs.existsSync(localPkg)) continue;
const localParent = path.dirname(localPkg);
fs.mkdirSync(localParent, { recursive: true });
fs.renameSync(rootPkg, localPkg);
}
module.exports = function withFixHoisting(config) {
return config;
};
+173
View File
@@ -0,0 +1,173 @@
const { withDangerousMod } = require('expo/config-plugins');
const fs = require('fs');
const path = require('path');
/**
* Overwrites the react-native-android-widget generated files with a native
* implementation that reads directly from SharedPreferences instead of using
* a headless JS task (broken on RN 0.76 old-arch / PlatformConstants error).
*/
module.exports = function withNativeWidget(config) {
return withDangerousMod(config, [
'android',
(dangerousConfig) => {
const androidRoot = dangerousConfig.modRequest.platformProjectRoot;
const pkg = dangerousConfig.android && dangerousConfig.android.package
? dangerousConfig.android.package
: 'com.sauci.app';
const pkgPath = pkg.split('.').join('/');
// 1. Overwrite LiveDraw.java with native implementation
const widgetDir = path.join(androidRoot, 'app/src/main/java', pkgPath, 'widget');
fs.mkdirSync(widgetDir, { recursive: true });
fs.writeFileSync(
path.join(widgetDir, 'LiveDraw.java'),
LIVE_DRAW_JAVA.replace(/com\.sauci\.app/g, pkg)
);
// 2. Write widget layout
const layoutDir = path.join(androidRoot, 'app/src/main/res/layout');
fs.mkdirSync(layoutDir, { recursive: true });
fs.writeFileSync(path.join(layoutDir, 'widget_live_draw.xml'), WIDGET_LAYOUT);
// 3. Write placeholder drawable
const drawableDir = path.join(androidRoot, 'app/src/main/res/drawable');
fs.mkdirSync(drawableDir, { recursive: true });
fs.writeFileSync(path.join(drawableDir, 'widget_placeholder.xml'), PLACEHOLDER_DRAWABLE);
// 4. Write widget provider XML with our layout
const xmlDir = path.join(androidRoot, 'app/src/main/res/xml');
fs.mkdirSync(xmlDir, { recursive: true });
fs.writeFileSync(path.join(xmlDir, 'widgetprovider_livedraw.xml'), WIDGET_PROVIDER_XML);
return dangerousConfig;
},
]);
};
const LIVE_DRAW_JAVA = `package com.sauci.app.widget;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.Base64;
import android.util.TypedValue;
import android.widget.RemoteViews;
import com.sauci.app.R;
public class LiveDraw extends AppWidgetProvider {
private static final String PREFS_NAME_SUFFIX = ".widgetdata";
private static final String KEY_IMAGE = "LiveDrawImage";
private static final int BG_COLOR = 0xFF1A1A2E;
private static final int CORNER_RADIUS_DP = 16;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int widgetId : appWidgetIds) {
updateWidget(context, appWidgetManager, widgetId);
}
}
private void updateWidget(Context context, AppWidgetManager appWidgetManager, int widgetId) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_live_draw);
String base64 = getStoredImage(context);
if (base64 != null && !base64.isEmpty()) {
try {
byte[] bytes = Base64.decode(base64, Base64.DEFAULT);
Bitmap decoded = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
if (decoded != null) {
Bitmap rounded = addRoundedBackground(context, decoded);
views.setImageViewBitmap(R.id.widget_image, rounded);
decoded.recycle();
}
} catch (Exception e) {
setPlaceholder(views);
}
} else {
setPlaceholder(views);
}
appWidgetManager.updateAppWidget(widgetId, views);
}
private String getStoredImage(Context context) {
SharedPreferences prefs = context.getSharedPreferences(
context.getPackageName() + PREFS_NAME_SUFFIX, Context.MODE_PRIVATE);
return prefs.getString(KEY_IMAGE, null);
}
private void setPlaceholder(RemoteViews views) {
views.setImageViewResource(R.id.widget_image, R.drawable.widget_placeholder);
}
private Bitmap addRoundedBackground(Context context, Bitmap drawing) {
float radius = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS_DP,
context.getResources().getDisplayMetrics());
int w = drawing.getWidth();
int h = drawing.getHeight();
Bitmap output = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
bgPaint.setColor(BG_COLOR);
canvas.drawRoundRect(new RectF(0, 0, w, h), radius, radius, bgPaint);
canvas.drawBitmap(drawing, 0, 0, null);
return output;
}
}
`;
const WIDGET_LAYOUT = `<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#1A1A2E">
<ImageView
android:id="@+id/widget_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerInside"
android:contentDescription="@string/widget_livedraw_description" />
</FrameLayout>
`;
const WIDGET_PROVIDER_XML = `<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="110dp"
android:targetCellWidth="4"
android:targetCellHeight="2"
android:resizeMode="none"
android:description="@string/widget_livedraw_description"
android:initialLayout="@layout/widget_live_draw"
android:previewImage="@drawable/livedraw_preview"
android:updatePeriodMillis="1800000"
android:widgetCategory="home_screen">
</appwidget-provider>
`;
const PLACEHOLDER_DRAWABLE = `<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#1A1A2E" />
<corners android:radius="16dp" />
</shape>
</item>
</layer-list>
`;
+31
View File
@@ -0,0 +1,31 @@
const { withAndroidManifest } = require('expo/config-plugins');
/**
* Fixes react-native-android-widget setting android:exported="false" on widget receivers.
* Widget receivers MUST be exported so the launcher can send APPWIDGET_UPDATE broadcasts.
*
* Uses withAndroidManifest's dangerous modifier priority to run after all other plugins.
*/
module.exports = function withWidgetExported(config) {
return withAndroidManifest(config, (config) => {
const mainApplication =
config.modResults.manifest.application?.[0];
if (!mainApplication?.receiver) return config;
for (const receiver of mainApplication.receiver) {
const intentFilters = receiver['intent-filter'] ?? [];
const isWidget = intentFilters.some((filter) =>
filter.action?.some(
(a) =>
a.$?.['android:name'] ===
'android.appwidget.action.APPWIDGET_UPDATE'
)
);
if (isWidget) {
receiver.$['android:exported'] = 'true';
}
}
return config;
});
};
+4
View File
@@ -7,5 +7,9 @@
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widgetkit-extension</string>
</dict>
<key>CFBundleVersion</key>
<string>42</string>
<key>CFBundleShortVersionString</key>
<string>1.0.5</string>
</dict>
</plist>