blob: a86a11c4386626585cd74cd18e0d9bfeacad2add [file] [log] [blame]
/*
*
* 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 <app/app-platform/ContentApp.h>
#include <app/app-platform/ContentAppPlatform.h>
#include <app/util/attribute-storage.h>
#include <functional>
#include <jni.h>
#include <lib/core/DataModelTypes.h>
#include <lib/support/JniReferences.h>
#include <stdbool.h>
#include <stdint.h>
#include <vector>
#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 <app/clusters/account-login-server/account-login-delegate.h>
#include <app/clusters/application-basic-server/application-basic-delegate.h>
#include <app/clusters/application-launcher-server/application-launcher-delegate.h>
#include <app/clusters/channel-server/channel-delegate.h>
#include <app/clusters/content-control-server/content-control-delegate.h>
#include <app/clusters/content-launch-server/content-launch-delegate.h>
#include <app/clusters/keypad-input-server/keypad-input-delegate.h>
#include <app/clusters/media-playback-server/media-playback-delegate.h>
#include <app/clusters/target-navigator-server/target-navigator-delegate.h>
CHIP_ERROR InitVideoPlayerPlatform(jobject contentAppEndpointManager);
EndpointId AddContentApp(const char * szVendorName, uint16_t vendorId, const char * szApplicationName, uint16_t productId,
const char * szApplicationVersion,
std::vector<chip::AppPlatform::ContentApp::SupportedCluster> supportedClusters, jobject manager);
EndpointId AddContentApp(const char * szVendorName, uint16_t vendorId, const char * szApplicationName, uint16_t productId,
const char * szApplicationVersion,
std::vector<chip::AppPlatform::ContentApp::SupportedCluster> 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<SupportedCluster> 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<SupportedCluster> supportedClusters, jobject manager);
EndpointId AddContentApp(const char * szVendorName, uint16_t vendorId, const char * szApplicationName, uint16_t productId,
const char * szApplicationVersion, std::vector<SupportedCluster> 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<ClusterId> 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<ContentAppImpl *> mContentApps;
std::vector<DataVersion *> mDataVersions{};
std::vector<uint16_t> mAdminVendorIds{};
private:
ContentAppAttributeDelegate * mAttributeDelegate;
ContentAppCommandDelegate * mCommandDelegate;
};
} // namespace AppPlatform
} // namespace chip
chip::AppPlatform::ContentAppFactoryImpl * GetContentAppFactoryImpl();
#endif // CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED