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

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

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



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

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


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

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

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

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

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

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


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

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

Хорошо, заведу-ка я таблицу в 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. Реклама и все-все-все.


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

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

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

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

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

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

Комментарии (66)


  1. technomancer
    03.07.2017 16:08

    Не сочтите за каприз, но есть шанс увидеть версию с пофиксенными багами и фонариком, как в новой, но дизайном, как в старой? Очень уж душевно смотрится.


    1. Snakecatcher
      03.07.2017 16:09

      Спасибо. :)
      Есть мысль на будущее — выбирать различное оформление. С этим экспериментировал в своём другом приложении «Таймер трудового человека».
      Но на очень далёкое будущее.


      1. ScarletFlash
        04.07.2017 03:22

        По поводу оформления – у Google есть классный сайт на эту тему:
        https://material.io/guidelines/style/color.html


        1. Snakecatcher
          04.07.2017 07:21

          Ага, знаю такой.
          Спасибо.


  1. Markscheider
    03.07.2017 16:23
    +1

    Не в обиду будь сказано, но именно функции передачи данных и контроля за поверочным интервалом вполне себе реализованы в приложении Госуслуги Москвы. Не скажу за другие регионы, но в столице оно работает (иногда коряво, но в целом устраивает).

    Ваше приложение хорошо дополнительными плюшками, которых нет в ДИТовской поделке.


    1. Snakecatcher
      03.07.2017 16:33

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


  1. Angel2S2
    03.07.2017 18:36

    Классная программа, спасибо!
    Еще бы синхронизацию с облаком и было бы совсем шикарно )))


    1. Snakecatcher
      03.07.2017 21:13

      Спасибо, за отзыв.
      Облако — в планах на будущее.


  1. Workanator
    03.07.2017 20:22

    Программа и статья очень понравились. Спасибо. Думаю, в качестве плюшки, а может быть нового приложения, вам надо добавить Диалоги со спамерами. :)


    1. Snakecatcher
      03.07.2017 21:15

      Спасибо и вам за отзыв.
      Есть еще несколько диалогов.
      Если интересно, можете несколько моих историй посмотреть на Пикабу


  1. stepmex
    03.07.2017 21:15

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


    1. Snakecatcher
      03.07.2017 21:16

      Спасибо и вам.
      Да, есть такое дело. В следующей версии добавлю возможность ввести первоначальные данные.


  1. Prototik
    03.07.2017 23:13

    Скрытый текст
            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)});
    


    1. Prototik
      03.07.2017 23:20

      Костыль с тегом тоже выглядит как совсем костыль — проще передать позицию в Watcher.
      Хотя сама идея сохранять как только пользователь что-то ввёл тоже не очень правильная — старая добрая кнопка OK тут уместнее.


    1. Snakecatcher
      03.07.2017 23:28

      Уточните пожалуйста. вы имеете в виду вынести за if?
      На RV потихоньку перехожу. Штука удобная.


      1. Prototik
        03.07.2017 23:37

        То, что поиск по 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()));
                ...
        


        1. Snakecatcher
          03.07.2017 23:43

          Спасибо, за помощь.


  1. rvncerr
    03.07.2017 23:32

    Спасибо за статью и за программу!

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

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

    и

    Говорите адрес!


    1. Snakecatcher
      03.07.2017 23:45

      И вам спасибо, за хорошие слова.

      А эти спамеры, вообще какие-то странные. Я когда звонил в одну контору, из здания где вода была только в аквариуме, мне с ходу выпалили, что определили адрес по телефону, и нужно менять счётчики незамедлительно.


  1. slogic
    04.07.2017 07:22

    Предлагаю убрать точку в названии на Google Play, странно смотрится.


    1. Snakecatcher
      04.07.2017 07:23

      Убрал. Спасибо за подсказку.


  1. seri0shka
    04.07.2017 07:23
    +3

    Понравились ваши «диалоги со спамерами».

    Навеяло
    </В университете начинается лекция по психологии. Удобно устроившись за кафедрой, профессор:
    — Сегодня, товарищи студенты, мы будем с вами изучать три сходные стадии психики человека: удивление, раздражение и гнев. Рассмотрим на конкретном примере…
    Достав из портфеля телефон, профессор набирает первый попавшийся номер.
    — Здравствуйте, а Васю можно?
    — Знаете, здесь такой не живет…
    — Вот, — улыбаясь, говорит профессор, — это всего лишь легкое удивление. Смотрите дальше.
    Набирает номер снова.
    — Здравствуйте, а Вася не подошел?
    — Сказал же, нет тут таких…
    Потирая руки, профессор заговорщицки подмигивает аудитории.
    — Клюнул. Ну, а теперь…
    Третий раз набирает номер.
    — Так Васи нет?
    — Да пошел ты…
    — Что ж, товарищи, надеюсь, пример вам понятен. Приступим к теоретической части…
    С первой парты встает молодой человек.
    — Простите, профессор, но вы забыли четвертую стадию.
    — Это какую же?
    — Стадию полного офигения.
    Подойдя к кафедре, молодой человек набирает номер.
    — Добрый день. Это Вася. Мне никто не звонил?>


    1. Snakecatcher
      04.07.2017 07:25

      Спасибо. )
      Поначалу спамеры бесили. Ругался с ними, требовал убрать данные из их списка. А потом просто начал прикалываться над ними.
      Кстати интересная статистика — после подобного диалога, спамеры перестают названивать.


      1. ozonar
        05.07.2017 14:42

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


        1. Snakecatcher
          05.07.2017 18:24

          У меня маленькие дети, и на звонки после девяти я реагирую нецензурно )


  1. andykov
    04.07.2017 07:25

    Программа пригодится, спасибо. Если одна из целей — занять руки и мозг, то вопрос отпадает. В противном случае не проще было бы вести учет и статистику например в Google Tables? :)


    1. Snakecatcher
      04.07.2017 07:27

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


  1. mdonskoi
    04.07.2017 08:40

    Класс адаптера вряд ли буду копировать, но ответы спамерам-точно:)


    1. Snakecatcher
      04.07.2017 09:23

      :)


  1. kisaa
    04.07.2017 09:22

    Поддерживается ли несколько счетчиков холодной/горячей воды в одной квартире? (например, в кухне и в ванной отдельные горячие стояки, и, соответственно, установлено два счетчика — каждый со своими показаниями)


    1. Snakecatcher
      04.07.2017 09:22

      Да, конечно.
      По квартире потом еще выдастся сумма.


      1. ozonar
        05.07.2017 14:43

        А несколько квартир?


        1. Snakecatcher
          05.07.2017 18:23

          Тоже есть.
          В общем списке получите еще и сумму по всем квартирам.


  1. AslanKurbanov
    04.07.2017 09:39

    Тема актуальная, спаммеры конкретно задолбали звонить на городской телефон, вопрос кто им сливает базы и как закон о персональных данных они исполняют с 1июля.

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

    Спонсорами этого приложения вполне могут стать водоспаммеры:) А вообще есть в Москве нормальная контора «поверяющая» мне счетчики несколько лет, все действо занимает 5 мин., 80% времени на оформление документов, стоит 550 руб. Понятно что эта поверка сплошная профанация.


    1. Snakecatcher
      04.07.2017 10:06

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


      1. AslanKurbanov
        04.07.2017 23:10

        Да, все так про пломбировку: пришел дядечка из аффилированной с УК конторы и чуть ли не пассатижами обжал свинцовую пломбу на одном и потом на другом счетчике. А я то размечтался, что пломбиратор принесет с хитрым логотипом. На то что бесплатно он сказал что ничего не знает, я дал ему за непомерный труд требуемое бабло и он отправился счастливый восвояси, а я закрыл эту тему на 4 года.

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

        Как я понял есть конторы которые заточены на развод клиентов на установку новых счетчиков и те что делают упор на длительную работу по поверке, нужны вторые. Хотя повторюсь — с поверками это полнейшая профанация, и все действующие лица это прекрасно знают.


        1. Markscheider
          05.07.2017 09:39

          я тоже по наивности думал что вот придет инженер с чемоданом в котором суперприбор для проверки тока воды
          Вчера такой приходил. Суперприбора с нанотрубками не было. Была сборка из 1/2" труб, с ними- два счетчика и разъем для подключения шланга от смесителя.

          Заняло 15 минут, включал воду, сравнивал показания на своем приборе с моим счетчиком. Делал несколько замеров, думаю, для минимизации погрешности. Бумаги выдал, ушел. ИМХО свое бабло отработал.


  1. XardasNetpoint
    04.07.2017 09:59

    Не хотите выложить исходники на github? :)


    1. Snakecatcher
      04.07.2017 10:00

      Не. Стесняюсь. :)


  1. redmanmale
    04.07.2017 11:32

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


    1. Snakecatcher
      04.07.2017 11:49

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


      1. redmanmale
        04.07.2017 12:36

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


        1. Snakecatcher
          04.07.2017 12:56

          Спасибо, посмотрю.


  1. fgtmenow
    04.07.2017 11:46

    Без обид, но мне как Android Разработчику немного больно смотреть что на дизайн, что на код.

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

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

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

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

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


    1. Snakecatcher
      04.07.2017 11:47

      Без обид.
      Все мы учимся. Приложение потихоньку дорабатываю. С LV перехожу на RV.


      1. fgtmenow
        04.07.2017 12:28

        Если помощь будет нужна в консультативном ключе — обращайся
        telegram: @AzarevArtem


        1. Snakecatcher
          04.07.2017 12:33

          Спасибо.


    1. Acuna
      05.07.2017 01:49

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

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


      1. fgtmenow
        05.07.2017 09:01

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


        1. Snakecatcher
          05.07.2017 10:20

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


          1. fgtmenow
            05.07.2017 10:25

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


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


  1. IvanVakhrushev
    04.07.2017 14:50

    А есть возможность передать показания счётчиков из приложения на e-mail управляющей компании?


    1. Snakecatcher
      04.07.2017 14:51

      Нет, такой возможности нет.
      Но если нужно, можно прикрутить.


  1. Acuna
    05.07.2017 01:47

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

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


    1. Markscheider
      05.07.2017 09:43

      квартира вообще съемная, ни о каких паспортах даже речи быть не может
      Паспорта изначально д.б. Если владелец их прос%ал — плохо. Без паспортов на счетчики даже поверку не сделать.

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

      На бумажки в почтовом ящике, конечно же, не реагировать. Если есть доступ в ЛК — уточнить дату окончания поверочного интервала и тогда уже начинать паниковать.


      1. Snakecatcher
        05.07.2017 10:19

        Ну почему же. Бумажки можно использовать по назначению… Самолётики например делать. )
        К нам в ящик клали уже подготовленную квитанцию, с реквизитами. И потом названивали, и обещали в суд пойти если не оплатим продление договора.


    1. Snakecatcher
      05.07.2017 10:21

      Куб холодной, и два горячей?! Поделитесь рецептом экономии. У меня около 8 и 6 выходит. ))


      1. Markscheider
        05.07.2017 10:36

        У меня около 8 и 6 выходит.
        А сколько народу живет? Я тут видел рекорд — 9/10 кубов на 4 человек. Но там ПММ стоит и народ в основном душем пользуется, а ванну не принимает.


        1. Snakecatcher
          05.07.2017 14:18

          Двое взрослых, трое детей.
          Хотя, стирки много. Стиралка работает почти каждый день.


          1. Markscheider
            05.07.2017 14:20

            Двое взрослых, трое детей.
            Для такого количества 8 и 6 — это вообще идеально. Даже при условии частых стирок. Машины, кстати, не так и много воды потребляют, особенно современные.


            1. Snakecatcher
              05.07.2017 18:25

              Ну плюс, еще детей часто мыть приходится.


      1. Acuna
        06.07.2017 22:37

        Хох! Я уже даже засомневался, даже специально проверил, под одно убедился что все шлется нормально. Да, все верно, 1 и 2 куба. Но я один живу, собссно в этом и секрет я думаю)


  1. Acuna
    05.07.2017 01:51

    (С) – (и даже не поздоровался, хамло) РосКосмосВодоНаноКанал имени Святой Метрологии. Вы должны поменять счетчики на воду! У вас заканчивается срок службы!
    (Я) – (в голосе паника) Ой! Что же делать!

    Это просто пять! Рассмеялся в голос, представив произнесенную последнюю фразу!)))


    1. Snakecatcher
      05.07.2017 10:17

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


  1. ozonar
    05.07.2017 14:46

    Киллер фича такого типа приложений — возможность определять числа счётчика через обработку фотографии с камеры.

    Тем более, если есть данные о предыдущем значении, достаточно просто избавляться от ошибок


    1. Snakecatcher
      05.07.2017 18:25

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