• Руководство по стилю Kotlin для Android разработчиков (Часть I)
    0

    +
    В detekt есть правило по которому особо нет доводов за написание тех же логических операторов в if else в конце


    If (isFirst &&
        isSecond &&
        isThird ||
        isForth
    ) { .. }

    Когда удобней читать код вначале


    If (isFirst
        && isSecond
        && isThird
        || isForth
    ) { .. }

    Как с висящей запятой, при изменениях другим разработчиком будет затронута прошлая строка

  • Не баян: ищем дубликаты изображений на основе Milvus с индексом FAISS внутри
    +1

    Была задача искать локально на android девайсе в адресной книге одинаковые фото контактов или проверять идентичность с предыдущей(а android всегда конвертирует картинки и не оставляет исходную), как очень простое решение использовался phash от картинок, но у такого подхода были свои минусы точности сравнения, так как задается порог при котором они считаются одинаковыми даже после различных трансформаций, интересно как такую задачу можно было решать на слабом железе иначе?

  • Блокировка двойного клика. Велосипед?
    0
    это один из легальных способов кмк избавиться от открытия двух и более activity/fragment/view/dialog в android и очень надежный,
    обычно все view находятся внутри чего то что имеет жц, и если клик только про переход в любой другой из activity/fragment/view/dialog, то на текущем месте вызова стейт lifecycle поменяется на paused/stopped и не даст продублировать клик, ваш вариант больше про что то внутри текущего экрана(добавить в корзину товар и тд), тут да велосипеды везде с delay логикой будут.
  • Блокировка двойного клика. Велосипед?
    0
    для случаев старта другой activity при кликах можно обернуть OnClickListener проверкой

    class ResumedClickListener extends OnClickListener {
    
        private final LifecycleOwner lifecycleOwner;
    
        public ResumedClickListener(LifecycleOwner lifecycleOwner) {
            this.lifecycleOwner = lifecycleOwner;
        }
    
        @Override
        public void onClick(View v) {
            if (lifecycleOwner.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
                // code
            }    
        }
    }


    или kotlin
    inline fun LifecycleOwner.runIfResumed(block: () -> Unit) {
        if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
            block.invoke()
        }
    }