InstallResult.fromPlatformPayload constructor

InstallResult.fromPlatformPayload(
  1. Map? payload
)

Parse a variety of platform payloads (Android PendingIntent extras, iOS completion result, etc.) into a conservative InstallResult. This helps normalize different platform callback shapes.

Implementation

factory InstallResult.fromPlatformPayload(Map<dynamic, dynamic>? payload) {
  if (payload == null) {
    return InstallResult(status: InstallStatus.failed, message: 'empty payload');
  }

  // If the platform already provides a clear `status`, prefer that.
  if (payload['status'] != null) {
    return InstallResult.fromMap(payload);
  }

  // iOS-style: accepted boolean and optional error
  final accepted = payload['accepted'];
  if (accepted is bool) {
    if (accepted) {
      return InstallResult(status: InstallStatus.success, message: payload['message']?.toString());
    }
    return InstallResult(status: InstallStatus.failed, message: payload['message']?.toString());
  }

  // Android-style: look for numeric result codes (common keys)
  final int? code = (payload['resultCode'] is int)
      ? payload['resultCode'] as int
      : (payload['result'] is int)
          ? payload['result'] as int
          : (payload['code'] is int)
              ? payload['code'] as int
              : null;
  if (code != null) {
    // Heuristic: 0 => success, other => failure (we don't assume other meanings)
    if (code == 0) {
      return InstallResult(status: InstallStatus.success, message: 'resultCode=0');
    }
    return InstallResult(status: InstallStatus.failed, message: 'resultCode=$code');
  }

  // Fallback: look for known message or error fields
  final msg = payload['message'] ?? payload['error'] ?? payload['msg'];
  if (msg != null) {
    return InstallResult(status: InstallStatus.failed, message: msg.toString());
  }

  // Unknown payload shape — return failed conservatively but include raw payload as message
  return InstallResult(status: InstallStatus.failed, message: 'unrecognized payload: ${payload.toString()}');
}