Jump to content

Qt for HarmonyOS/qtohosextras doc/Start Ability For Result Example - main.cpp

From Qt Wiki

< Qt for HarmonyOS / qtohosextras doc

Start Ability For Result Example - main.cpp

 // Copyright (C) 2025 The Qt Company Ltd.
 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

 #include <QApplication>
 #include <QByteArray>
 #include <QDialog>
 #include <QFormLayout>
 #include <QHBoxLayout>
 #include <QLineEdit>
 #include <QMessageBox>
 #include <QPushButton>
 #include <QSharedPointer>
 #include <QTextEdit>
 #include <QVBoxLayout>
 #include <QWidget>
 #include <QtOhosExtras>
 #include <functional>

 namespace {

 class StartAbilityForResultDialog : public QDialog
 {
 public:
     StartAbilityForResultDialog(QWidget *parent = nullptr);

     QString bundleName() const;
     QString abilityName() const;

 private:
     QLineEdit *m_bundleNameEdit;
     QLineEdit *m_abilityNameEdit;
 };

 StartAbilityForResultDialog::StartAbilityForResultDialog(QWidget *parent)
     : QDialog(parent)
 {
     setWindowTitle("Enter Want Properties");

     m_bundleNameEdit = new QLineEdit("com.start.ability.for.result.target", this);
     m_abilityNameEdit = new QLineEdit("EntryAbility", this);

     auto *layout = new QFormLayout(this);
     layout->addRow("Bundle Name:", m_bundleNameEdit);
     layout->addRow("Ability Name:", m_abilityNameEdit);

     auto *buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
     connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept);
     connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject);
     layout->addWidget(buttons);
 }

 QString StartAbilityForResultDialog::bundleName() const
 {
     return m_bundleNameEdit->text();
 }

 QString StartAbilityForResultDialog::abilityName() const
 {
     return m_abilityNameEdit->text();
 }

 QSharedPointer<QtOhosExtras::QOhosWant> tryGetWantFromTheUser()
 {
     StartAbilityForResultDialog dialog;
     if (dialog.exec() == QDialog::Accepted) {
         QtOhosExtras::QOhosWant want;
         want.bundleName = dialog.bundleName();
         want.abilityName = dialog.abilityName();

         return QSharedPointer<QtOhosExtras::QOhosWant>::create(want);
     }

     return nullptr;
 }

 QPushButton *createTestButton(const QString &title, std::function<void()> callback)
 {
     auto *button = new QPushButton(title);
     QObject::connect(button, &QPushButton::clicked, std::move(callback));

     return button;
 }

 class SamplePresenterWidget : public QWidget
 {
 public:
     SamplePresenterWidget(QWidget *parent = nullptr);

 private:
     void appendMessage(const QByteArray &requestId, const QString &status);

     QTextEdit *m_textEdit;
 };

 SamplePresenterWidget::SamplePresenterWidget(QWidget *parent)
     : QWidget(parent)
 {
     auto abilityContext = QtOhosExtras::QOhosAbilityContext::getDefaultInstance();
     QObject::connect(
         abilityContext.get(),
         &QtOhosExtras::QOhosAbilityContext::startAbilityForResultResponseReceived,
         this,
         [this](auto requestId, auto resultCode, auto want) {
             appendMessage(requestId, QStringLiteral("resultCode: %1").arg(resultCode));

             QMessageBox::information(
                 nullptr, "Success",
                 QStringLiteral("The result code from started ability: %1, has want: %2, request id: %3")
                     .arg(resultCode)
                     .arg(want != nullptr)
                     .arg(requestId.toHex().constData()));
         });
     QObject::connect(
         abilityContext.get(),
         &QtOhosExtras::QOhosAbilityContext::startAbilityForResultErrorResponseReceived,
         this,
         [this](auto requestId) {
             appendMessage(requestId, QStringLiteral("Error"));

             QMessageBox::warning(
                 nullptr, "Error",
                 QStringLiteral("An error occurred while starting ability for result. Request id: %1")
                     .arg(requestId.toHex().constData())
             );
         });

     auto *mainLayout = new QHBoxLayout(this);

     auto *buttonsLayout = new QVBoxLayout();
     mainLayout->addLayout(buttonsLayout);
     buttonsLayout->addWidget(
         createTestButton(
             "Start Ability For Result - want only",
             [this, abilityContext]() {
                 auto want = tryGetWantFromTheUser();
                 if (want) {
                     auto requestId = abilityContext->startAbilityForResult(*want.get());
                     appendMessage(requestId, QStringLiteral("sent"));
                 }
             }));
     buttonsLayout->addWidget(
         createTestButton(
             "Start Ability For Result - want & options",
             [this, abilityContext]() {
                 auto want = tryGetWantFromTheUser();
                 if (want) {
                     auto startOptions = QtOhosExtras::createStartOptions();
                     startOptions->setWindowTop(0);
                     startOptions->setWindowLeft(0);

                     auto requestId = abilityContext->startAbilityForResult(
                         *want.get(), *startOptions.get());
                     appendMessage(requestId, QStringLiteral("sent"));
                 }
             }));
     buttonsLayout->addWidget(
         createTestButton(
             "Start Ability For Result - empty want",
             [this, abilityContext]() {
                 auto requestId = abilityContext->startAbilityForResult(QtOhosExtras::QOhosWant());
                 appendMessage(requestId, QStringLiteral("sent"));
             }));

     auto *textLayout = new QVBoxLayout();
     mainLayout->addLayout(textLayout);

     m_textEdit = new QTextEdit();
     m_textEdit->setReadOnly(true);
     textLayout->addWidget(m_textEdit);
 }

 void SamplePresenterWidget::appendMessage(const QByteArray &requestId, const QString &status)
 {
     m_textEdit->append(
         QStringLiteral("Request Id: %1 Status: %2")
             .arg(requestId.toHex().constData())
             .arg(status));
 }

 }

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);

     SamplePresenterWidget window;
     window.show();

     return app.exec();
 }