/* * * Copyright (c) 2021 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @brief Manages Content Apps */ #pragma once #include #include #include #include #include #include #include #include #include #include #include "../include/account-login/AccountLoginManager.h" #include "../include/application-basic/ApplicationBasicManager.h" #include "../include/content-control/ContentController.h" #include "../include/content-launcher/AppContentLauncherManager.h" #include "../include/media-playback/AppMediaPlaybackManager.h" #include "../include/target-navigator/TargetNavigatorManager.h" #include "ChannelManager.h" #include "CommissionerMain.h" #include "ContentAppAttributeDelegate.h" #include "ContentAppCommandDelegate.h" #include "KeypadInputManager.h" #include "application-launcher/ApplicationLauncherManager.h" #include #include #include #include #include #include #include #include #include CHIP_ERROR InitVideoPlayerPlatform(jobject contentAppEndpointManager); EndpointId AddContentApp(const char * szVendorName, uint16_t vendorId, const char * szApplicationName, uint16_t productId, const char * szApplicationVersion, std::vector supportedClusters, jobject manager); EndpointId AddContentApp(const char * szVendorName, uint16_t vendorId, const char * szApplicationName, uint16_t productId, const char * szApplicationVersion, std::vector supportedClusters, EndpointId endpointId, jobject manager); EndpointId RemoveContentApp(EndpointId epId); void ReportAttributeChange(EndpointId epId, chip::ClusterId clusterId, chip::AttributeId attributeId); void AddSelfVendorAsAdmin(); #if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED namespace chip { namespace AppPlatform { using AccountLoginDelegate = app::Clusters::AccountLogin::Delegate; using ApplicationBasicDelegate = app::Clusters::ApplicationBasic::Delegate; using ApplicationLauncherDelegate = app::Clusters::ApplicationLauncher::Delegate; using ChannelDelegate = app::Clusters::Channel::Delegate; using ContentLauncherDelegate = app::Clusters::ContentLauncher::Delegate; using ContentControlDelegate = app::Clusters::ContentControl::Delegate; using KeypadInputDelegate = app::Clusters::KeypadInput::Delegate; using MediaPlaybackDelegate = app::Clusters::MediaPlayback::Delegate; using TargetNavigatorDelegate = app::Clusters::TargetNavigator::Delegate; using SupportedProtocolsBitmap = app::Clusters::ContentLauncher::SupportedProtocolsBitmap; using ContentAppAttributeDelegate = chip::AppPlatform::ContentAppAttributeDelegate; using ContentAppCommandDelegate = chip::AppPlatform::ContentAppCommandDelegate; using SupportedCluster = chip::AppPlatform::ContentApp::SupportedCluster; static const int kCatalogVendorId = CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID; // for this platform, appid is just vendor id #define BuildAppId(vid) std::to_string(vid).c_str() class DLL_EXPORT ContentAppImpl : public ContentApp { public: ContentAppImpl(const char * szVendorName, uint16_t vendorId, const char * szApplicationName, uint16_t productId, const char * szApplicationVersion, const char * setupPIN, std::vector supportedClusters, ContentAppAttributeDelegate * attributeDelegate, ContentAppCommandDelegate * commandDelegate) : ContentApp{ supportedClusters }, mApplicationBasicDelegate(kCatalogVendorId, BuildAppId(vendorId), szVendorName, vendorId, szApplicationName, productId, szApplicationVersion), mAccountLoginDelegate(commandDelegate, setupPIN), mContentLauncherDelegate(attributeDelegate, { "image/*", "video/*" }, to_underlying(SupportedProtocolsBitmap::kDash) | to_underlying(SupportedProtocolsBitmap::kHls)), mMediaPlaybackDelegate(attributeDelegate), mTargetNavigatorDelegate(attributeDelegate, { "home", "search", "info", "guide", "menu" }, 0){}; virtual ~ContentAppImpl() {} AccountLoginDelegate * GetAccountLoginDelegate() override { mAccountLoginDelegate.SetEndpointId(GetEndpointId()); return &mAccountLoginDelegate; }; ApplicationBasicDelegate * GetApplicationBasicDelegate() override { return &mApplicationBasicDelegate; }; ApplicationLauncherDelegate * GetApplicationLauncherDelegate() override { return &mApplicationLauncherDelegate; }; ChannelDelegate * GetChannelDelegate() override { return &mChannelDelegate; }; ContentLauncherDelegate * GetContentLauncherDelegate() override { mContentLauncherDelegate.SetEndpointId(GetEndpointId()); return &mContentLauncherDelegate; }; ContentControlDelegate * GetContentControlDelegate() override { mContentControlDelegate.SetEndpointId(GetEndpointId()); return &mContentControlDelegate; }; KeypadInputDelegate * GetKeypadInputDelegate() override { return &mKeypadInputDelegate; }; MediaPlaybackDelegate * GetMediaPlaybackDelegate() override { mMediaPlaybackDelegate.SetEndpointId(GetEndpointId()); return &mMediaPlaybackDelegate; }; TargetNavigatorDelegate * GetTargetNavigatorDelegate() override { mTargetNavigatorDelegate.SetEndpointId(GetEndpointId()); return &mTargetNavigatorDelegate; }; protected: ApplicationBasicManager mApplicationBasicDelegate; AccountLoginManager mAccountLoginDelegate; ApplicationLauncherManager mApplicationLauncherDelegate; ChannelManager mChannelDelegate; ContentController mContentControlDelegate; AppContentLauncherManager mContentLauncherDelegate; KeypadInputManager mKeypadInputDelegate; AppMediaPlaybackManager mMediaPlaybackDelegate; TargetNavigatorManager mTargetNavigatorDelegate; }; class DLL_EXPORT ContentAppFactoryImpl : public ContentAppFactory { #define APP_LIBRARY_SIZE 4 public: ContentAppFactoryImpl(); virtual ~ContentAppFactoryImpl() {} // Lookup CatalogVendor App for this client (vendor id/product id client) // and then write it to destinationApp // return error if not found CHIP_ERROR LookupCatalogVendorApp(uint16_t vendorId, uint16_t productId, CatalogVendorApp * destinationApp) override; // Lookup ContentApp for this catalog id / app id and load it ContentApp * LoadContentApp(const CatalogVendorApp & vendorApp) override; EndpointId AddContentApp(const char * szVendorName, uint16_t vendorId, const char * szApplicationName, uint16_t productId, const char * szApplicationVersion, std::vector supportedClusters, jobject manager); EndpointId AddContentApp(const char * szVendorName, uint16_t vendorId, const char * szApplicationName, uint16_t productId, const char * szApplicationVersion, std::vector supportedClusters, EndpointId desiredEndpointId, jobject manager); EndpointId RemoveContentApp(EndpointId epId); // Gets the catalog vendor ID used by this platform uint16_t GetPlatformCatalogVendorId() override; // Converts application (any catalog) into the platform's catalog Vendor // and then writes it to destinationApp CHIP_ERROR ConvertToPlatformCatalogVendorApp(const CatalogVendorApp & sourceApp, CatalogVendorApp * destinationApp) override; // Get the privilege this vendorId should have on endpoints 1, 2, and content app endpoints // In the case of casting video clients, this should usually be Access::Privilege::kOperate // and for voice agents, this may be Access::Privilege::kAdminister // When a vendor has admin privileges, it will get access to all clusters on ep1 Access::Privilege GetVendorPrivilege(uint16_t vendorId) override; // Get the cluster list this vendorId/productId should have on static endpoints such as ep1 for casting video clients. // When a vendor has admin privileges, it will get access to all clusters on ep1 std::list GetAllowedClusterListForStaticEndpoint(EndpointId endpointId, uint16_t vendorId, uint16_t productId) override; void AddAdminVendorId(uint16_t vendorId); void setContentAppAttributeDelegate(ContentAppAttributeDelegate * attributeDelegate); void setContentAppCommandDelegate(ContentAppCommandDelegate * commandDelegate); void LogInstalledApps(); protected: // TODO: Update to use unique_ptr instead of raw pointers std::vector mContentApps; std::vector mDataVersions{}; std::vector mAdminVendorIds{}; private: ContentAppAttributeDelegate * mAttributeDelegate; ContentAppCommandDelegate * mCommandDelegate; }; } // namespace AppPlatform } // namespace chip chip::AppPlatform::ContentAppFactoryImpl * GetContentAppFactoryImpl(); #endif // CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED