Сказ о том, как Android-разработчика спамеры задолбали, и что и из этого вышло

    Привет, Хабр. Экономить воду нужно, это знают все. Дело это полезное. И чтобы граждан простимулировать в этом добром деле, у нас повсеместно ставят водосчетчики. Причем без счетчика платишь в несколько раз больше.

    Сам процесс установки выглядит так: вызываете мастера из сертифицированной конторы, он устанавливает счетчик, опечатывает его, расписывается и ставит печать в бумагах, с которыми идёте в единый расчетный центр, и ваш счетчик ставится на учет.

    Далее через сайт, либо по телефону вы передаете показания. Но как обычно, ко всякому благому делу присасываются кровопийцы и мошенники разных мастей. Чтобы облегчить себе жизнь, и усложнить её спамерам и мошенникам я написал приложение «Журнал счетчиков».



    Под катом я расскажу вам о размышлениях, творческих метаниях, и процессе разработки, в шести частях, с антрактом, лирическими отступлениями и техническими подробностями.

    Часть первая — Воинственная


    Вот поставили вы себе счётчики, опломбировали и подали информацию в службу Единого Окна. Живёте себе спокойно, передаёте данные по показаниям, и в ус не дуете. И тут через год или два раздаётся звонок, от Единого Расчетного Центра/Управы/Городского Центра Метрологии/Самой Управляющей Компанией (нужное подчеркнуть). В трубке воинственная барышня/юноша сообщают, что срок службы счётчика вашего истёк — и быстрее ставьте новый – и когда наш мастер приедет?

    Мошенники ведут себя агрессивно, вываливают поток слов, угрожают переводом на повышенный тариф без счетчиков, штрафами и санкциями. Так как звонят в середине рабочего дня, когда все на работе, и дома в основном пенсионеры, то в основном рассчитано на них, как наиболее доверчивых людей.

    Общая рекомендация – не стесняйтесь, и посылайте этих нехороших людишек в далёкие страны. А информацию о сроках поверки, вы можете посмотреть в паспорте на свой счетчик.

    Но порой найти вы в упор не помните, когда и что меняли и устанавливали, и куда паспорт от прибора запихали.

    Диалог со спамером - У меня есть сосед
    (С) -спамер, (Я) — Я
    (С) – (и даже не поздоровался, хамло) РосКосмосВодоНаноКанал имени Святой Метрологии. Вы должны поменять счетчики на воду! У вас заканчивается срок службы!
    (Я) – (в голосе паника) Ой! Что же делать!
    (С) – (довольный, рыбка-то попалась) Мы пришлем вам мастера. Когда сможете принять?
    (Я) – А что мастер сделает?
    (С) – Он поменяет вам счетчики на новые!
    (Я) – А зачем менять то?
    (С) – (сердится) Потому, что так положено! Говорите адрес!
    (Я) – Погодите. У меня сосед, он профессиональный строитель. Он мне сказал, что детальку меняют, и не надо счетчик снимать!
    (С) – (уже с душой) Ваш сосед ничего не понимает! Это же метрология!
    (Я) — (праведный гнев) Вы обманываете меня! Мой сосед ПРОФЕССИОНАЛЬНЫЙ строитель!!! Он лучше всех знает!!!
    (С) – (раздражение и злость, смешалось в этом голоске) Ах так!!! Ну тогда вам пришлют письменное извещение!!! И платить вы будете по повышенному тарифу!!! (гудки....)

    Часть вторая – Размышления.


    Итак, чтобы не искать информацию по счетчикам, необходимо иметь её под рукою. Может записать её в тетрадочку и положить на стол? А заодно в эту тетрадочку буду записывать и ежемесячные показания счётчиков.

    Решение простое, и эффективное. Осложняется тем, что у меня трое весёлых малышей, для которых любая бумага в пределах доступности (включая документы и обои) – потенциальный альбом, который нужно изрисовать или порвать на мелкие кусочки. По той же причине дома порой не найдёшь нормально пишущей ручки или карандаша. И приходится писать показания на огрызках салфеток (манжетах/глиняных табличках).

    Хорошо, заведу-ка я таблицу в Excel, табличку и буду записывать всё там. Но опять же, не потащу я компьютер в ванную и туалет, чтобы записать показания. Иначе мы опять возвращаемся к бумажке и ручке.

    ОК. Буду использовать планшет. Но всё что мог на тот момент предоставить Маркет – либо платное, либо не отвечающее моему представлению о прекрасном. Да и в конце-то концов я Android – разработчик, или где?

    Диалог со спамером - Подумай о душе, Мария
    (С) – Добрый день, мы хотим предложить вам перейти на новый интернет, от лучшего провайдера. У нас самый выгодный…
    (Я) – Простите, представьтесь пожалуйста.
    (С) – Ээээ… Мария. Так вот…
    (Я) – (торжественно) Мария! Я хочу поговорить с вами о Боге!
    (С) — …
    (Я) – Вы хотите поговорить со мной о Боге? Мария, я не слышу вас!
    (С) — … Мы вообще-то…
    (делает попытку вернуть все в русло первоначальной беседы)
    (С) – Послушайте, мы хотим предложить вам выгодные условия…
    (Я) – (добавив, щепотку праведного гнева) Мария! О чем вы?!!! Что может быть важнее разговора о Боге?!!!
    (С) – Как понимаю, вы не хотите разговаривать. (гудки...)

    Часть третья – Подготовительная


    Итак, составим план, в котором перечислив всё, что нам нужно.

    Первое – иметь под рукой все данные по счётчикам. А именно: номер, модель, дата замены, лицевой счёт, контакты обслуживающей компании и мастер-установщик.

    Второе – удобный инструмент для занесения ежемесячных показаний, а также какой-то простейший инструмент анализа.

    Третье – иметь возможность завести несколько квартир, например чтобы вести статистику по квартире родителей.

    Четвёртое – если понравится в использовании, не быть жадиной и поделиться с миром.

    Диалог со спамером - Ориентируемся на личность
    (С) – Добрый день (и называет, гад, мое имя). Меня зовут Виталий. Я хочу предложить вам выгодное предложение, по управлению вашими капиталами.
    (Я) – Виталька!!! Это ты?!!! Сколько лет!!! Сколько зим!!!
    (С) – (слегка обалдев) Я…
    (Я) – Блин!!! Я ж твоего звонка ждал!!! Как сам?!!! Как жена?! Как дети?!!!
    (С) – (охреневая глубже) Я вообще-то не женат…
    (Я) – Ну что ж ты балбес. Мужик без жены, как гусеница без дерева!
    (С) – Ну, я как понимаю вас достали со звонками. До свидания…

    Часть четвёртая – Эксперименты.


    Первый вариант был прост и бесхитростен. Всё построено на ListView. Настроек нет. Зато ввиду моего тогдашнего увлечения пиксель-артом, значки нарисовал сам.


    Старый дизайн

    Главное, что приложение работало. Велась статистика (кстати пригодилось, когда пришлось пободаться с Мосэнерго).

    Ввиду того, что меня приложение устраивало – создал аккаунт разработчика в Маркете, и выложил на суд общественности. Параллельно написал пост на Пикабу.

    Основная критика касалась непритязательного внешнего вида, полного отсутствия Материал Дизайна, и значков которые «словно вернули в 90-е». Но в целом отзывы были положительными.
    Тем временем я написал еще одно приложение, о чем рассказал на Хабре. Совершенно неожиданно для меня, количество скачиваний именно «Журнала счётчиков» резко скакануло вверх.

    Чувствуя ответственность перед более 5000 пользователей, я решил переписать приложение.
    Для начала сел с блокнотом (чудом спасённым от моих индейцев), проанализировал комментарии, и выписал наиболее интересные предложения. Причём некоторые был весьма неожиданными, но реально добавляющие удобства пользователю. Например, добавить возможность включить фонарик, при занесении показаний счетчика.

    Переписывать пришлось очень много. А с учетом работы и семьи, работать приходилось ночами, и переделка заняла чуть ли не больше времени, чем написание первой версии.

    Поменял полностью дизайн:


    Новый дизайн

    Добавил настройки, и возможность сохранить/загрузить данные в/из файла:



    Перерисовал иконки в векторе, исправил кучу глюков и ошибок, добавил счётчик тепла, и написал инструкцию. В общем, почти с нуля переделал.

    Диалог со спамером - Говорящий с Богами
    (С) – Добрый день. Я говорю с (мое имя). Мы из банка-партнёра от банка «Тинкофф». Вы хотите взять кредит?
    (Я) – Нет
    (С) – Можно узнать почему?
    (Я) – Боги запретили мне делать это.
    (С) – (пауза....) Простите, что?
    (Я) – Боги запретили мне брать кредиты.
    (С) – А может всё-таки…
    (Я) – (возмущённо) Вы хотите поспорить с Богами?!!!
    (С) – Ээээ… нет… До свидания…

    Часть 5. Трюки разработчика


    При разработке приложения столкнулся с кучей интересных моментов. Например, если вы хотите создать ListView, внутри которого будут не просто данные, а еще и управляющие элементы (чекбоксы, редактируемые поля) вы можете столкнуться с тем, что информация неверно отображается, или передаётся в родительскую активность.

    Например, в моём случае это был ListView и его адаптер, заполняемый при внесении показаний.


    Диалог для ввода данных

    Всё было нормально для обычных, однотарифных счётчиков, но для многотарифных началась ерунда. Вот так я победил это. Заводим адаптер (amountList)

    ListView lvAmounts = (ListView)mView.findViewById(R.id.lv_newAmount_Amount);
    insertAmountAdapter insertAmountAdapter = new insertAmountAdapter(getActivity(), amountList);
    lvAmounts.setAdapter(insertAmountAdapter);
    

    Класс адаптера (также есть класс следящий за введёнными показаниями AmountTextWatcher):

    Класс адаптера
    public class insertAmountAdapter extends BaseAdapter {
    
        Context mContext;
        ArrayList<Amount> amountList;
        LayoutInflater mLayoutInflater;
        EditText etAmount, etTariff;
        TextView tvTariffTitle;
    
    
        public insertAmountAdapter(Context mContext, ArrayList<Amount> amountList) {
            this.mContext = mContext;
            this.amountList = amountList;
            mLayoutInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public int getCount() {
            return amountList.size();
        }
    
        @Override
        public Object getItem(int position) {
            return amountList.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = convertView;
            if(view == null){
                view = mLayoutInflater.inflate(R.layout.item_insertamount, parent, false);
    
                etTariff = (EditText)view.findViewById(R.id.et_amount_tariffInfo);
                etTariff.addTextChangedListener(new AmountTextWatcher(view, etTariff, amountList));
    
                etAmount = (EditText)view.findViewById(R.id.et_amount_Amount);
                etAmount.addTextChangedListener(new AmountTextWatcher(view, etAmount, amountList));
            }
            etAmount.setTag(position);
            etAmount.setText(String.valueOf(amountList.get(position).getAmount()));
            etAmount.setFilters(new InputFilter[]{new DigitalFilter(3)});
    
            tvTariffTitle = (TextView)view.findViewById(R.id.tv_amount_tariffTitle);
            tvTariffTitle.setText(amountList.get(position).getTariffTitle()+", "+amountList.get(position).getUnit());
    
            etTariff.setTag(position);
    
            etTariff.setText(amountList.get(position).getTariffValue());
            etTariff.setFilters(new InputFilter[]{new DigitalFilter(2)});
            return view;
        }
    }
    
    class AmountTextWatcher implements TextWatcher {
    
        private View view;
        private EditText editText;
        private ArrayList<Amount> amountList;
    
        public AmountTextWatcher(View view, EditText editText, ArrayList<Amount> amountList) {
            this.view = view;
            this.editText = editText;
            this.amountList = amountList;
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            if(editText.equals(view.findViewById(R.id.et_amount_Amount))){
                amountList.get(Integer.parseInt(editText.getTag().toString())).setAmount(Double.valueOf(s.toString().isEmpty()?"0":s.toString()));
            } else if(editText.equals(view.findViewById(R.id.et_amount_tariffInfo))){
                amountList.get(Integer.parseInt(editText.getTag().toString())).setTariffValue(s.toString().isEmpty()?"0":s.toString());
            }
            return;
        }
    }
    


    Как видите, отслеживание рабочей строки идёт, через setTag и getTag.

    Также, я захотел сделать инструкцию не просто с текстом, а с иллюстрациями. Для этого я решил использовать html-разметку. Но при работе с ней, есть некоторые нюансы.

    Создаём инструкцию в strings.xml:

    Строковая переменная
    <string name="instructionText" formatted = "false">
            <![CDATA[
            <h3>Управляющие кнопки:</h3>
            <p><img src="add_btn_instruction"> <b>Добавить элемент</b></p>
            <p><img src="open_btn_instruction"> <b>Открыть информацию</b></p>
            <h3>Инструкция:</h3>
            <p>Чтобы добавить новый элемент (квартира, счетчик, показания) - нажмите на кнопку <b>Добавить элемент</b>, и введите необходимую информацию.</p>
            <p>Чтобы увидеть дополнительную информацию (лицевой счет, компания и т.д.) - нажмите на кнопку <b>Открыть информацию</b>.</p>
            <p>Чтобы открыть интересующий вас элемент - нажмите на него, и удерживайте около двух секунд. Затем выберите интересующий вас пункт меню.</p>
            <h3>УПРАВЛЯЮЩЕЕ МЕНЮ:</h3>
            <h6>(значок шестерёнки в правом верхнем углу, на экране со списком квартир)</h6>
            <p><b>Валюта</b> можно поменять денежные единицы.</p>
            <p><b>Инструкция</b> ознакомиться с данной инструкцией, и настроить её показ.</p>
            <p><b>Разрешения</b> настроить разрешенные действия для приложения.</p>
            <p>1)<b>Разрешение на работу с камерой/фонариком</b> - нужно для работы с фонариком.</p>
            <p>2)<b>Разрешение на работу с файлами</b> - нужно для сохранения данных.</p>
            <p><b>Сохранение/загрузка в файл</b>:</p>
            <p>1)<b>Сохранение в XML-файл</b> - сохранит данные в файл <b>MLLDataOut.xml</b>, в папке <b>MeterListLog</b></p>
            <p>2)<b>Загрузка из XML-файла</b> - разместите файл с данными <b>MLLDataIn.xml</b>, сформированными по подобию <b>MLLDataOut.xml</b>, в папке <b>MeterListLog</b>.</p>
            <p><b>Внимание!!! Даное действие уничтожит все данные в программе, и перезапишет данными из файла.</b></p>
            <h3>Пункты меню:</h3>
            <p><b>Открыть</b> - войти в выбранный элемент, на следующий уровень(пример: квартира - счётчики).</p>
            <p><b>Редактировать</b> - изменить данные по выбранному элементу.</p>
            <p><b>Удалить</b> - удалить выбранный элемент.</p>
             ]]>
    </string>
    


    Добавляем картинки, под такими же именами, которые прописаны в инструкции, в папку drawables (у меня это: add_btn_instruction.png и open_btn_instruction.png).

    В требуемом месте создаём строку, TextView и ImageGetter:

    String instructionHTML = getString(R.string.instructionText);
    TextView tvInstruction = (TextView)findViewById(R.id.tv_instruction);
    tvInstruction.setText(Html.fromHtml(instructionHTML, htmlImageGetter, null));
    Html.ImageGetter htmlImageGetter = new Html.ImageGetter() {
            public Drawable getDrawable(String source) {
                int resId = getResources().getIdentifier(source, "drawable", getPackageName());
                Drawable ret = InstructionActivity.this.getResources().getDrawable(resId);
                ret.setBounds(0, 0, ret.getIntrinsicWidth(), ret.getIntrinsicHeight());
                return ret;
            }
        };
    

    Диалог со спамером - Время спать, и все в кровать
    (С) – Это квартира или фирма?!
    (Я) – В чем вопрос?
    (С) – Мы проводим социологический опрос…
    (Я) – Женщина, вы вообще на часы смотрите? Время уже десять вечера!
    (С) – (праведное возмущение) Ну если вы спать хотите, то выключать телефон надо! (гудки...)

    Часть 6. Реклама и все-все-все.


    Как уже упоминал, изначально приложение писал для себя. И никаких вложений в рекламу не делал. Единственное – это статьи на Пикабу, и косвенная на Хабре. Перевёл на английский, так на всякий случай.

    Монетизации, нет никакой. Приложение бесплатно, и без рекламы. Как говорил уже раньше, в другой статье «Никакой материальной выгоды, кроме морального удовлетворения (и немного, для удовлетворения мании величия), и желания поделиться полезным инструментом с сообществом, автор не получает.»

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

    Вот собственно и вся история написания моего самого первого приложения.

    Диалог со спамером - Немного Булгакова
    (С) – Здравствуйте. Как мне удобно обращаться к вам?
    (Я) – Зови меня, Добрый Человек, Добрый Человек.
    (гудки....)

    Засим позвольте откланяться. Надеюсь кому-то это окажется полезным. Если у кого-то есть замечания или подсказки, с большим удовольствием их выслушаю.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 66
    • 0
      Не сочтите за каприз, но есть шанс увидеть версию с пофиксенными багами и фонариком, как в новой, но дизайном, как в старой? Очень уж душевно смотрится.
      • 0
        Спасибо. :)
        Есть мысль на будущее — выбирать различное оформление. С этим экспериментировал в своём другом приложении «Таймер трудового человека».
        Но на очень далёкое будущее.
    • +1
      Не в обиду будь сказано, но именно функции передачи данных и контроля за поверочным интервалом вполне себе реализованы в приложении Госуслуги Москвы. Не скажу за другие регионы, но в столице оно работает (иногда коряво, но в целом устраивает).

      Ваше приложение хорошо дополнительными плюшками, которых нет в ДИТовской поделке.
      • 0
        Не, не в обиду.
        Изначально, как я написал — прототип представлял из себя записную книжку, с удобным образом организованным редактором. Потом я добавил к нему различных плюшек.
        А уж если взял старт, то плюшки еще буду добавлять. Планов — громадьё. И напоминалка, и различные стили оформления, и еще куча дополнений.
      • 0
        Классная программа, спасибо!
        Еще бы синхронизацию с облаком и было бы совсем шикарно )))
        • 0
          Спасибо, за отзыв.
          Облако — в планах на будущее.
        • 0
          Программа и статья очень понравились. Спасибо. Думаю, в качестве плюшки, а может быть нового приложения, вам надо добавить Диалоги со спамерами. :)
          • 0
            Спасибо и вам за отзыв.
            Есть еще несколько диалогов.
            Если интересно, можете несколько моих историй посмотреть на Пикабу
          • 0
            Спасибо очень полезная программа!
            Правда обнаружил одну багу: ввёл самые первые показания со счётчиков, и система мне сразу показала огромный расход. Хотелось бы отметить первоначальные показания как начало отсчёта, и соответственно нулевым расходом.
            • 0
              Спасибо и вам.
              Да, есть такое дело. В следующей версии добавлю возможность ввести первоначальные данные.
            • 0
              Скрытый текст
                      if(view == null){
                          view = mLayoutInflater.inflate(R.layout.item_insertamount, parent, false);
              
                          etTariff = (EditText)view.findViewById(R.id.et_amount_tariffInfo);
                          etTariff.addTextChangedListener(new AmountTextWatcher(view, etTariff, amountList));
              
                          etAmount = (EditText)view.findViewById(R.id.et_amount_Amount);
                          etAmount.addTextChangedListener(new AmountTextWatcher(view, etAmount, amountList));
                      }
                      etAmount.setTag(position);
                      etAmount.setText(String.valueOf(amountList.get(position).getAmount()));
                      etAmount.setFilters(new InputFilter[]{new DigitalFilter(3)});
              

              Извиняюсь, но здесь у Вас явно логическая ошибка (которая могла и привести к тем волшебным багам, которые вы описываете).
              Строки
                          etTariff = (EditText)view.findViewById(R.id.et_amount_tariffInfo);
                          etAmount = (EditText)view.findViewById(R.id.et_amount_Amount);
              

              Явно надо вынести из условия, иначе при скролле вы рискуете работать не с тем, чем думаете. А ещё лучше перейте на концепцию Holder и/или на RecyclerView вместо ListView.
              • 0
                Костыль с тегом тоже выглядит как совсем костыль — проще передать позицию в Watcher.
                Хотя сама идея сохранять как только пользователь что-то ввёл тоже не очень правильная — старая добрая кнопка OK тут уместнее.
                • 0
                  Уточните пожалуйста. вы имеете в виду вынести за if?
                  На RV потихоньку перехожу. Штука удобная.
                  • 0
                    То, что поиск по id должен быть всегда — вне зависимости от того, view == null или нет.
                    Логика работы адаптера — «дай мне вьюху для элемента номер n, у меня тут вот осталась вьюха от элемента номер x, может понадобится тебе (а может и не осталась)».

                    Адаптер должен создать вьюху при необходимости (если это самое начало работы приложения, когда старых вьюх ещё нет) и заполнить её новыми данными. У Вас же поиск дочерних вьюх происходит только в том случае, когда нет старой вьюхи, и если она всё-таки придёт — Вы будете работать с вьюхами от другого элемента просто потому, что ссылки на них остались в адаптере. Лучше вообще убрать поля дочерних вьюх в адаптере и оставить только локальные переменные в методе:
                            if(view == null) { // если не осталось старой вьюхи ...
                                // ... создадим новую
                                view = mLayoutInflater.inflate(R.layout.item_insertamount, parent, false);
                            }
                            // обновляем все данные вне зависимости от того, была у нас там вьюха или нет
                            EditText etAmount = (EditText)view.findViewById(R.id.et_amount_Amount);
                            etAmount.setText(String.valueOf(amountList.get(position).getAmount()));
                            ...
                    
              • 0
                Спасибо за статью и за программу!

                P.S. Особенно порадовал первый диалог со спамером, в котором сочетаются:

                У вас заканчивается срок службы!
                Ну тогда вам пришлют письменное извещение!!!

                и

                Говорите адрес!
                • 0
                  И вам спасибо, за хорошие слова.

                  А эти спамеры, вообще какие-то странные. Я когда звонил в одну контору, из здания где вода была только в аквариуме, мне с ходу выпалили, что определили адрес по телефону, и нужно менять счётчики незамедлительно.
                • 0
                  Предлагаю убрать точку в названии на Google Play, странно смотрится.
                • +3
                  Понравились ваши «диалоги со спамерами».
                  Навеяло
                  </В университете начинается лекция по психологии. Удобно устроившись за кафедрой, профессор:
                  — Сегодня, товарищи студенты, мы будем с вами изучать три сходные стадии психики человека: удивление, раздражение и гнев. Рассмотрим на конкретном примере…
                  Достав из портфеля телефон, профессор набирает первый попавшийся номер.
                  — Здравствуйте, а Васю можно?
                  — Знаете, здесь такой не живет…
                  — Вот, — улыбаясь, говорит профессор, — это всего лишь легкое удивление. Смотрите дальше.
                  Набирает номер снова.
                  — Здравствуйте, а Вася не подошел?
                  — Сказал же, нет тут таких…
                  Потирая руки, профессор заговорщицки подмигивает аудитории.
                  — Клюнул. Ну, а теперь…
                  Третий раз набирает номер.
                  — Так Васи нет?
                  — Да пошел ты…
                  — Что ж, товарищи, надеюсь, пример вам понятен. Приступим к теоретической части…
                  С первой парты встает молодой человек.
                  — Простите, профессор, но вы забыли четвертую стадию.
                  — Это какую же?
                  — Стадию полного офигения.
                  Подойдя к кафедре, молодой человек набирает номер.
                  — Добрый день. Это Вася. Мне никто не звонил?>
                  • 0
                    Спасибо. )
                    Поначалу спамеры бесили. Ругался с ними, требовал убрать данные из их списка. А потом просто начал прикалываться над ними.
                    Кстати интересная статистика — после подобного диалога, спамеры перестают названивать.
                    • 0
                      А я просил перезвонить вечером, после девяти. После этого, не то что конкретный спаммер, вообще все спаммеры звонить перестали.
                      • 0
                        У меня маленькие дети, и на звонки после девяти я реагирую нецензурно )
                  • 0
                    Программа пригодится, спасибо. Если одна из целей — занять руки и мозг, то вопрос отпадает. В противном случае не проще было бы вести учет и статистику например в Google Tables? :)
                    • 0
                      Спасибо за отзыв.
                      Хотелось своего, удобно организованного. Плюс всякие маленькие добавления (типа фонарика при вводе данных, или просмотра расходов за некоторый период), которые облегчают жизнь.
                    • 0
                      Класс адаптера вряд ли буду копировать, но ответы спамерам-точно:)
                    • 0
                      Поддерживается ли несколько счетчиков холодной/горячей воды в одной квартире? (например, в кухне и в ванной отдельные горячие стояки, и, соответственно, установлено два счетчика — каждый со своими показаниями)
                      • 0
                        Да, конечно.
                        По квартире потом еще выдастся сумма.
                        • 0
                          А несколько квартир?
                          • 0
                            Тоже есть.
                            В общем списке получите еще и сумму по всем квартирам.
                      • 0
                        Тема актуальная, спаммеры конкретно задолбали звонить на городской телефон, вопрос кто им сливает базы и как закон о персональных данных они исполняют с 1июля.

                        По поводу передачи показаний: Когда нам делали кап.ремонт поставили счетчики от которых идут провода в какуюто коробочку(не разбирал) для дистанционного снятия показаний. На коробочке написано POSITIONER и наклейка Геркон 3.0(М). На вопрос когда они включат эту систему, было сказано что если у ДЭЗ есть оборудование для считывания — то будет работать, прошло 7 лет и все по прежнему в ручном режиме. На лестничной площадке сделаны тоже какието блоки, по-моему это связано. По идее както можно считывать эти данные в Вашу программу.

                        Спонсорами этого приложения вполне могут стать водоспаммеры:) А вообще есть в Москве нормальная контора «поверяющая» мне счетчики несколько лет, все действо занимает 5 мин., 80% времени на оформление документов, стоит 550 руб. Понятно что эта поверка сплошная профанация.
                        • 0
                          Мне сказали, что опломбировка счётчика вообще бесплатна.
                          Вот, что мне писали люди:
                          «Все просто, есть ФЗ 416 где чёрным по белому указано что опломбировку производит обслуживающая организация и она должна сделать это бесплатно „
                          и
                          “Ну, на самом деле пломбирует счетчик та организация которая заключила с вами договор на поставку воды. Допустим существует три шараги: 1. Управляющая Компания которая обслуживает ваш дом. 2 Владелец магистральных сетей по которым вода течет в ваш дом. 3 Водоканал (обычно) который собственно эту воду производит, ну типа всасывает из какой нибудь лужи, очищает и насосами вам втюхивает. Так вот если договор на поставку воды заключен с организацией №3 она и пломбирует и никто другой. Все остальные лесом. Однако могут быть и другие варианты.Читайте договор.А платно или бесплатно это можно у знать только у них. На самом деле эта процедура настолько копеечная что серьёзные конторы не будут даже связываться. Денег не заработаешь а имидж в задницу улетит.На воду ставить счетчик имеете полное право самостоятельно но только с учетом паспортных данных счетчика и отсутствием кривизны рук. Никакой лицензии и сертификации не требуется.Далее мастер из вышеуказанной конторы приходит, проверяет правильность установки, наличие действующей поверки, записывает № в книжечку, иногда копирует паспорт, пломбирует с двух сторон и выписывает Акт установки с первоначальными показаниями.Всё. Погнали платить по счетчику. А, забыл, Счетчик лучше покупать самые дешевые, но наиболее длинным сроком поверки 6 или 8 лет, поскольку ни один водяной, да и бытовые газовые счетчики на моей памяти повторную поверку ни разу не прошли.»
                          • 0
                            Да, все так про пломбировку: пришел дядечка из аффилированной с УК конторы и чуть ли не пассатижами обжал свинцовую пломбу на одном и потом на другом счетчике. А я то размечтался, что пломбиратор принесет с хитрым логотипом. На то что бесплатно он сказал что ничего не знает, я дал ему за непомерный труд требуемое бабло и он отправился счастливый восвояси, а я закрыл эту тему на 4 года.

                            Когда понадобилось поверять счетчик горячей воды я тоже по наивности думал что вот придет инженер с чемоданом в котором суперприбор для проверки тока воды и ноутбуком, дотошно все проверит. А пришел дядя с борсеткой, повключал воду и через 5 минут удалился, оставив документы для ЕИРЦ и красивый с голограммами сертификат на поверку. Еще он сказал что при моем расходе счетчики долго проживут и чтобы я никого не слушал. Счетчики самые простые называются Берегун, им уже 8 лет.

                            Как я понял есть конторы которые заточены на развод клиентов на установку новых счетчиков и те что делают упор на длительную работу по поверке, нужны вторые. Хотя повторюсь — с поверками это полнейшая профанация, и все действующие лица это прекрасно знают.
                            • 0
                              я тоже по наивности думал что вот придет инженер с чемоданом в котором суперприбор для проверки тока воды
                              Вчера такой приходил. Суперприбора с нанотрубками не было. Была сборка из 1/2" труб, с ними- два счетчика и разъем для подключения шланга от смесителя.

                              Заняло 15 минут, включал воду, сравнивал показания на своем приборе с моим счетчиком. Делал несколько замеров, думаю, для минимизации погрешности. Бумаги выдал, ушел. ИМХО свое бабло отработал.
                        • 0
                          Не хотите выложить исходники на github? :)
                        • 0

                          Самый долгий и неприятный момент в нашем цифровом мире это необходимость руками набирать значения счётчиков в приложение/браузер для учёта.
                          Было бы круто на(до)писать функционал распознавания цифр с фоток счётчика и вносить их в приложение. А дальше по команде отправлять для учёта в ЭнергоСбыт и остальным.

                          • 0
                            С распознаванием цифр, есть сложности с тем, что счетчики могут располагаться весьма неудобно для фотографирования.
                            Трудности с отправкой связанаы с тем, что поставщиков много и универсального API для внешних приложений, пока нет (если оно вообще есть).
                            • 0
                              1. Раз глазами его видно, можно и сфоткать. А поскольку счётчики достаточно стандартны, делать распознавать будет проще, чем в общем случае (одинаковые размеры-форма-расположение цифр-шрифт).
                              2. Что-то такое есть: ГИС ЖКХ. Вот пост на Хабре от конторы, которая её пилит.
                        • 0
                          Без обид, но мне как Android Разработчику немного больно смотреть что на дизайн, что на код.

                          Объясню почему:

                          В интерфейсе не пахнет концептом материал дизайна. При том на скринах видно, что диалоги явно от системы версии 5.0+, получается смесь. Отступы, размеры, цвета все смотрится инородно и неопрятно.

                          Не используются Compability классы из support library.
                          вместо Drawable ret = InstructionActivity.this.getResources().getDrawable(resId);
                          следует использовать Drawable ret = ContextCompat.getDrawable(InstructionActivity.this, resId)
                          а так же DrawableCompat. Как — гуглится на раз-два, иначе можно словить много неожиданных ошибок на старых устройствах.

                          Использование ListView не рекомендуется, потому что у него есть проблемы с производительностью на больших списках, плюс он не поддерживается. Recyclerview до сих пор получает фиксы.

                          Это то, что можно сказать не особо смотрев код.

                          • 0
                            Без обид.
                            Все мы учимся. Приложение потихоньку дорабатываю. С LV перехожу на RV.
                            • 0
                              Если помощь будет нужна в консультативном ключе — обращайся
                              telegram: @AzarevArtem
                          • 0
                            Использование ListView не рекомендуется, потому что у него есть проблемы с производительностью на больших списках, плюс он не поддерживается.

                            Извиняюсь, не поддерживается чем? Что-то пропущено?
                            • 0

                              Listview поставляется как компонент, реализованный в системе. Recyclerview поставляется как одна из support library. Последние обновляются раз в месяц в среднем, включают в себя фиксы. А listview в 4.4 на старом устройстве каков был, таков и остался.

                              • 0
                                Но есть и другая сторона медали. Вы точно знаете, что старый-добрый LV, всегда останется таким же. И никаких сюрпризов от него не надо ждать.
                                • 0

                                  Зато вопрос оптимизации тогда лежит на плечах разработчика. А тут уже надо честно себе признаться, достаточно ли у тебя (не конкретно тебя, а просто абстрактного разраба) опыта для выполнения этой задачи.


                                  Вцелом советую посмотреть лекцию на youtube канале Android Developers на тему Recyclerview

                          • 0
                            А есть возможность передать показания счётчиков из приложения на e-mail управляющей компании?
                            • 0
                              Нет, такой возможности нет.
                              Но если нужно, можно прикрутить.
                            • 0
                              Спасибо за статью! Но я сделал вообще шикарно: однажды обнаружил, что уже пару лет показания остаются неизменными (1 кубометр (или в чем меряется, уже даже не помню) — холодная вода и два — горячая в месяц), в итоге шлю на сайт управляющей компании эти данные курлой по крону раз в месяц. Надо бы написать статью по этому поводу, все руки не доходят. Понятно, что мы живем в Самой Лучшей Стране в Мире, поэтому приходится все допиливать самому, и мало того, не удивлюсь, если эту лавочку накроют по причинам, известным только богам. Но пока работает.

                              И хотел бы спросить, пользуясь случаем, вдруг сталкивались: в ящик пришла бумажка, что счетчик нужно менять время от времени, класс точности указан в кружке на табло, чем выше — тем дольше служит, квартира вообще съемная, ни о каких паспортах даже речи быть не может, стоит ли в этой ситуации рыпаться и может ли УК чем-нибудь помочь?
                              • 0
                                квартира вообще съемная, ни о каких паспортах даже речи быть не может
                                Паспорта изначально д.б. Если владелец их прос%ал — плохо. Без паспортов на счетчики даже поверку не сделать.

                                Думаю, тут надо капать на моск квартировладельцу, чтобы решал проблему (искал паспорта/делал поверку или менял счетчики на новые и уже паспорта не терял). Как только у вас закончится поверочный интервал — за воду будете платить по конским тарифам.

                                На бумажки в почтовом ящике, конечно же, не реагировать. Если есть доступ в ЛК — уточнить дату окончания поверочного интервала и тогда уже начинать паниковать.
                                • 0
                                  Ну почему же. Бумажки можно использовать по назначению… Самолётики например делать. )
                                  К нам в ящик клали уже подготовленную квитанцию, с реквизитами. И потом названивали, и обещали в суд пойти если не оплатим продление договора.
                                • 0
                                  Куб холодной, и два горячей?! Поделитесь рецептом экономии. У меня около 8 и 6 выходит. ))
                                  • 0
                                    У меня около 8 и 6 выходит.
                                    А сколько народу живет? Я тут видел рекорд — 9/10 кубов на 4 человек. Но там ПММ стоит и народ в основном душем пользуется, а ванну не принимает.
                                    • 0
                                      Двое взрослых, трое детей.
                                      Хотя, стирки много. Стиралка работает почти каждый день.
                                      • 0
                                        Двое взрослых, трое детей.
                                        Для такого количества 8 и 6 — это вообще идеально. Даже при условии частых стирок. Машины, кстати, не так и много воды потребляют, особенно современные.
                                        • 0
                                          Ну плюс, еще детей часто мыть приходится.
                                    • 0
                                      Хох! Я уже даже засомневался, даже специально проверил, под одно убедился что все шлется нормально. Да, все верно, 1 и 2 куба. Но я один живу, собссно в этом и секрет я думаю)
                                  • 0
                                    (С) – (и даже не поздоровался, хамло) РосКосмосВодоНаноКанал имени Святой Метрологии. Вы должны поменять счетчики на воду! У вас заканчивается срок службы!
                                    (Я) – (в голосе паника) Ой! Что же делать!

                                    Это просто пять! Рассмеялся в голос, представив произнесенную последнюю фразу!)))
                                    • 0
                                      Ага, чтобы не злиться, разыгрываю театр одного актёра. ))
                                      Кстати, столкнулся только с одной настырной девицей, которую было не прошибить моими дурачествами. Остальные понимают, что тут им не рады, и кладут трубку.
                                    • 0
                                      Киллер фича такого типа приложений — возможность определять числа счётчика через обработку фотографии с камеры.

                                      Тем более, если есть данные о предыдущем значении, достаточно просто избавляться от ошибок
                                      • 0
                                        Надо попробовать. Но сейчас в первую очередь — напоминалка, счётчик с накопительным итогом, и переводы. Потом облако.

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.