public void renderFrame()

in car_app_library/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/renderer/CarHardwareRenderer.java [307:505]


    public void renderFrame(@NonNull Canvas canvas, @Nullable Rect visibleArea,
            @Nullable Rect stableArea) {
        if (stableArea != null) {
            if (stableArea.isEmpty()) {
                // No inset set. The entire area is considered safe to draw.
                stableArea.set(0, 0, canvas.getWidth() - 1, canvas.getHeight() - 1);
            }

            int height = Math.min(stableArea.height() / 8, MAX_FONT_SIZE);
            int updatedSize = height - ROW_SPACING;
            mCarInfoPaint.setTextSize(updatedSize);

            canvas.drawRect(stableArea, mCarInfoPaint);

            Paint.FontMetrics fm = mCarInfoPaint.getFontMetrics();
            float verticalPos = stableArea.top - fm.ascent;

            // Prepare text for Toll card status
            StringBuilder info = new StringBuilder();
            if (!mHasTollCardPermission) {
                info.append("No TollCard Permission.");
            } else if (mTollCard == null) {
                info.append("Fetching Toll information.");
            } else {
                if (mTollCard.getCardState().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Toll card state: N/A. ");
                } else {
                    info.append("Toll card state: ");
                    info.append(mTollCard.getCardState().getValue());
                }
            }
            canvas.drawText(info.toString(), LEFT_MARGIN, verticalPos, mCarInfoPaint);
            verticalPos += height;

            // Prepare text for Energy Level
            info = new StringBuilder();
            if (!mHasEnergyLevelPermission) {
                info.append("No EnergyLevel Permission.");
            } else if (mEnergyLevel == null) {
                info.append("Fetching Energy Level.");
            } else {
                if (mEnergyLevel.getEnergyIsLow().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Low energy: N/A. ");
                } else {
                    info.append("Low energy: ");
                    info.append(mEnergyLevel.getEnergyIsLow().getValue());
                    info.append(" ");
                }
                if (mEnergyLevel.getRangeRemainingMeters().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Range: N/A. ");
                } else {
                    info.append("Range: ");
                    info.append(mEnergyLevel.getRangeRemainingMeters().getValue());
                    info.append(" m. ");
                }
                if (mEnergyLevel.getFuelPercent().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Fuel: N/A. ");
                } else {
                    info.append("Fuel: ");
                    info.append(mEnergyLevel.getFuelPercent().getValue());
                    info.append("% ");
                }
                if (mEnergyLevel.getBatteryPercent().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Battery: N/A. ");
                } else {
                    info.append("Battery: ");
                    info.append(mEnergyLevel.getBatteryPercent().getValue());
                    info.append("% ");
                }
            }
            canvas.drawText(info.toString(), LEFT_MARGIN, verticalPos, mCarInfoPaint);
            verticalPos += height;

            // Prepare text for Speed
            info = new StringBuilder();
            if (!mHasSpeedPermission) {
                info.append("No Speed Permission.");
            } else if (mSpeed == null) {
                info.append("Fetching Speed.");
            } else {
                if (mSpeed.getDisplaySpeedMetersPerSecond().getStatus()
                        != CarValue.STATUS_SUCCESS) {
                    info.append("Display Speed: N/A. ");
                } else {
                    info.append("Display Speed: ");
                    info.append(mSpeed.getDisplaySpeedMetersPerSecond().getValue());
                    info.append(" m/s. ");
                }
                if (mSpeed.getRawSpeedMetersPerSecond().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Raw Speed: N/A. ");
                } else {
                    info.append("Raw Speed: ");
                    info.append(mSpeed.getRawSpeedMetersPerSecond().getValue());
                    info.append(" m/s. ");
                }
                if (mSpeed.getSpeedDisplayUnit().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Unit: N/A.");
                } else {
                    info.append("Unit: ");
                    info.append(mSpeed.getSpeedDisplayUnit().getValue());
                    info.append(" ");
                }
            }
            canvas.drawText(info.toString(), LEFT_MARGIN, verticalPos, mCarInfoPaint);
            verticalPos += height;

            // Prepare text for Odometer
            info = new StringBuilder();
            if (!mHasMileagePermission) {
                info.append("No Mileage Permission.");
            } else if (mMileage == null) {
                info.append("Fetching mileage.");
            } else {
                if (mMileage.getOdometerMeters().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Odometer: N/A. ");
                } else {
                    info.append("Odometer: ");
                    info.append(mMileage.getOdometerMeters().getValue());
                    info.append(" m. ");
                }
                if (mMileage.getDistanceDisplayUnit().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Unit: N/A.");
                } else {
                    info.append("Unit: ");
                    info.append(mMileage.getDistanceDisplayUnit().getValue());
                    info.append(" ");
                }
            }
            canvas.drawText(info.toString(), LEFT_MARGIN, verticalPos, mCarInfoPaint);
            verticalPos += height;

            // Prepare text for Accelerometer
            info = new StringBuilder();
            if (!mHasAccelerometerPermission) {
                info.append("No Accelerometer Permission.");
            } else if (mAccelerometer == null) {
                info.append("Fetching accelerometer");
            } else {
                if (mAccelerometer.getForces().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Accelerometer N/A.");
                } else {
                    info.append("Accelerometer: ");
                    appendFloatList(info, mAccelerometer.getForces().getValue());
                }
            }
            canvas.drawText(info.toString(), LEFT_MARGIN, verticalPos, mCarInfoPaint);
            verticalPos += height;

            // Prepare text for Gyroscope
            info = new StringBuilder();
            if (!mHasGyroscopePermission) {
                info.append("No Gyroscope Permission.");
            } else if (mGyroscope == null) {
                info.append("Fetching gyroscope");
            } else {
                if (mGyroscope.getRotations().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Gyroscope N/A.");
                } else {
                    info.append("Gyroscope: ");
                    appendFloatList(info, mGyroscope.getRotations().getValue());
                }
            }
            canvas.drawText(info.toString(), LEFT_MARGIN, verticalPos, mCarInfoPaint);
            verticalPos += height;

            // Prepare text for Compass
            info = new StringBuilder();
            if (!mHasCompassPermission) {
                info.append("No Compass Permission.");
            } else if (mCompass == null) {
                info.append("Fetching compass");
            } else {
                if (mCompass.getOrientations().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Compass N/A.");
                } else {
                    info.append("Compass: ");
                    appendFloatList(info, mCompass.getOrientations().getValue());
                }
            }
            canvas.drawText(info.toString(), LEFT_MARGIN, verticalPos, mCarInfoPaint);
            verticalPos += height;

            // Prepare text for Location
            info = new StringBuilder();
            if (!mHasCarHardwareLocationPermission) {
                info.append("No CarHardwareLocation Permission.");
            } else if (mCarHardwareLocation == null) {
                info.append("Fetching location");
            } else {
                if (mCarHardwareLocation.getLocation().getStatus() != CarValue.STATUS_SUCCESS) {
                    info.append("Car Hardware Location N/A");
                } else {
                    info.append("Car Hardware location: ");
                    info.append(mCarHardwareLocation.getLocation().getValue().toString());
                }
            }
            canvas.drawText(info.toString(), LEFT_MARGIN, verticalPos, mCarInfoPaint);
        }
    }