diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 8c71fd06..0dcdda23 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -13,6 +13,7 @@
 #include <array>
 #include <cmath>
 #include <fstream>
+#include <map>
 #include <sys/mman.h>
 #include <tuple>
 #include <unistd.h>
@@ -840,6 +841,19 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 	const ControlInfoMap &controlsInfo = camera_->controls();
 	const ControlList &properties = camera_->properties();
 
+	std::map<camera_metadata_enum_android_request_available_capabilities, bool>
+	capabilities = {
+		{ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE, true },
+		/* \todo Change these three to true when we have checks for them */
+		{ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE, false },
+		{ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR, false },
+		{ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING, false },
+		{ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW, false },
+	};
+
+	/* \todo Change this to true when we have checks for it */
+	bool fullSupport = false;
+
 	/* Color correction static metadata. */
 	{
 		std::vector<uint8_t> data;
@@ -1298,11 +1312,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 	uint8_t croppingType = ANDROID_SCALER_CROPPING_TYPE_CENTER_ONLY;
 	staticMetadata_->addEntry(ANDROID_SCALER_CROPPING_TYPE, croppingType);
 
-	/* Info static metadata. */
-	uint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;
-	staticMetadata_->addEntry(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
-				  supportedHWLevel);
-
 	/* Request static metadata. */
 	int32_t partialResultCount = 1;
 	staticMetadata_->addEntry(ANDROID_REQUEST_PARTIAL_RESULT_COUNT,
@@ -1323,10 +1332,6 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 	staticMetadata_->addEntry(ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS,
 				  maxNumInputStreams);
 
-	std::vector<uint8_t> availableCapabilities = {
-		ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE,
-	};
-
 	/* Report if camera supports RAW. */
 	bool rawStreamAvailable = false;
 	std::unique_ptr<CameraConfiguration> cameraConfig =
@@ -1338,7 +1343,7 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 		if (info.colourEncoding == PixelFormatInfo::ColourEncodingRAW &&
 		    info.bitsPerPixel == 16) {
 			rawStreamAvailable = true;
-			availableCapabilities.push_back(ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW);
+			capabilities[ANDROID_REQUEST_AVAILABLE_CAPABILITIES_RAW] = true;
 		}
 	}
 
@@ -1347,9 +1352,29 @@ const camera_metadata_t *CameraDevice::getStaticMetadata()
 	staticMetadata_->addEntry(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
 				  numOutStreams);
 
+	/* Check capabilities */
+	std::vector<uint8_t> availableCapabilities;
+	for (auto cap : capabilities) {
+		if (cap.second)
+			availableCapabilities.push_back(CapabilityTable.at(cap.first));
+	}
 	staticMetadata_->addEntry(ANDROID_REQUEST_AVAILABLE_CAPABILITIES,
 				  availableCapabilities);
 
+	uint8_t supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;
+	if (capabilities[ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR] &&
+	    capabilities[ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING] &&
+	    capabilities[ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE] &&
+	    fullSupport)
+		supportedHWLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL;
+	staticMetadata_->addEntry(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
+				  supportedHWLevel);
+
+	LOG(HAL, Info)
+		<< "Hardware level: "
+		<< supportedHWLevel == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL
+		   ? "FULL" : "LIMITED";
+
 	std::vector<int32_t> availableCharacteristicsKeys = {
 		ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
 		ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
