handle static method
FutureOr<Response>
handle(
- Request request, {
- required ExtensionsManager extensionsManager,
- required DeeplinkManager deeplinkManager,
- ServerApi? api,
- DTDConnectionInfo? dtd,
Handles all requests.
To override an API call, pass in a subclass of ServerApi.
Implementation
static FutureOr<shelf.Response> handle(
shelf.Request request, {
required ExtensionsManager extensionsManager,
required DeeplinkManager deeplinkManager,
ServerApi? api,
DTDConnectionInfo? dtd,
}) {
api ??= ServerApi();
final queryParams = request.requestedUri.queryParameters;
// TODO(kenz): break this switch statement up so that it uses helper methods
// for each case. Also use [_checkRequiredParameters] helper.
switch (request.url.path) {
case apiNotifyForVmServiceConnection:
return Handler.handleNotifyForVmServiceConnection(
api,
queryParams,
dtd,
);
// ----- Flutter Tool GA store. -----
case apiGetFlutterGAEnabled:
// Is Analytics collection enabled?
return _encodeResponse(
LocalFileSystem.flutterStoreExists()
? _flutterStore.gaEnabled
: false,
api: api,
);
case apiGetFlutterGAClientId:
// Flutter Tool GA clientId - ONLY get Flutter's clientId if enabled is
// true.
return _encodeResponse(
LocalFileSystem.flutterStoreExists()
? _flutterStore.flutterClientId
: '',
api: api,
);
// ----- DevTools GA store. -----
case apiResetDevTools:
_devToolsStore.reset();
return _encodeResponse(true, api: api);
case apiGetDevToolsFirstRun:
// Has DevTools been run first time? To bring up analytics dialog.
final isFirstRun = _devToolsStore.isFirstRun;
return _encodeResponse(isFirstRun, api: api);
case apiGetDevToolsEnabled:
// Is DevTools Analytics collection enabled?
final isEnabled = _devToolsStore.analyticsEnabled;
return _encodeResponse(isEnabled, api: api);
case apiSetDevToolsEnabled:
// Enable or disable DevTools analytics collection.
if (queryParams.containsKey(devToolsEnabledPropertyName)) {
final analyticsEnabled =
json.decode(queryParams[devToolsEnabledPropertyName]!);
_devToolsStore.analyticsEnabled = analyticsEnabled;
}
return _encodeResponse(_devToolsStore.analyticsEnabled, api: api);
// ----- DevTools survey store. -----
case apiSetActiveSurvey:
// Assume failure.
bool result = false;
// Set the active survey used to store subsequent apiGetSurveyActionTaken,
// apiSetSurveyActionTaken, apiGetSurveyShownCount, and
// apiIncrementSurveyShownCount calls.
if (queryParams.keys.length == 1 &&
queryParams.containsKey(activeSurveyName)) {
final surveyName = queryParams[activeSurveyName]!;
// Set the current activeSurvey.
_devToolsStore.activeSurvey = surveyName;
result = true;
}
return _encodeResponse(result, api: api);
case apiGetSurveyActionTaken:
// Request setActiveSurvey has not been requested.
if (_devToolsStore.activeSurvey == null) {
return api.badRequest(
'$errorNoActiveSurvey '
'- $apiGetSurveyActionTaken',
);
}
// SurveyActionTaken has the survey been acted upon (taken or dismissed)
return _encodeResponse(_devToolsStore.surveyActionTaken, api: api);
// TODO(terry): remove the query param logic for this request.
// setSurveyActionTaken should only be called with the value of true, so
// we can remove the extra complexity.
case apiSetSurveyActionTaken:
// Request setActiveSurvey has not been requested.
if (_devToolsStore.activeSurvey == null) {
return api.badRequest(
'$errorNoActiveSurvey '
'- $apiSetSurveyActionTaken',
);
}
// Set the SurveyActionTaken.
// Has the survey been taken or dismissed..
if (queryParams.containsKey(surveyActionTakenPropertyName)) {
_devToolsStore.surveyActionTaken =
json.decode(queryParams[surveyActionTakenPropertyName]!);
}
return _encodeResponse(_devToolsStore.surveyActionTaken, api: api);
case apiGetSurveyShownCount:
// Request setActiveSurvey has not been requested.
if (_devToolsStore.activeSurvey == null) {
return api.badRequest(
'$errorNoActiveSurvey '
'- $apiGetSurveyShownCount',
);
}
// SurveyShownCount how many times have we asked to take survey.
return _encodeResponse(_devToolsStore.surveyShownCount, api: api);
case apiIncrementSurveyShownCount:
// Request setActiveSurvey has not been requested.
if (_devToolsStore.activeSurvey == null) {
return api.badRequest(
'$errorNoActiveSurvey '
'- $apiIncrementSurveyShownCount',
);
}
// Increment the SurveyShownCount, we've asked about the survey.
_devToolsStore.incrementSurveyShownCount();
return _encodeResponse(_devToolsStore.surveyShownCount, api: api);
// ----- Release notes api. -----
case apiGetLastReleaseNotesVersion:
return _encodeResponse(
_devToolsStore.lastReleaseNotesVersion,
api: api,
);
case apiSetLastReleaseNotesVersion:
if (queryParams.containsKey(lastReleaseNotesVersionPropertyName)) {
_devToolsStore.lastReleaseNotesVersion =
queryParams[lastReleaseNotesVersionPropertyName]!;
return _encodeResponse(true, api: api);
}
return _encodeResponse(false, api: api);
// ----- App size api. -----
case apiGetBaseAppSizeFile:
if (queryParams.containsKey(baseAppSizeFilePropertyName)) {
final filePath = queryParams[baseAppSizeFilePropertyName]!;
final fileJson = LocalFileSystem.devToolsFileAsJson(filePath);
if (fileJson == null) {
return api.badRequest('No JSON file available at $filePath.');
}
return api.success(fileJson);
}
return api.badRequest(
'Request for base app size file does not '
'contain a query parameter with the expected key: '
'$baseAppSizeFilePropertyName',
);
case apiGetTestAppSizeFile:
if (queryParams.containsKey(testAppSizeFilePropertyName)) {
final filePath = queryParams[testAppSizeFilePropertyName]!;
final fileJson = LocalFileSystem.devToolsFileAsJson(filePath);
if (fileJson == null) {
return api.badRequest('No JSON file available at $filePath.');
}
return api.success(fileJson);
}
return api.badRequest(
'Request for test app size file does not '
'contain a query parameter with the expected key: '
'$testAppSizeFilePropertyName',
);
// ----- Extensions api. -----
case ExtensionsApi.apiServeAvailableExtensions:
return _ExtensionsApiHandler.handleServeAvailableExtensions(
api,
queryParams,
extensionsManager,
dtd,
);
case ExtensionsApi.apiExtensionEnabledState:
return _ExtensionsApiHandler.handleExtensionEnabledState(
api,
queryParams,
);
// ----- deeplink api. -----
case DeeplinkApi.androidBuildVariants:
return _DeeplinkApiHandler.handleAndroidBuildVariants(
api,
queryParams,
deeplinkManager,
);
case DeeplinkApi.androidAppLinkSettings:
return _DeeplinkApiHandler.handleAndroidAppLinkSettings(
api,
queryParams,
deeplinkManager,
);
case DeeplinkApi.iosBuildOptions:
return _DeeplinkApiHandler.handleIosBuildOptions(
api,
queryParams,
deeplinkManager,
);
case DeeplinkApi.iosUniversalLinkSettings:
return _DeeplinkApiHandler.handleIosUniversalLinkSettings(
api,
queryParams,
deeplinkManager,
);
case DtdApi.apiGetDtdUri:
return _DtdApiHandler.handleGetDtdUri(api, dtd);
default:
return api.notImplemented();
}
}