Cometchat android v5 extensions
Skill cometchat/cometchat-skills/skills/cometchat-android-v5-extensions
Add CometChat chat & messaging and voice & video calls to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with Claude Code, Cursor, Codex, VS Code Copilot, Windsurf, Cline, Kiro, and 50+ more agents.
npx -y skills add cometchat/cometchat-skills --skill cometchat-android-v5-extensionsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
What its author says it does
Copied from the file, not written here
Extension architecture for CometChat Android — ExtensionsDataSource, decorators, built-in extensions, and how to create custom extensions.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
6.3 KB, as published. Nobody here has run it
Ground truth:
com.cometchat:chat-uikit-android:5.x(legacy/maintenance-only; +calls-sdk-android:5.x) — resolved AAR (javap) +ui-kit/android. Official docs: https://www.cometchat.com/docs/fundamentals/extensions-overview · Docs MCP:claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp(or fetch the URL directly without MCP). Verify symbols against the installed package/source before relying on them.
Companion skills:
cometchat-android-v5-customizationcovers DataSource decorators;cometchat-android-v5-featurescovers the feature catalog.
Purpose
This skill covers the CometChat extension architecture — how extensions plug into the UI Kit, the built-in extensions, and how to create custom ones.
Use this skill when
- "How do extensions work?"
- "How do I add a custom extension?"
- "How do I disable an extension?"
- Working with
ExtensionsDataSourceorExtensionDecorator
Do not use this skill when
- Enabling a backend extension or AI feature → use
cometchat-android-v5-features(which routes tocometchat apply-feature <id> --app-id <X>) - Writing custom message templates → use
cometchat-android-v5-customization
1. Extension architecture
Extensions are split into two class types:
- Registrar classes (e.g.
PollsExtension,StickerExtension) — extendExtensionsDataSource. These are what you pass tosetExtensions(...)to enable a built-in extension. - Decorator classes (e.g.
PollsExtensionDecorator,StickerExtensionDecorator) — extendDataSourceDecorator. These are the runtime decorators that wrap the activeDataSourcechain. The kit creates them internally; you don't construct them directly.
ChatConfigurator.getDataSource()
└── SmartRepliesExtensionDecorator (created by SmartRepliesExtension)
└── PollsExtensionDecorator (created by PollsExtension)
└── StickerExtensionDecorator (created by StickerExtension)
└── MessagesDataSource (base)
2. Built-in extensions
| Extension | Package | What it adds |
|---|---|---|
| Polls | com.cometchat.chatuikit.extensions.polls | Poll creation and voting in messages |
| Stickers | com.cometchat.chatuikit.extensions.sticker | Sticker keyboard and sticker bubbles |
| Collaborative Document | com.cometchat.chatuikit.extensions.collaborative | Shared document editing |
| Collaborative Whiteboard | com.cometchat.chatuikit.extensions.collaborative | Shared whiteboard |
| Smart Replies | com.cometchat.chatuikit.extensions.smartreplies | AI-powered reply suggestions |
| Message Translation | com.cometchat.chatuikit.extensions.messagetranslation | Translate messages |
| Text Moderation | com.cometchat.chatuikit.extensions.textmoderation | Profanity filtering |
| Thumbnail Generation | com.cometchat.chatuikit.extensions.thumbnailgeneration | Image thumbnails |
3. Enabling/disabling extensions
Extensions are enabled by default. To customize which extensions are active, pass a custom list to UIKitSettingsBuilder:
List<ExtensionsDataSource> extensions = new ArrayList<>();
extensions.add(new PollsExtension()); // registrar, NOT PollsExtensionDecorator
extensions.add(new StickerExtension()); // registrar, NOT StickerExtensionDecorator
extensions.add(new SmartRepliesExtension());
// Omit extensions you don't want
UIKitSettings settings = new UIKitSettings.UIKitSettingsBuilder()
.setAppId(APP_ID)
.setRegion(REGION)
.setAuthKey(AUTH_KEY)
.setExtensions(extensions)
.build();
Why not
PollsExtensionDecorator?*ExtensionDecoratorextendsDataSourceDecorator, notExtensionsDataSource— so it won't compile when added to aList<ExtensionsDataSource>. The kit's runtime decorator chain is built by the registrar'senable()method internally; you don't add decorators directly.
4. Creating a custom extension
A custom extension has TWO classes:
- A registrar that extends
ExtensionsDataSource(gets added tosetExtensions(...)) - A decorator that extends
DataSourceDecorator(created by the registrar viaChatConfigurator.enable(...))
// 1. Decorator — extends DataSourceDecorator, overrides per-message behavior
public class MyExtensionDecorator extends DataSourceDecorator {
public MyExtensionDecorator(DataSource dataSource) {
super(dataSource);
}
// Override methods to add custom behavior
}
// 2. Registrar — extends ExtensionsDataSource, implements getExtensionId() + addExtension()
public class MyExtension extends ExtensionsDataSource {
@Override
public String getExtensionId() {
return "my-custom-extension";
}
@Override
public void addExtension() {
// addExtension() is the ABSTRACT method you must implement. The inherited
// concrete enable() calls it after confirming the extension is on (dashboard).
ChatConfigurator.enable(dataSource -> new MyExtensionDecorator(dataSource));
}
}
// Then add the registrar to UIKitSettings:
extensions.add(new MyExtension());
Hard rules
- Two classes per extension. A registrar (
ExtensionsDataSource, implements abstractgetExtensionId()+addExtension();enable()is inherited) and a decorator (DataSourceDecorator, holds the per-message override).setExtensions(...)wants registrars; the chain builds decorators automatically. - Register after init.
ChatConfigurator.enable()must be called afterCometChatUIKit.init()succeeds. - Backend extension toggle still applies. Even if an extension is registered client-side, it needs to be enabled on the app's backend. Use
cometchat apply-feature <id> --app-id <X>(the CLI hits the dashboard API). For dashboard-only extensions (Giphy / Stipop / Tenor / Chatwoot / Intercom — those needing third-party API keys), the user has to enter the third-party config in the dashboard manually.