#!/system/bin/sh

# Copyright 2017-2020 Fairphone B.V.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

set -e
set -u
set -x

readonly PERSIST_PATH="persist"
readonly PROP_PATH="fp2.cam"

readonly ANY_FRAGMENT="any"
readonly SUBDEV_FRAGMENT="dev"
readonly SENSOR_FRAGMENT="sensor"
readonly CHANGED_FRAGMENT="changed"

readonly POSITIONS="main front"

readonly MAIN_SENSORS_PATTERN="(ov8865_q8v18a|ov12870)"
readonly FRONT_SENSORS_PATTERN="(ov2685|ov5670)"

readonly SYSFS_PATH="/sys/devices/fd8c0000.qcom,msm-cam/video4linux/*/name"


function _detect_front_sensor() {
  local sensor_name=`cat ${SYSFS_PATH} | grep -o -E "${FRONT_SENSORS_PATTERN}"`
  setprop \
      "${PROP_PATH}.front.${SENSOR_FRAGMENT}" \
      "${sensor_name}"
}


function _detect_main_sensor() {
  local sensor_name=`cat ${SYSFS_PATH} | grep -o -E "${MAIN_SENSORS_PATTERN}"`
  setprop \
      "${PROP_PATH}.main.${SENSOR_FRAGMENT}" \
      "${sensor_name}"
}


# Compare persist.* property with new property to detect if main or front
# Sensor has changed.
#
# Sets *.changed property to 1 for any sensor that has changed.
#
# Overwrites persist.* property with new sensor name.
function _detect_and_persist_sensor_change() {
    local changed_any_sensor=0

    for pos in ${POSITIONS}; do
        local changed_sensor=0

        local property="${PROP_PATH}.${pos}.${SENSOR_FRAGMENT}"

        local old_sensor="$(getprop "${PERSIST_PATH}.${property}")"
        local new_sensor="$(getprop "${property}")"

        # advocate change if:
        # a sensor is detected in the current position
        # AND a persist value is set (a camera was previously installed)
        # AND a different sensor is detected than stored in the persist value
        if [[ -n "${new_sensor}" ]] \
           && [[ -n "${old_sensor}" ]] \
           && [[ "${old_sensor}" != "${new_sensor}" ]] ; then
            setprop "${PROP_PATH}.${pos}.${CHANGED_FRAGMENT}" "1"
            changed_any_sensor=1
        fi

        # set new persist value with the new sensor name if it's non-empty
        if [[ -n "${new_sensor}" ]]; then
            setprop "${PERSIST_PATH}.${property}" "${new_sensor}"
        fi
    done

    echo "${changed_any_sensor}"
}


function _camera_detect_service() {
    _detect_main_sensor
    _detect_front_sensor
    local changed_any_sensor="$(_detect_and_persist_sensor_change)"
    setprop "${PROP_PATH}.${ANY_FRAGMENT}.${CHANGED_FRAGMENT}" \
        "${changed_any_sensor}"
}

_camera_detect_service
