<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def auto_add(self, device, recursive=None, automount=True):
 """ Automatically attempt to mount or unlock a device, but be quiet if the device is not supported. :param device: device object, block device path or mount path :param bool recursive: recursively mount and unlock child devices :returns: whether all attempted operations succeeded """

        device, created = await self._find_device_losetup(device)
        if created and recursive is False:
            return device
        if device.is_luks_cleartext and self.udisks.version_info >= (2, 7, 0):
            await sleep(1.5)    # temporary workaround for #153, unreliable
        success = True
        if not self.is_automount(device, automount):
            pass
        elif device.is_filesystem:
            if not device.is_mounted:
                success = await self.mount(device)
        elif device.is_crypto:
            if self._prompt and not device.is_unlocked:
                success = await self.unlock(device)
            if success and recursive:
                await self.udisks._sync()
                device = self.udisks[device.object_path]
                success = await self.auto_add(
                    device.luks_cleartext_holder,
                    recursive=True)
        elif recursive and device.is_partition_table:
            tasks = [
                self.auto_add(dev, recursive=True)
                for dev in self.get_all_handleable()
                if dev.is_partition and dev.partition_slave == device
            ]
            results = await gather(*tasks)
            success = all(results)
        else:
            self._log.debug(_('not adding {0}: unhandled device', device))
        return success