mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
New protos, widget scaffolding
This commit is contained in:
parent
f820938395
commit
57268576c4
17 changed files with 537 additions and 10 deletions
|
|
@ -35,6 +35,15 @@
|
|||
DD47E3CE26F103C600029299 /* NodeList.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD47E3CD26F103C600029299 /* NodeList.swift */; };
|
||||
DD47E3D626F17ED900029299 /* CircleText.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD47E3D526F17ED900029299 /* CircleText.swift */; };
|
||||
DD4A911E2708C65400501B7E /* AppSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4A911D2708C65400501B7E /* AppSettings.swift */; };
|
||||
DD4C0EFA29A8735400D3316C /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD4C0EF929A8735400D3316C /* WidgetKit.framework */; };
|
||||
DD4C0EFC29A8735400D3316C /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD4C0EFB29A8735400D3316C /* SwiftUI.framework */; };
|
||||
DD4C0EFF29A8735400D3316C /* MeshtasticWidgetsBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4C0EFE29A8735400D3316C /* MeshtasticWidgetsBundle.swift */; };
|
||||
DD4C0F0129A8735400D3316C /* MeshtasticWidgetsLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4C0F0029A8735400D3316C /* MeshtasticWidgetsLiveActivity.swift */; };
|
||||
DD4C0F0329A8735400D3316C /* MeshtasticWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4C0F0229A8735400D3316C /* MeshtasticWidgets.swift */; };
|
||||
DD4C0F0629A8735500D3316C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DD4C0F0529A8735500D3316C /* Assets.xcassets */; };
|
||||
DD4C0F0829A8735500D3316C /* MeshtasticWidgets.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DD4C0F0429A8735400D3316C /* MeshtasticWidgets.intentdefinition */; };
|
||||
DD4C0F0929A8735500D3316C /* MeshtasticWidgets.intentdefinition in Sources */ = {isa = PBXBuildFile; fileRef = DD4C0F0429A8735400D3316C /* MeshtasticWidgets.intentdefinition */; };
|
||||
DD4C0F0C29A8735500D3316C /* MeshtasticWidgetsExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = DD4C0EF829A8735400D3316C /* MeshtasticWidgetsExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||
DD4F23CD28779A3C001D37CB /* EnvironmentMetricsLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4F23CC28779A3C001D37CB /* EnvironmentMetricsLog.swift */; };
|
||||
DD5394FC276993AD00AD86B1 /* SwiftProtobuf in Frameworks */ = {isa = PBXBuildFile; productRef = DD5394FB276993AD00AD86B1 /* SwiftProtobuf */; };
|
||||
DD5394FE276BA0EF00AD86B1 /* PositionEntityExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD5394FD276BA0EF00AD86B1 /* PositionEntityExtension.swift */; };
|
||||
|
|
@ -119,6 +128,13 @@
|
|||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
DD4C0F0A29A8735500D3316C /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = DDC2E14C26CE248E0042C5E4 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = DD4C0EF729A8735400D3316C;
|
||||
remoteInfo = MeshtasticWidgetsExtension;
|
||||
};
|
||||
DDC2E16B26CE248F0042C5E4 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = DDC2E14C26CE248E0042C5E4 /* Project object */;
|
||||
|
|
@ -135,6 +151,20 @@
|
|||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
DD4C0F1129A8735600D3316C /* Embed Foundation Extensions */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 13;
|
||||
files = (
|
||||
DD4C0F0C29A8735500D3316C /* MeshtasticWidgetsExtension.appex in Embed Foundation Extensions */,
|
||||
);
|
||||
name = "Embed Foundation Extensions";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
A65FA974296876BF00A97686 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
C9697F9C279336B700250207 /* LocalMBTileOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalMBTileOverlay.swift; sourceTree = "<group>"; };
|
||||
|
|
@ -165,6 +195,16 @@
|
|||
DD47E3CD26F103C600029299 /* NodeList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeList.swift; sourceTree = "<group>"; };
|
||||
DD47E3D526F17ED900029299 /* CircleText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleText.swift; sourceTree = "<group>"; };
|
||||
DD4A911D2708C65400501B7E /* AppSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettings.swift; sourceTree = "<group>"; };
|
||||
DD4C0EF829A8735400D3316C /* MeshtasticWidgetsExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = MeshtasticWidgetsExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
DD4C0EF929A8735400D3316C /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
|
||||
DD4C0EFB29A8735400D3316C /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
|
||||
DD4C0EFE29A8735400D3316C /* MeshtasticWidgetsBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshtasticWidgetsBundle.swift; sourceTree = "<group>"; };
|
||||
DD4C0F0029A8735400D3316C /* MeshtasticWidgetsLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshtasticWidgetsLiveActivity.swift; sourceTree = "<group>"; };
|
||||
DD4C0F0229A8735400D3316C /* MeshtasticWidgets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshtasticWidgets.swift; sourceTree = "<group>"; };
|
||||
DD4C0F0429A8735400D3316C /* MeshtasticWidgets.intentdefinition */ = {isa = PBXFileReference; lastKnownFileType = file.intentdefinition; path = MeshtasticWidgets.intentdefinition; sourceTree = "<group>"; };
|
||||
DD4C0F0529A8735500D3316C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
DD4C0F0729A8735500D3316C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
DD4C0F0D29A8735500D3316C /* MeshtasticWidgetsExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MeshtasticWidgetsExtension.entitlements; sourceTree = "<group>"; };
|
||||
DD4F23CC28779A3C001D37CB /* EnvironmentMetricsLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnvironmentMetricsLog.swift; sourceTree = "<group>"; };
|
||||
DD5394FD276BA0EF00AD86B1 /* PositionEntityExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionEntityExtension.swift; sourceTree = "<group>"; };
|
||||
DD58C5F12919AD3C00D5BEFB /* ChannelEntityExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelEntityExtension.swift; sourceTree = "<group>"; };
|
||||
|
|
@ -262,6 +302,15 @@
|
|||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
DD4C0EF529A8735400D3316C /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
DD4C0EFC29A8735400D3316C /* SwiftUI.framework in Frameworks */,
|
||||
DD4C0EFA29A8735400D3316C /* WidgetKit.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
DDC2E15126CE248E0042C5E4 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
|
|
@ -348,6 +397,19 @@
|
|||
path = Settings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DD4C0EFD29A8735400D3316C /* MeshtasticWidgets */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DD4C0EFE29A8735400D3316C /* MeshtasticWidgetsBundle.swift */,
|
||||
DD4C0F0029A8735400D3316C /* MeshtasticWidgetsLiveActivity.swift */,
|
||||
DD4C0F0229A8735400D3316C /* MeshtasticWidgets.swift */,
|
||||
DD4C0F0429A8735400D3316C /* MeshtasticWidgets.intentdefinition */,
|
||||
DD4C0F0529A8735500D3316C /* Assets.xcassets */,
|
||||
DD4C0F0729A8735500D3316C /* Info.plist */,
|
||||
);
|
||||
path = MeshtasticWidgets;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
DD5E51EF298EE33B00D21B61 /* meshtastic */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
|
@ -442,6 +504,8 @@
|
|||
DD8EDE9226F97A2B00A5A10B /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DD4C0EF929A8735400D3316C /* WidgetKit.framework */,
|
||||
DD4C0EFB29A8735400D3316C /* SwiftUI.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
|
|
@ -457,11 +521,13 @@
|
|||
DDC2E14B26CE248E0042C5E4 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DD4C0F0D29A8735500D3316C /* MeshtasticWidgetsExtension.entitlements */,
|
||||
DDCDC6CD29481FCC004C1DDA /* Localizable.strings */,
|
||||
DD3CC6BA28E366DF00FA9159 /* Meshtastic.xcdatamodeld */,
|
||||
DDC2E15626CE248E0042C5E4 /* Meshtastic */,
|
||||
DDC2E16D26CE248F0042C5E4 /* MeshtasticTests */,
|
||||
DDC2E17826CE248F0042C5E4 /* MeshtasticUITests */,
|
||||
DD4C0EFD29A8735400D3316C /* MeshtasticWidgets */,
|
||||
DDC2E15526CE248E0042C5E4 /* Products */,
|
||||
DD8EDE9226F97A2B00A5A10B /* Frameworks */,
|
||||
);
|
||||
|
|
@ -474,6 +540,7 @@
|
|||
DDC2E15426CE248E0042C5E4 /* Meshtastic.app */,
|
||||
DDC2E16A26CE248F0042C5E4 /* MeshtasticTests.xctest */,
|
||||
DDC2E17526CE248F0042C5E4 /* MeshtasticUITests.xctest */,
|
||||
DD4C0EF829A8735400D3316C /* MeshtasticWidgetsExtension.appex */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
|
|
@ -612,6 +679,23 @@
|
|||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
DD4C0EF729A8735400D3316C /* MeshtasticWidgetsExtension */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = DD4C0F0E29A8735600D3316C /* Build configuration list for PBXNativeTarget "MeshtasticWidgetsExtension" */;
|
||||
buildPhases = (
|
||||
DD4C0EF429A8735400D3316C /* Sources */,
|
||||
DD4C0EF529A8735400D3316C /* Frameworks */,
|
||||
DD4C0EF629A8735400D3316C /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = MeshtasticWidgetsExtension;
|
||||
productName = MeshtasticWidgetsExtension;
|
||||
productReference = DD4C0EF829A8735400D3316C /* MeshtasticWidgetsExtension.appex */;
|
||||
productType = "com.apple.product-type.app-extension";
|
||||
};
|
||||
DDC2E15326CE248E0042C5E4 /* Meshtastic */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = DDC2E17E26CE248F0042C5E4 /* Build configuration list for PBXNativeTarget "Meshtastic" */;
|
||||
|
|
@ -620,10 +704,12 @@
|
|||
DDC2E15126CE248E0042C5E4 /* Frameworks */,
|
||||
DDC2E15226CE248E0042C5E4 /* Resources */,
|
||||
BB450974275599CE00509624 /* ShellScript */,
|
||||
DD4C0F1129A8735600D3316C /* Embed Foundation Extensions */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
DD4C0F0B29A8735500D3316C /* PBXTargetDependency */,
|
||||
);
|
||||
name = Meshtastic;
|
||||
packageProductDependencies = (
|
||||
|
|
@ -676,9 +762,12 @@
|
|||
DDC2E14C26CE248E0042C5E4 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 1250;
|
||||
LastSwiftUpdateCheck = 1420;
|
||||
LastUpgradeCheck = 1250;
|
||||
TargetAttributes = {
|
||||
DD4C0EF729A8735400D3316C = {
|
||||
CreatedOnToolsVersion = 14.2;
|
||||
};
|
||||
DDC2E15326CE248E0042C5E4 = {
|
||||
CreatedOnToolsVersion = 12.5.1;
|
||||
LastSwiftMigration = 1340;
|
||||
|
|
@ -716,11 +805,20 @@
|
|||
DDC2E15326CE248E0042C5E4 /* Meshtastic */,
|
||||
DDC2E16926CE248F0042C5E4 /* MeshtasticTests */,
|
||||
DDC2E17426CE248F0042C5E4 /* MeshtasticUITests */,
|
||||
DD4C0EF729A8735400D3316C /* MeshtasticWidgetsExtension */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
DD4C0EF629A8735400D3316C /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
DD4C0F0629A8735500D3316C /* Assets.xcassets in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
DDC2E15226CE248E0042C5E4 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
|
|
@ -768,6 +866,17 @@
|
|||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
DD4C0EF429A8735400D3316C /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
DD4C0EFF29A8735400D3316C /* MeshtasticWidgetsBundle.swift in Sources */,
|
||||
DD4C0F0129A8735400D3316C /* MeshtasticWidgetsLiveActivity.swift in Sources */,
|
||||
DD4C0F0329A8735400D3316C /* MeshtasticWidgets.swift in Sources */,
|
||||
DD4C0F0829A8735500D3316C /* MeshtasticWidgets.intentdefinition in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
DDC2E15026CE248E0042C5E4 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
|
|
@ -780,6 +889,7 @@
|
|||
DD5E523F298F5A9E00D21B61 /* AirQualityIndexCompact.swift in Sources */,
|
||||
DD964FBF296E76EF007C176F /* WaypointFormView.swift in Sources */,
|
||||
DD3501892852FC3B000FC853 /* Settings.swift in Sources */,
|
||||
DD4C0F0929A8735500D3316C /* MeshtasticWidgets.intentdefinition in Sources */,
|
||||
DD5D0A9C2931B9F200F7EA61 /* EthernetModes.swift in Sources */,
|
||||
DD5E5203298EE33B00D21B61 /* config.pb.swift in Sources */,
|
||||
DD798B072915928D005217CD /* ChannelMessageList.swift in Sources */,
|
||||
|
|
@ -896,6 +1006,11 @@
|
|||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
DD4C0F0B29A8735500D3316C /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = DD4C0EF729A8735400D3316C /* MeshtasticWidgetsExtension */;
|
||||
targetProxy = DD4C0F0A29A8735500D3316C /* PBXContainerItemProxy */;
|
||||
};
|
||||
DDC2E16C26CE248F0042C5E4 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = DDC2E15326CE248E0042C5E4 /* Meshtastic */;
|
||||
|
|
@ -922,6 +1037,68 @@
|
|||
/* End PBXVariantGroup section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
DD4C0F0F29A8735600D3316C /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CODE_SIGN_ENTITLEMENTS = MeshtasticWidgetsExtension.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = GCH7VS5Y9R;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = MeshtasticWidgets/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = MeshtasticWidgets;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.MeshtasticWidgets;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTS_MACCATALYST = YES;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
DD4C0F1029A8735600D3316C /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CODE_SIGN_ENTITLEMENTS = MeshtasticWidgetsExtension.entitlements;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_TEAM = GCH7VS5Y9R;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = MeshtasticWidgets/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = MeshtasticWidgets;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
"@executable_path/../../Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient.MeshtasticWidgets;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTS_MACCATALYST = YES;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
DDC2E17C26CE248F0042C5E4 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
|
|
@ -1045,6 +1222,7 @@
|
|||
DDC2E17F26CE248F0042C5E4 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
|
|
@ -1078,6 +1256,7 @@
|
|||
DDC2E18026CE248F0042C5E4 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
|
|
@ -1199,6 +1378,15 @@
|
|||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
DD4C0F0E29A8735600D3316C /* Build configuration list for PBXNativeTarget "MeshtasticWidgetsExtension" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
DD4C0F0F29A8735600D3316C /* Debug */,
|
||||
DD4C0F1029A8735600D3316C /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
DDC2E14F26CE248E0042C5E4 /* Build configuration list for PBXProject "Meshtastic" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
|
|
|
|||
|
|
@ -62,8 +62,8 @@ class BLEManager: NSObject, CBPeripheralDelegate, ObservableObject {
|
|||
self.lastConnectionError = ""
|
||||
self.connectedVersion = "0.0.0"
|
||||
super.init()
|
||||
centralManager = CBCentralManager(delegate: self, queue: nil)
|
||||
//centralManager = CBCentralManager(delegate: self, queue: nil, options: [CBCentralManagerOptionRestoreIdentifierKey: restoreKey])
|
||||
//centralManager = CBCentralManager(delegate: self, queue: nil)
|
||||
centralManager = CBCentralManager(delegate: self, queue: nil, options: [CBCentralManagerOptionRestoreIdentifierKey: restoreKey])
|
||||
}
|
||||
|
||||
// MARK: Scanning for BLE Devices
|
||||
|
|
@ -2016,14 +2016,14 @@ extension BLEManager: CBCentralManagerDelegate {
|
|||
guard let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey] as? [CBPeripheral] else {
|
||||
return
|
||||
}
|
||||
print(peripherals)
|
||||
|
||||
if peripherals.count > 0 {
|
||||
//connectedPeripheral.peripheral = peripherals[0]
|
||||
// 5
|
||||
//connectedPeripheral.peripheral.delegate = self
|
||||
|
||||
|
||||
for peripheral in peripherals {
|
||||
|
||||
print(peripheral)
|
||||
switch peripheral.state {
|
||||
case .connecting: // I've only seen this happen when
|
||||
// re-launching attached to Xcode.
|
||||
|
|
@ -2031,6 +2031,12 @@ extension BLEManager: CBCentralManagerDelegate {
|
|||
|
||||
case .connected: // Store for connection / requesting
|
||||
// notifications when BT starts.
|
||||
disconnectPeripheral(reconnect: true)
|
||||
if connectedPeripheral?.peripheral != nil {
|
||||
self.sendWantConfig()
|
||||
} else {
|
||||
disconnectPeripheral(reconnect: true)
|
||||
}
|
||||
print("Actual restore")
|
||||
//centralManager.connect(peripheral)
|
||||
default: break
|
||||
|
|
|
|||
|
|
@ -215,6 +215,11 @@ struct Config {
|
|||
/// Tracker device role
|
||||
/// Position Mesh packets will be prioritized higher and sent more frequently by default.
|
||||
case tracker // = 5
|
||||
|
||||
///
|
||||
/// Sensor device role
|
||||
/// Telemetry Mesh packets will be prioritized higher and sent more frequently by default.
|
||||
case sensor // = 6
|
||||
case UNRECOGNIZED(Int)
|
||||
|
||||
init() {
|
||||
|
|
@ -229,6 +234,7 @@ struct Config {
|
|||
case 3: self = .routerClient
|
||||
case 4: self = .repeater
|
||||
case 5: self = .tracker
|
||||
case 6: self = .sensor
|
||||
default: self = .UNRECOGNIZED(rawValue)
|
||||
}
|
||||
}
|
||||
|
|
@ -241,6 +247,7 @@ struct Config {
|
|||
case .routerClient: return 3
|
||||
case .repeater: return 4
|
||||
case .tracker: return 5
|
||||
case .sensor: return 6
|
||||
case .UNRECOGNIZED(let i): return i
|
||||
}
|
||||
}
|
||||
|
|
@ -1245,6 +1252,7 @@ extension Config.DeviceConfig.Role: CaseIterable {
|
|||
.routerClient,
|
||||
.repeater,
|
||||
.tracker,
|
||||
.sensor,
|
||||
]
|
||||
}
|
||||
|
||||
|
|
@ -1633,6 +1641,7 @@ extension Config.DeviceConfig.Role: SwiftProtobuf._ProtoNameProviding {
|
|||
3: .same(proto: "ROUTER_CLIENT"),
|
||||
4: .same(proto: "REPEATER"),
|
||||
5: .same(proto: "TRACKER"),
|
||||
6: .same(proto: "SENSOR"),
|
||||
]
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -98,12 +98,18 @@ enum HardwareModel: SwiftProtobuf.Enum {
|
|||
/// TODO: REPLACE
|
||||
case tloraT3S3 // = 16
|
||||
|
||||
///
|
||||
/// B&Q Consulting Nano G1 Explorer: https://wiki.uniteng.com/en/meshtastic/nano-g1-explorer
|
||||
case nanoG1Explorer // = 17
|
||||
|
||||
///
|
||||
/// B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station
|
||||
case stationG1 // = 25
|
||||
|
||||
///
|
||||
/// ---------------------------------------------------------------------------
|
||||
/// Less common/prototype boards listed here (needs one more byte over the air)
|
||||
/// ---------------------------------------------------------------------------
|
||||
case loraRelayV1 // = 32
|
||||
|
||||
///
|
||||
|
|
@ -163,7 +169,9 @@ enum HardwareModel: SwiftProtobuf.Enum {
|
|||
case betafpv900NanoTx // = 46
|
||||
|
||||
///
|
||||
/// ------------------------------------------------------------------------------------------------------------------------------------------
|
||||
/// Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
|
||||
/// ------------------------------------------------------------------------------------------------------------------------------------------
|
||||
case privateHw // = 255
|
||||
case UNRECOGNIZED(Int)
|
||||
|
||||
|
|
@ -190,6 +198,7 @@ enum HardwareModel: SwiftProtobuf.Enum {
|
|||
case 14: self = .nanoG1
|
||||
case 15: self = .tloraV211P8
|
||||
case 16: self = .tloraT3S3
|
||||
case 17: self = .nanoG1Explorer
|
||||
case 25: self = .stationG1
|
||||
case 32: self = .loraRelayV1
|
||||
case 33: self = .nrf52840Dk
|
||||
|
|
@ -230,6 +239,7 @@ enum HardwareModel: SwiftProtobuf.Enum {
|
|||
case .nanoG1: return 14
|
||||
case .tloraV211P8: return 15
|
||||
case .tloraT3S3: return 16
|
||||
case .nanoG1Explorer: return 17
|
||||
case .stationG1: return 25
|
||||
case .loraRelayV1: return 32
|
||||
case .nrf52840Dk: return 33
|
||||
|
|
@ -275,6 +285,7 @@ extension HardwareModel: CaseIterable {
|
|||
.nanoG1,
|
||||
.tloraV211P8,
|
||||
.tloraT3S3,
|
||||
.nanoG1Explorer,
|
||||
.stationG1,
|
||||
.loraRelayV1,
|
||||
.nrf52840Dk,
|
||||
|
|
@ -2318,6 +2329,7 @@ extension HardwareModel: SwiftProtobuf._ProtoNameProviding {
|
|||
14: .same(proto: "NANO_G1"),
|
||||
15: .same(proto: "TLORA_V2_1_1P8"),
|
||||
16: .same(proto: "TLORA_T3_S3"),
|
||||
17: .same(proto: "NANO_G1_EXPLORER"),
|
||||
25: .same(proto: "STATION_G1"),
|
||||
32: .same(proto: "LORA_RELAY_V1"),
|
||||
33: .same(proto: "NRF52840DK"),
|
||||
|
|
|
|||
|
|
@ -669,6 +669,15 @@ struct ModuleConfig {
|
|||
/// display the results in Fahrenheit as a "user preference".
|
||||
var environmentDisplayFahrenheit: Bool = false
|
||||
|
||||
///
|
||||
/// Enable/Disable the air quality metrics
|
||||
var airQualityEnabled: Bool = false
|
||||
|
||||
///
|
||||
/// Interval in seconds of how often we should try to send our
|
||||
/// air quality metrics to the mesh
|
||||
var airQualityInterval: UInt32 = 0
|
||||
|
||||
var unknownFields = SwiftProtobuf.UnknownStorage()
|
||||
|
||||
init() {}
|
||||
|
|
@ -1584,6 +1593,8 @@ extension ModuleConfig.TelemetryConfig: SwiftProtobuf.Message, SwiftProtobuf._Me
|
|||
3: .standard(proto: "environment_measurement_enabled"),
|
||||
4: .standard(proto: "environment_screen_enabled"),
|
||||
5: .standard(proto: "environment_display_fahrenheit"),
|
||||
6: .standard(proto: "air_quality_enabled"),
|
||||
7: .standard(proto: "air_quality_interval"),
|
||||
]
|
||||
|
||||
mutating func decodeMessage<D: SwiftProtobuf.Decoder>(decoder: inout D) throws {
|
||||
|
|
@ -1597,6 +1608,8 @@ extension ModuleConfig.TelemetryConfig: SwiftProtobuf.Message, SwiftProtobuf._Me
|
|||
case 3: try { try decoder.decodeSingularBoolField(value: &self.environmentMeasurementEnabled) }()
|
||||
case 4: try { try decoder.decodeSingularBoolField(value: &self.environmentScreenEnabled) }()
|
||||
case 5: try { try decoder.decodeSingularBoolField(value: &self.environmentDisplayFahrenheit) }()
|
||||
case 6: try { try decoder.decodeSingularBoolField(value: &self.airQualityEnabled) }()
|
||||
case 7: try { try decoder.decodeSingularUInt32Field(value: &self.airQualityInterval) }()
|
||||
default: break
|
||||
}
|
||||
}
|
||||
|
|
@ -1618,6 +1631,12 @@ extension ModuleConfig.TelemetryConfig: SwiftProtobuf.Message, SwiftProtobuf._Me
|
|||
if self.environmentDisplayFahrenheit != false {
|
||||
try visitor.visitSingularBoolField(value: self.environmentDisplayFahrenheit, fieldNumber: 5)
|
||||
}
|
||||
if self.airQualityEnabled != false {
|
||||
try visitor.visitSingularBoolField(value: self.airQualityEnabled, fieldNumber: 6)
|
||||
}
|
||||
if self.airQualityInterval != 0 {
|
||||
try visitor.visitSingularUInt32Field(value: self.airQualityInterval, fieldNumber: 7)
|
||||
}
|
||||
try unknownFields.traverse(visitor: &visitor)
|
||||
}
|
||||
|
||||
|
|
@ -1627,6 +1646,8 @@ extension ModuleConfig.TelemetryConfig: SwiftProtobuf.Message, SwiftProtobuf._Me
|
|||
if lhs.environmentMeasurementEnabled != rhs.environmentMeasurementEnabled {return false}
|
||||
if lhs.environmentScreenEnabled != rhs.environmentScreenEnabled {return false}
|
||||
if lhs.environmentDisplayFahrenheit != rhs.environmentDisplayFahrenheit {return false}
|
||||
if lhs.airQualityEnabled != rhs.airQualityEnabled {return false}
|
||||
if lhs.airQualityInterval != rhs.airQualityInterval {return false}
|
||||
if lhs.unknownFields != rhs.unknownFields {return false}
|
||||
return true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ struct MapViewSwiftUI: UIViewRepresentable {
|
|||
compassButton.translatesAutoresizingMaskIntoConstraints = false
|
||||
compassButton.trailingAnchor.constraint(equalTo: mapView.trailingAnchor, constant: -5).isActive = true
|
||||
compassButton.bottomAnchor.constraint(equalTo: mapView.bottomAnchor, constant: -25).isActive = true
|
||||
|
||||
#endif
|
||||
#endif
|
||||
mapView.delegate = context.coordinator
|
||||
|
|
@ -132,6 +133,15 @@ struct MapViewSwiftUI: UIViewRepresentable {
|
|||
mapView.showsUserLocation = true
|
||||
mapView.setUserTrackingMode(.followWithHeading, animated: true)
|
||||
if recenter {
|
||||
// create a 3D Camera
|
||||
let mapCamera = MKMapCamera()
|
||||
mapCamera.centerCoordinate = LocationHelper.currentLocation
|
||||
mapCamera.pitch = 45
|
||||
mapCamera.altitude = 500 // example altitude
|
||||
mapCamera.heading = 45
|
||||
|
||||
// set the camera property
|
||||
mapView.camera = mapCamera
|
||||
mapView.centerCoordinate = LocationHelper.currentLocation
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ struct AppSettings: View {
|
|||
}
|
||||
}
|
||||
|
||||
Section(header: Text("global map options")) {
|
||||
Section(header: Text("map options")) {
|
||||
|
||||
Picker("map.type", selection: $userSettings.meshMapType) {
|
||||
ForEach(MeshMapType.allCases) { map in
|
||||
|
|
@ -68,9 +68,7 @@ struct AppSettings: View {
|
|||
}
|
||||
}
|
||||
.pickerStyle(DefaultPickerStyle())
|
||||
}
|
||||
|
||||
Section(header: Text("mesh map options")) {
|
||||
|
||||
Picker("map.centering", selection: $userSettings.meshMapCenteringMode) {
|
||||
ForEach(CenteringMode.allCases) { cm in
|
||||
Text(cm.description)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"colors" : [
|
||||
{
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"platform" : "ios",
|
||||
"size" : "1024x1024"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
6
MeshtasticWidgets/Assets.xcassets/Contents.json
Normal file
6
MeshtasticWidgets/Assets.xcassets/Contents.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"colors" : [
|
||||
{
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
11
MeshtasticWidgets/Info.plist
Normal file
11
MeshtasticWidgets/Info.plist
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSExtension</key>
|
||||
<dict>
|
||||
<key>NSExtensionPointIdentifier</key>
|
||||
<string>com.apple.widgetkit-extension</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
59
MeshtasticWidgets/MeshtasticWidgets.intentdefinition
Normal file
59
MeshtasticWidgets/MeshtasticWidgets.intentdefinition
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>INEnums</key>
|
||||
<array/>
|
||||
<key>INIntentDefinitionModelVersion</key>
|
||||
<string>1.2</string>
|
||||
<key>INIntentDefinitionNamespace</key>
|
||||
<string>88xZPY</string>
|
||||
<key>INIntentDefinitionSystemVersion</key>
|
||||
<string>20A294</string>
|
||||
<key>INIntentDefinitionToolsBuildVersion</key>
|
||||
<string>12A6144</string>
|
||||
<key>INIntentDefinitionToolsVersion</key>
|
||||
<string>12.0</string>
|
||||
<key>INIntents</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>INIntentCategory</key>
|
||||
<string>information</string>
|
||||
<key>INIntentDescriptionID</key>
|
||||
<string>tVvJ9c</string>
|
||||
<key>INIntentEligibleForWidgets</key>
|
||||
<true/>
|
||||
<key>INIntentIneligibleForSuggestions</key>
|
||||
<true/>
|
||||
<key>INIntentName</key>
|
||||
<string>Configuration</string>
|
||||
<key>INIntentResponse</key>
|
||||
<dict>
|
||||
<key>INIntentResponseCodes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>INIntentResponseCodeName</key>
|
||||
<string>success</string>
|
||||
<key>INIntentResponseCodeSuccess</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>INIntentResponseCodeName</key>
|
||||
<string>failure</string>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
<key>INIntentTitle</key>
|
||||
<string>Configuration</string>
|
||||
<key>INIntentTitleID</key>
|
||||
<string>gpCwrM</string>
|
||||
<key>INIntentType</key>
|
||||
<string>Custom</string>
|
||||
<key>INIntentVerb</key>
|
||||
<string>View</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>INTypes</key>
|
||||
<array/>
|
||||
</dict>
|
||||
</plist>
|
||||
68
MeshtasticWidgets/MeshtasticWidgets.swift
Normal file
68
MeshtasticWidgets/MeshtasticWidgets.swift
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
//
|
||||
// MeshtasticWidgets.swift
|
||||
// MeshtasticWidgets
|
||||
//
|
||||
// Created by Garth Vander Houwen on 2/23/23.
|
||||
//
|
||||
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
import Intents
|
||||
|
||||
struct Provider: IntentTimelineProvider {
|
||||
func placeholder(in context: Context) -> SimpleEntry {
|
||||
SimpleEntry(date: Date(), configuration: ConfigurationIntent())
|
||||
}
|
||||
|
||||
func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {
|
||||
let entry = SimpleEntry(date: Date(), configuration: configuration)
|
||||
completion(entry)
|
||||
}
|
||||
|
||||
func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
|
||||
var entries: [SimpleEntry] = []
|
||||
|
||||
// Generate a timeline consisting of five entries an hour apart, starting from the current date.
|
||||
let currentDate = Date()
|
||||
for hourOffset in 0 ..< 5 {
|
||||
let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
|
||||
let entry = SimpleEntry(date: entryDate, configuration: configuration)
|
||||
entries.append(entry)
|
||||
}
|
||||
|
||||
let timeline = Timeline(entries: entries, policy: .atEnd)
|
||||
completion(timeline)
|
||||
}
|
||||
}
|
||||
|
||||
struct SimpleEntry: TimelineEntry {
|
||||
let date: Date
|
||||
let configuration: ConfigurationIntent
|
||||
}
|
||||
|
||||
struct MeshtasticWidgetsEntryView : View {
|
||||
var entry: Provider.Entry
|
||||
|
||||
var body: some View {
|
||||
Text(entry.date, style: .time)
|
||||
}
|
||||
}
|
||||
|
||||
struct MeshtasticWidgets: Widget {
|
||||
let kind: String = "MeshtasticWidgets"
|
||||
|
||||
var body: some WidgetConfiguration {
|
||||
IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry in
|
||||
MeshtasticWidgetsEntryView(entry: entry)
|
||||
}
|
||||
.configurationDisplayName("My Widget")
|
||||
.description("This is an example widget.")
|
||||
}
|
||||
}
|
||||
|
||||
struct MeshtasticWidgets_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
MeshtasticWidgetsEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent()))
|
||||
.previewContext(WidgetPreviewContext(family: .systemSmall))
|
||||
}
|
||||
}
|
||||
17
MeshtasticWidgets/MeshtasticWidgetsBundle.swift
Normal file
17
MeshtasticWidgets/MeshtasticWidgetsBundle.swift
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
//
|
||||
// MeshtasticWidgetsBundle.swift
|
||||
// MeshtasticWidgets
|
||||
//
|
||||
// Created by Garth Vander Houwen on 2/23/23.
|
||||
//
|
||||
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
|
||||
@main
|
||||
struct MeshtasticWidgetsBundle: WidgetBundle {
|
||||
var body: some Widget {
|
||||
MeshtasticWidgets()
|
||||
MeshtasticWidgetsLiveActivity()
|
||||
}
|
||||
}
|
||||
77
MeshtasticWidgets/MeshtasticWidgetsLiveActivity.swift
Normal file
77
MeshtasticWidgets/MeshtasticWidgetsLiveActivity.swift
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
//
|
||||
// MeshtasticWidgetsLiveActivity.swift
|
||||
// MeshtasticWidgets
|
||||
//
|
||||
// Created by Garth Vander Houwen on 2/23/23.
|
||||
//
|
||||
|
||||
import ActivityKit
|
||||
import WidgetKit
|
||||
import SwiftUI
|
||||
|
||||
struct MeshtasticWidgetsAttributes: ActivityAttributes {
|
||||
public struct ContentState: Codable, Hashable {
|
||||
// Dynamic stateful properties about your activity go here!
|
||||
var value: Int
|
||||
}
|
||||
|
||||
// Fixed non-changing properties about your activity go here!
|
||||
var name: String
|
||||
}
|
||||
|
||||
struct MeshtasticWidgetsLiveActivity: Widget {
|
||||
var body: some WidgetConfiguration {
|
||||
ActivityConfiguration(for: MeshtasticWidgetsAttributes.self) { context in
|
||||
// Lock screen/banner UI goes here
|
||||
VStack {
|
||||
Text("Hello")
|
||||
}
|
||||
.activityBackgroundTint(Color.cyan)
|
||||
.activitySystemActionForegroundColor(Color.black)
|
||||
|
||||
} dynamicIsland: { context in
|
||||
DynamicIsland {
|
||||
// Expanded UI goes here. Compose the expanded UI through
|
||||
// various regions, like leading/trailing/center/bottom
|
||||
DynamicIslandExpandedRegion(.leading) {
|
||||
Text("Leading")
|
||||
}
|
||||
DynamicIslandExpandedRegion(.trailing) {
|
||||
Text("Trailing")
|
||||
}
|
||||
DynamicIslandExpandedRegion(.bottom) {
|
||||
Text("Bottom")
|
||||
// more content
|
||||
}
|
||||
} compactLeading: {
|
||||
Text("L")
|
||||
} compactTrailing: {
|
||||
Text("T")
|
||||
} minimal: {
|
||||
Text("Min")
|
||||
}
|
||||
.widgetURL(URL(string: "http://www.apple.com"))
|
||||
.keylineTint(Color.red)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct MeshtasticWidgetsLiveActivity_Previews: PreviewProvider {
|
||||
static let attributes = MeshtasticWidgetsAttributes(name: "Me")
|
||||
static let contentState = MeshtasticWidgetsAttributes.ContentState(value: 3)
|
||||
|
||||
static var previews: some View {
|
||||
attributes
|
||||
.previewContext(contentState, viewKind: .dynamicIsland(.compact))
|
||||
.previewDisplayName("Island Compact")
|
||||
attributes
|
||||
.previewContext(contentState, viewKind: .dynamicIsland(.expanded))
|
||||
.previewDisplayName("Island Expanded")
|
||||
attributes
|
||||
.previewContext(contentState, viewKind: .dynamicIsland(.minimal))
|
||||
.previewDisplayName("Minimal")
|
||||
attributes
|
||||
.previewContext(contentState, viewKind: .content)
|
||||
.previewDisplayName("Notification")
|
||||
}
|
||||
}
|
||||
10
MeshtasticWidgetsExtension.entitlements
Normal file
10
MeshtasticWidgetsExtension.entitlements
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.network.client</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
Loading…
Add table
Add a link
Reference in a new issue