handle static method
FutureOr<Response>
handle(
- Request request, {
- required ExtensionsManager extensionsManager,
- required DeeplinkManager deeplinkManager,
- required Analytics analytics,
- ServerApi? api,
- String? dtdUri,
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,
required Analytics analytics,
ServerApi? api,
String? dtdUri,
}) {
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] and [_encodeResponse]
// helpers.
switch (request.url.path) {
// ----- Flutter Tool GA store. -----
case apiGetFlutterGAEnabled:
// Is Analytics collection enabled?
return api.getCompleted(
json.encode(FlutterUsage.doesStoreExist ? _usage!.enabled : ''),
);
case apiGetFlutterGAClientId:
// Flutter Tool GA clientId - ONLY get Flutter's clientId if enabled is
// true.
return (FlutterUsage.doesStoreExist)
? api.getCompleted(
json.encode(_usage!.enabled ? _usage!.clientId : ''),
)
: api.getCompleted(
json.encode(''),
);
// ----- DevTools GA store. -----
case apiResetDevTools:
_devToolsUsage.reset();
return api.getCompleted(json.encode(true));
case apiGetDevToolsFirstRun:
// Has DevTools been run first time? To bring up analytics dialog.
//
// Additionally, package:unified_analytics will show a message if it
// is the first run with the package or the consent message version has
// been updated
final isFirstRun =
_devToolsUsage.isFirstRun || analytics.shouldShowMessage;
return api.getCompleted(
json.encode(isFirstRun),
);
case apiGetDevToolsEnabled:
// Is DevTools Analytics collection enabled?
final isEnabled =
_devToolsUsage.analyticsEnabled && analytics.telemetryEnabled;
return api.getCompleted(
json.encode(isEnabled),
);
case apiSetDevToolsEnabled:
// Enable or disable DevTools analytics collection.
if (queryParams.containsKey(devToolsEnabledPropertyName)) {
final analyticsEnabled =
json.decode(queryParams[devToolsEnabledPropertyName]!);
_devToolsUsage.analyticsEnabled = analyticsEnabled;
analytics.setTelemetry(analyticsEnabled);
}
return api.getCompleted(
json.encode(_devToolsUsage.analyticsEnabled),
);
case apiGetConsentMessage:
return api.getCompleted(analytics.getConsentMessage);
case apiMarkConsentMessageAsShown:
analytics.clientShowedMessage();
return api.getCompleted(json.encode(true));
// ----- 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 String theSurveyName = queryParams[activeSurveyName]!;
// Set the current activeSurvey.
_devToolsUsage.activeSurvey = theSurveyName;
result = true;
}
return api.getCompleted(json.encode(result));
case apiGetSurveyActionTaken:
// Request setActiveSurvey has not been requested.
if (_devToolsUsage.activeSurvey == null) {
return api.badRequest(
'$errorNoActiveSurvey '
'- $apiGetSurveyActionTaken',
);
}
// SurveyActionTaken has the survey been acted upon (taken or dismissed)
return api.getCompleted(
json.encode(_devToolsUsage.surveyActionTaken),
);
// 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 (_devToolsUsage.activeSurvey == null) {
return api.badRequest(
'$errorNoActiveSurvey '
'- $apiSetSurveyActionTaken',
);
}
// Set the SurveyActionTaken.
// Has the survey been taken or dismissed..
if (queryParams.containsKey(surveyActionTakenPropertyName)) {
_devToolsUsage.surveyActionTaken =
json.decode(queryParams[surveyActionTakenPropertyName]!);
}
return api.getCompleted(
json.encode(_devToolsUsage.surveyActionTaken),
);
case apiGetSurveyShownCount:
// Request setActiveSurvey has not been requested.
if (_devToolsUsage.activeSurvey == null) {
return api.badRequest(
'$errorNoActiveSurvey '
'- $apiGetSurveyShownCount',
);
}
// SurveyShownCount how many times have we asked to take survey.
return api.getCompleted(
json.encode(_devToolsUsage.surveyShownCount),
);
case apiIncrementSurveyShownCount:
// Request setActiveSurvey has not been requested.
if (_devToolsUsage.activeSurvey == null) {
return api.badRequest(
'$errorNoActiveSurvey '
'- $apiIncrementSurveyShownCount',
);
}
// Increment the SurveyShownCount, we've asked about the survey.
_devToolsUsage.incrementSurveyShownCount();
return api.getCompleted(
json.encode(_devToolsUsage.surveyShownCount),
);
// ----- Release notes api. -----
case apiGetLastReleaseNotesVersion:
return api.getCompleted(
json.encode(_devToolsUsage.lastReleaseNotesVersion),
);
case apiSetLastReleaseNotesVersion:
if (queryParams.containsKey(lastReleaseNotesVersionPropertyName)) {
_devToolsUsage.lastReleaseNotesVersion =
queryParams[lastReleaseNotesVersionPropertyName]!;
}
return api.getCompleted(
json.encode(_devToolsUsage.lastReleaseNotesVersion),
);
// ----- 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.getCompleted(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.getCompleted(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,
);
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 api.getCompleted(
json.encode({DtdApi.uriPropertyName: dtdUri}),
);
default:
return api.notImplemented();
}
}