diff --git a/qrenderdoc/Code/Interface/PersistantConfig.cpp b/qrenderdoc/Code/Interface/PersistantConfig.cpp index a1c956a60..0d76687e8 100644 --- a/qrenderdoc/Code/Interface/PersistantConfig.cpp +++ b/qrenderdoc/Code/Interface/PersistantConfig.cpp @@ -193,6 +193,9 @@ void PersistantConfig::AddAndroidHosts() { RemoteHost *host = new RemoteHost(); host->Hostname = lit("adb:") + hostName; + rdctype::str friendly; + RENDERDOC_GetAndroidFriendlyName(hostName.toUtf8().data(), friendly); + host->FriendlyName = ToQStr(friendly); // Just a command to display in the GUI and allow Launch() to be called. host->RunCommand = lit("org.renderdoc.renderdoccmd"); RemoteHosts.push_back(host); diff --git a/qrenderdoc/Code/Interface/RemoteHost.cpp b/qrenderdoc/Code/Interface/RemoteHost.cpp index dbd8f7d84..367ed036f 100644 --- a/qrenderdoc/Code/Interface/RemoteHost.cpp +++ b/qrenderdoc/Code/Interface/RemoteHost.cpp @@ -38,6 +38,8 @@ RemoteHost::RemoteHost(const QVariant &var) QVariantMap map = var.toMap(); if(map.contains(lit("Hostname"))) Hostname = map[lit("Hostname")].toString(); + if(map.contains(lit("FriendlyName"))) + FriendlyName = map[lit("FriendlyName")].toString(); if(map.contains(lit("RunCommand"))) RunCommand = map[lit("RunCommand")].toString(); @@ -48,6 +50,7 @@ RemoteHost::operator QVariant() const { QVariantMap map; map[lit("Hostname")] = Hostname; + map[lit("FriendlyName")] = FriendlyName; map[lit("RunCommand")] = RunCommand; return map; } diff --git a/qrenderdoc/Code/Interface/RemoteHost.h b/qrenderdoc/Code/Interface/RemoteHost.h index 64e4a0ad4..de0001379 100644 --- a/qrenderdoc/Code/Interface/RemoteHost.h +++ b/qrenderdoc/Code/Interface/RemoteHost.h @@ -54,9 +54,15 @@ public: DOCUMENT("The hostname of this host."); QString Hostname; + DOCUMENT("The friendly name for this host, if available (if empty, the Hostname is used)."); + QString FriendlyName; DOCUMENT("The command to run locally to try to launch the server remotely."); QString RunCommand; + DOCUMENT(R"( +Returns the name to display for this host in the UI, either :data:`FriendlyName` or :data:`Hostname` +)"); + const QString &Name() const { return !FriendlyName.isEmpty() ? FriendlyName : Hostname; } DOCUMENT("Returns ``True`` if this host represents a connected ADB (Android) device."); bool IsHostADB() const { return Hostname.startsWith(lit("adb:")); } }; diff --git a/qrenderdoc/Windows/Dialogs/LiveCapture.h b/qrenderdoc/Windows/Dialogs/LiveCapture.h index 1169f756f..3e91238c4 100644 --- a/qrenderdoc/Windows/Dialogs/LiveCapture.h +++ b/qrenderdoc/Windows/Dialogs/LiveCapture.h @@ -49,8 +49,8 @@ class LiveCapture : public QFrame Q_OBJECT public: - explicit LiveCapture(ICaptureContext &ctx, const QString &runCommand, uint32_t ident, - MainWindow *main, QWidget *parent = 0); + explicit LiveCapture(ICaptureContext &ctx, const QString &host, uint32_t ident, MainWindow *main, + QWidget *parent = 0); ~LiveCapture(); diff --git a/qrenderdoc/Windows/Dialogs/RemoteManager.cpp b/qrenderdoc/Windows/Dialogs/RemoteManager.cpp index af03a6bc2..b4381feae 100644 --- a/qrenderdoc/Windows/Dialogs/RemoteManager.cpp +++ b/qrenderdoc/Windows/Dialogs/RemoteManager.cpp @@ -168,7 +168,7 @@ bool RemoteManager::isRemoteServerLive(RDTreeWidgetItem *node) void RemoteManager::addHost(RemoteHost *host) { - RDTreeWidgetItem *node = new RDTreeWidgetItem({host->Hostname, lit("...")}); + RDTreeWidgetItem *node = new RDTreeWidgetItem({host->Name(), lit("...")}); node->setItalic(true); node->setIcon(0, Icons::hourglass()); @@ -443,7 +443,7 @@ void RemoteManager::on_hosts_itemSelectionChanged() ui->refreshOne->setEnabled(true); ui->runCommand->setText(host->RunCommand); - ui->hostname->setText(host->Hostname); + ui->hostname->setText(host->Name()); ui->addUpdateHost->setText(tr("Update")); @@ -586,7 +586,7 @@ void RemoteManager::on_connect_clicked() { QMessageBox::StandardButton res = RDDialog::question( this, tr("Remote server shutdown"), - tr("Are you sure you wish to shut down running remote server on %1?").arg(host->Hostname), + tr("Are you sure you wish to shut down running remote server on %1?").arg(host->Name()), RDDialog::YesNoCancel); if(res == QMessageBox::Cancel || res == QMessageBox::No) diff --git a/qrenderdoc/Windows/MainWindow.cpp b/qrenderdoc/Windows/MainWindow.cpp index 7d9b75238..8795d81a8 100644 --- a/qrenderdoc/Windows/MainWindow.cpp +++ b/qrenderdoc/Windows/MainWindow.cpp @@ -489,7 +489,7 @@ void MainWindow::LoadLogfile(const QString &filename, bool temporary, bool local QString remoteMessage = tr("This log was captured with %1 and cannot be replayed on %2.\n\n") .arg(driver) - .arg(m_Ctx.Replay().CurrentRemote()->Hostname); + .arg(m_Ctx.Replay().CurrentRemote()->Name()); remoteMessage += tr("Try selecting a different remote context in the status bar."); @@ -704,7 +704,7 @@ void MainWindow::SetTitle(const QString &filename) } if(m_Ctx.Replay().CurrentRemote()) - prefix += tr("Remote: %1 - ").arg(m_Ctx.Replay().CurrentRemote()->Hostname); + prefix += tr("Remote: %1 - ").arg(m_Ctx.Replay().CurrentRemote()->Name()); QString text = prefix + lit("RenderDoc "); @@ -1057,15 +1057,15 @@ void MainWindow::FillRemotesMenu(QMenu *menu, bool includeLocalhost) action->setIcon(host->ServerRunning && !host->VersionMismatch ? Icons::tick() : Icons::cross()); if(host->Connected) - action->setText(tr("%1 (Connected)").arg(host->Hostname)); + action->setText(tr("%1 (Connected)").arg(host->Name())); else if(host->ServerRunning && host->VersionMismatch) - action->setText(tr("%1 (Bad Version)").arg(host->Hostname)); + action->setText(tr("%1 (Bad Version)").arg(host->Name())); else if(host->ServerRunning && host->Busy) - action->setText(tr("%1 (Busy)").arg(host->Hostname)); + action->setText(tr("%1 (Busy)").arg(host->Name())); else if(host->ServerRunning) - action->setText(tr("%1 (Online)").arg(host->Hostname)); + action->setText(tr("%1 (Online)").arg(host->Name())); else - action->setText(tr("%1 (Offline)").arg(host->Hostname)); + action->setText(tr("%1 (Offline)").arg(host->Name())); QObject::connect(action, &QAction::triggered, this, &MainWindow::switchContext); action->setData(i); @@ -1152,7 +1152,7 @@ void MainWindow::switchContext() } else { - contextChooser->setText(tr("Replay Context: %1").arg(host->Hostname)); + contextChooser->setText(tr("Replay Context: %1").arg(host->Name())); contextChooser->setIcon(host->ServerRunning ? Icons::connect() : Icons::disconnect()); // disable until checking is done diff --git a/renderdoc/api/replay/renderdoc_replay.h b/renderdoc/api/replay/renderdoc_replay.h index 36260fca9..d4e3d8d97 100644 --- a/renderdoc/api/replay/renderdoc_replay.h +++ b/renderdoc/api/replay/renderdoc_replay.h @@ -1426,6 +1426,10 @@ DOCUMENT("Internal function for setting a config setting."); extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_SetConfigSetting(const char *name, const char *value); +DOCUMENT("Internal function for fetching friendly android names."); +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_GetAndroidFriendlyName(const rdctype::str &device, + rdctype::str &friendly); + DOCUMENT("Internal function for enumerating android devices."); extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EnumerateAndroidDevices(rdctype::str *deviceList); diff --git a/renderdoc/replay/entry_points.cpp b/renderdoc/replay/entry_points.cpp index 23d7dbd94..b13a7d400 100644 --- a/renderdoc/replay/entry_points.cpp +++ b/renderdoc/replay/entry_points.cpp @@ -616,6 +616,34 @@ uint32_t StartAndroidPackageForCapture(const char *host, const char *package) } using namespace Android; +extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_GetAndroidFriendlyName(const rdctype::str &device, + rdctype::str &friendly) +{ + string manuf = adbExecCommand( + StringFormat::Fmt("-s %s shell getprop ro.product.manufacturer", device.c_str())); + string model = + adbExecCommand(StringFormat::Fmt("-s %s shell getprop ro.product.model", device.c_str())); + + manuf = trim(manuf); + model = trim(model); + + std::string combined; + + if(manuf.empty() && model.empty()) + combined = ""; + else if(manuf.empty() && !model.empty()) + combined = model; + else if(!manuf.empty() && model.empty()) + combined = manuf + " device"; + else if(!manuf.empty() && !model.empty()) + combined = manuf + " " + model; + + if(combined.empty()) + friendly = ""; + else + friendly = combined; +} + extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_EnumerateAndroidDevices(rdctype::str *deviceList) { string adbStdout = adbExecCommand("devices");