Files
flipper/iOS/SonarKit/SonarClient.mm
John Knox f99ef6996e Summarise state in iOS diagnostics
Summary:
V1 ios diagnostics complete.

This change adds a new section to the ios diagnostics screen that shows the current state of each step required to get sonar working.
The logs (transitions between states) are displayed below it.

SonarClient.mm is technically involved in the UI, by converting enums to emojis, I don't like this
but didn't get obj-C working with C enums so have left it like this for now.

Reviewed By: priteshrnandgaonkar

Differential Revision: D9378212

fbshipit-source-id: 091ce00e898a8038c680555123640b90d753fc09
2018-08-28 04:14:01 -07:00

169 lines
4.3 KiB
Plaintext

/*
* Copyright (c) 2018-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the LICENSE
* file in the root directory of this source tree.
*
*/
#if FB_SONARKIT_ENABLED
#import "SonarClient.h"
#import "SonarCppWrapperPlugin.h"
#import <Sonar/SonarClient.h>
#include <folly/io/async/EventBase.h>
#include <folly/io/async/ScopedEventBaseThread.h>
#import <UIKit/UIKit.h>
#include "SKStateUpdateCPPWrapper.h"
#import "FlipperDiagnosticsViewController.h"
#if !TARGET_OS_SIMULATOR
//#import "SKPortForwardingServer.h"
#endif
using WrapperPlugin = facebook::sonar::SonarCppWrapperPlugin;
@implementation SonarClient {
facebook::sonar::SonarClient *_cppClient;
folly::ScopedEventBaseThread sonarThread;
folly::ScopedEventBaseThread connectionThread;
#if !TARGET_OS_SIMULATOR
// SKPortForwardingServer *_server;
#endif
}
+ (instancetype)sharedClient
{
static SonarClient *sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedClient = [[self alloc] init];
});
return sharedClient;
}
- (instancetype)init
{
if (self = [super init]) {
UIDevice *device = [UIDevice currentDevice];
NSString *deviceName = [device name];
NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleNameKey];
NSString *deviceId = [[device identifierForVendor]UUIDString];
NSString *appId = appName;
NSString *privateAppDirectory = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES)[0];
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:privateAppDirectory isDirectory:NULL] == NO) {
//TODO: Handle errors properly
[manager createDirectoryAtPath:privateAppDirectory withIntermediateDirectories:YES attributes:nil error:nil];
}
#if TARGET_OS_SIMULATOR
deviceName = [NSString stringWithFormat:@"%@ %@", [[UIDevice currentDevice] model], @"Simulator"];
#endif
facebook::sonar::SonarClient::init({
{
"localhost",
"iOS",
[deviceName UTF8String],
[deviceId UTF8String],
[appName UTF8String],
[appId UTF8String],
[privateAppDirectory UTF8String],
},
sonarThread.getEventBase(),
connectionThread.getEventBase()
});
_cppClient = facebook::sonar::SonarClient::instance();
}
return self;
}
- (void)refreshPlugins
{
_cppClient->refreshPlugins();
}
- (void)addPlugin:(NSObject<SonarPlugin> *)plugin
{
_cppClient->addPlugin(std::make_shared<WrapperPlugin>(plugin));
}
- (void)removePlugin:(NSObject<SonarPlugin> *)plugin
{
_cppClient->removePlugin(std::make_shared<WrapperPlugin>(plugin));
}
- (NSObject<SonarPlugin> *)pluginWithIdentifier:(NSString *)identifier
{
auto cppPlugin = _cppClient->getPlugin([identifier UTF8String]);
if (auto wrapper = dynamic_cast<WrapperPlugin *>(cppPlugin.get())) {
return wrapper->getObjCPlugin();
}
return nil;
}
- (void)start;
{
#if !TARGET_OS_SIMULATOR
// _server = [SKPortForwardingServer new];
// [_server forwardConnectionsFromPort:8088];
// [_server listenForMultiplexingChannelOnPort:8078];
#endif
_cppClient->start();
}
- (void)stop
{
_cppClient->stop();
#if !TARGET_OS_SIMULATOR
// [_server close];
// _server = nil;
#endif
}
- (NSString *)getState {
return @(_cppClient->getState().c_str());
}
- (NSArray *)getStateElements {
NSMutableArray<NSDictionary<NSString *, NSString *>*> *const array = [NSMutableArray array];
for (facebook::sonar::StateElement element: _cppClient->getStateElements()) {
facebook::sonar::State state = element.state_;
NSString *stateString;
switch (state) {
case facebook::sonar::in_progress:
stateString = @"⏳ ";
break;
case facebook::sonar::success:
stateString = @"✅ ";
break;
case facebook::sonar::failed:
stateString = @"❌ ";
break;
default:
stateString = @"❓ ";
break;
}
[array addObject:@{
@"name": [NSString stringWithUTF8String:element.name_.c_str()],
@"state": stateString
}];
}
return array;
}
- (void)subscribeForUpdates:(id<FlipperStateUpdateListener>)controller {
auto stateListener = std::make_shared<SKStateUpdateCPPWrapper>(controller);
_cppClient->setStateListener(stateListener);
}
@end
#endif