<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CTAPbIu_MABP&#039;s BLOG &#187; pbank</title>
	<atom:link href="http://mabp.kiev.ua/tag/pbank/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>энтузиазм = 1/опыт © Старый Мавр</description>
	<lastBuildDate>Thu, 26 Jan 2012 10:34:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Пример модальных диалогов для Android</title>
		<link>http://mabp.kiev.ua/2009/09/16/androids-modal-dialogs-example/</link>
		<comments>http://mabp.kiev.ua/2009/09/16/androids-modal-dialogs-example/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 20:56:17 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Modal Dialog]]></category>
		<category><![CDATA[pbank]]></category>
		<category><![CDATA[progress bar]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1121</guid>
		<description><![CDATA[Здравствуйте, дорогие слушатели, сегодня в нашем подкасте вы узнаете о том как создать красивый стандартный индикатор загрузки в своем приложении... Ой, а что, никто не записывает?! Ну, ладно... тогда проговаривайте (можно про себя) текст и думайте что это подкаст. И нет, я не курил, просто настроение хорошее. В общем решил показать массам как выглядит код [...]]]></description>
			<content:encoded><![CDATA[<p>Здравствуйте, дорогие слушатели, сегодня в нашем подкасте вы узнаете о том как создать <s>красивый</s> стандартный индикатор загрузки в своем приложении... Ой, а что, никто не записывает?! Ну, ладно... тогда проговаривайте (можно про себя) текст и думайте что это подкаст. </p>
<span id="more-1121"></span>
<p style="color:white;">И нет, я не курил, просто настроение хорошее.</p>
<p>В общем решил показать массам как выглядит код моего <a href="http://mabp.kiev.ua/2009/09/05/pbank/">e-banking'a</a>. Но что-то меня берёт жадность (нету духа опенсорса) показывать именно код приложения, поэтому я тут по-быстрому сговнял классик, который показывает на экране кнопку при нажатии на которую вылазит алерт с вопросом да/нет, при нажатии на "да" вылазит прогрессбар и потом пропадает а при нажатии на "нет" - ничего не происходит.</p>

<p>Кстати, я уже скачал себе новую SDK 1.6. Так что можете сравнить вид эмуляторов. Ну и раз уж я заговорил о ней то надо сказать что наличие новых методов для работы с CDMA, я не оценил, зато заметил что починили <a href="http://mabp.kiev.ua/2009/09/14/android-first-bugs/">баг c URLConnection</a>, а это не может не радовать :).</p>

<pre><code class="java">
package ua.kiev.mabp;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

import java.util.Random;

public class MyActivity extends Activity {

    // список диалогов
    private static final int CONFIRM = 1;
    private static final int PROGRESS = 2;

    // счетчик вызовов
    private int counter;

    /**
     * Метод вызывается один раз при создании активности
     *
     * @param savedInstanceState предыдущее состояние активности
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Создаем кнопку
        Button button = new Button(this);
        button.setText("click me!");
        // вешаем на неё листенер
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // котрый покажет диалог CONFIRM
                showDialog(CONFIRM);
            }
        });
        // сетим кнопку в основной лайаут
        setContentView(button, new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT));
    }

    /**
     * Метод вызывается один раз на каждый диалог
     *
     * @param id номер диалога онисан в начале класса
     * @return диалог
     */
    @Override
    protected Dialog onCreateDialog(int id) {
        super.onCreateDialog(id);
        switch (id) {
            case CONFIRM:
                // новый лайаут для диалога
                LinearLayout confirmView = new LinearLayout(this);

                // создаем диалог с параметрами и двумя кнопками
                return new AlertDialog.Builder(MyActivity.this)
                        .setIcon(android.R.drawable.ic_dialog_info)
                        .setView(confirmView)
                        .setTitle("Title")
                        .setMessage("Message")
                        // положительная кнопка с листенером который показывает диалог PROGRESS
                        .setPositiveButton("Click me!", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                // запустит новый диалог загрузки
                                showDialog(PROGRESS);
                                // в новом потоке
                                new Thread(new Runnable() {
                                    public void run() {
                                        // запустит фоновую процедуру
                                        wasteMyTime();
                                        // по завершении которой в основном потоке
                                        MyActivity.this.runOnUiThread(new Runnable() {
                                            public void run() {
                                                // диплог загрузки закроется
                                                dismissDialog(PROGRESS);
                                            }
                                        });
                                    }
                                }).start();
                            }
                        })
                        // отрицатильная кнопка просто скроет диалог
                        .setNegativeButton("Cancel", null)
                        .create();
            case PROGRESS:
                // Диалог загрузки
                ProgressDialog dialog = new ProgressDialog(this);
                dialog.setTitle("Please, waite...");
                dialog.setMessage("Dummy message about loading...");
                // без процентов
                dialog.setIndeterminate(true);
                // можно закрыть кнопкой телефона
                dialog.setCancelable(true);
                return dialog;
            default:
                return null;
        }
    }

    /**
     * Метод вызывается каждый раз перед появлением диалога
     *
     * @param id     номер появляющегося диалога
     * @param dialog сам диалог
     */
    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        super.onPrepareDialog(id, dialog);
        switch (id) {
            case CONFIRM:
                ((AlertDialog) dialog).setMessage("Этот диалог был вызван " + (++counter) + " раз");
                break;
            default:
                break;
        }
    }

    /**
     * Метод просто тратит время
     */
    public static void wasteMyTime() {
        Random random = new Random();
        for (int i = 0; i &lt; 10000; i++) {
            random.nextGaussian();
        }
    }
}

</code></pre>

<p>Вот так это выглядит в новом красивом но не очень удобном (я уже привык к прошлому) эмуляторе.</p>
<div style="text-align:center"><img src="/content/img/pbank/dialog.jpg" alt="modal dialog example"/></div>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/09/16/androids-modal-dialogs-example/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Android: первые грабли</title>
		<link>http://mabp.kiev.ua/2009/09/14/android-first-bugs/</link>
		<comments>http://mabp.kiev.ua/2009/09/14/android-first-bugs/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 17:24:59 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[pbank]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1119</guid>
		<description><![CDATA[На русском очень мало документации по андроиду поэтому я немного попишу на эту тему. Как вы уже знаете взялся я настругать на коленке e-banking. Первых два дня дико тупил и читал доки. На самом деле все интуитивно просто как в Убунте ;) Но как и везде есть грабли. Об одних я и хочу тут написать. [...]]]></description>
			<content:encoded><![CDATA[<p>На русском очень мало документации по андроиду поэтому я немного попишу на эту тему.</p>

<p>Как вы уже знаете взялся я настругать на коленке <a href="http://mabp.kiev.ua/2009/09/05/pbank/">e-banking</a>. Первых два дня дико тупил и читал доки. На самом деле все интуитивно просто как в Убунте ;) Но как и везде есть грабли. Об одних я и хочу тут написать.</p>
<span id="more-1119"></span>
<p>Для работы приложению надо по HTTPS связываться с сервером и получать xml. Для соединения я выбрал самый простой способ и использовал объект URLConnection</p>

<pre><code class="java">
URL url = new URL("https://liqpay.com/?do=api_xml");
URLConnection conn = url.openConnection();
</code></pre>

<p>Все было хорошо пока я не начал отлаживать второй проход по сценарию, то есть первый раз перевели денег и снова возвращаемся на исходную страницу для второго перевода. Тут началв вылазить ошибка "Приложение выполнило недопустимую операцию и будет закрыто", или как-то так.</p>

<p>Я сначала подумал ошибка где-то в потоках, потому что я первый раз использовал потоки вообще. Стал смотреть вроде с потоками все ок. Посмотрел может я не закрыл прошлое соединение, оно закрывается после закрытия потока. В результате добрался до того что поток изначально получается закрытым. И никакого null-pointer или другого исключения не вываливается.</p>

<p>Долго ли коротко ли гуглил и нашел что не у одного меня такая проблема. Воркэраунд был простой, открывается каждое нечетное соединение то есть 1,3,5... Но это естественно не дело. Стал искать как делают реальные пацаны. а реальные пацаны оказывается использую класс DefaultHttpClient с которым все ок. Вот сейчас проделал пару тестов все действительно нормально пашет, собираюсь внести изменения в проект. А пока побалую вас рабочим кодом, мож кому пригодится.</p>

<pre><code class="java">
String xmlContentToSend = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;&lt;request&gt;&lt;/request&gt;";

DefaultHttpClient httpClient = new DefaultHttpClient();
// some weird header
// http://doookstechstuff.blogspot.com/2009/06/switching-off-expect-100-continue.html
httpClient.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
// Using POST or    new HttpGet
HttpPost httpPost = new HttpPost("https://liqpay.com/?do=api_xml");
// some headers 
httpPost.addHeader("Accept", "text/xml");
httpPost.addHeader("Content-Type", "application/xml");

try {
    // convert xml to StringEntity
    StringEntity entity = new StringEntity(xmlContentToSend, HTTP.UTF_8);
    entity.setContentType("application/xml");
    httpPost.setEntity(entity);

    // or use NameValuePair 
    /*
    List&lt;NameValuePair&gt; params = new ArrayList&lt;NameValuePair&gt;();
    params.add(new BasicNameValuePair("name", "value"));
    httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
    */

    // execute is a blocking call, it's best to call this code in a thread separate from the ui's
    HttpResponse response = httpClient.execute(httpPost);

    InputStream stream = response.getEntity().getContent();
}
catch (Exception ex) {
    // logging
}
</code></pre>

]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/09/14/android-first-bugs/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PBank: передача денег</title>
		<link>http://mabp.kiev.ua/2009/09/12/pbank-money-sending/</link>
		<comments>http://mabp.kiev.ua/2009/09/12/pbank-money-sending/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 13:34:53 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[pbank]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1117</guid>
		<description><![CDATA[Я еще в четверг обещал выложить свежие скриншоты, но доделал только сегодня. Это было связано с ошибками в API и с какими-то невнятными косяками в Android'e. О первом я уже писал а о втором еще напишу. Итак вот что у меня получилось: Пока писал все это поднял кучу экспириенса, на самом деле все очень просто [...]]]></description>
			<content:encoded><![CDATA[<p>Я еще в четверг обещал выложить свежие скриншоты, но доделал только сегодня. Это было связано с ошибками в <a href="https://liqpay.com/?do=pages&#038;p=api" rel="nofollow external">API</a> и с какими-то невнятными косяками в Android'e. О первом я <a href="http://mabp.kiev.ua/2009/09/11/banks-mistakes/">уже писал</a> а о втором еще напишу. Итак вот что у меня получилось:</p>
<span id="more-1117"></span>
<div style="text-align:center"><img src="/content/img/pbank/send.jpg" alt="отправка денег"></div>
<p>Пока писал все это поднял кучу экспириенса, на самом деле все очень просто и большинство проблем возникает только потому что нету некоторых пакетов из стандартного JDK. Я думаю можно просуммировать на что ушло больше всего времени.</p>
<ul>
<li>Настройка соединения через прокси не увенчалась успехом вообще, так же как и настройка эмулятора. То есть с работы я так и не сделал ни одной транзакции, рисовал только интерфейс. Кто знает как настроить сие чудо, милости прошу в каменты.</li>
<li>С дуру очень много времени ушло на отпечаток SHA1, ну не додумался я что там нужна кодировка 8859_1, ну бывает.</li>
<li>Еще много времени ушло на поиск того как из org.w3c.dom.Document сделать java.lang.String. В Android SDK не включен нужный пакет поэтому в конце концов пришлось писать свой метод.</li>
<li>И сегодня долго искал ответа на вопрос почему же нельзя открыть два https соединения подряд через URLConnection. Второе почему-то не открывается и не бросает эксепшн. А третье снова открывается.</li>
<li>И еще самое главное но еще не тронутое: надо найти как хранить структуры данных, либо сериализировать и хранить в файлах либо в sqlite3 вобщем надо думать.</li>
</ul>
<p>Не думайте что я остановлюсь на достигнутом у меня в планах реализация хранения и просмотра выполненных транзакций, полное переписывание баланса (соответственно полученных с тех пор знаний) и тюнинг тока что написанной отправки денег.</p>

]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/09/12/pbank-money-sending/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ошибки банка</title>
		<link>http://mabp.kiev.ua/2009/09/11/banks-mistakes/</link>
		<comments>http://mabp.kiev.ua/2009/09/11/banks-mistakes/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 22:32:06 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[Голоса в голове]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[pbank]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1115</guid>
		<description><![CDATA[Я обещал рассказать о новой версии своего e-banking, но к сожалению у меня не вышло дописать его сегодня из-за ошибок в API банка. Ну то есть если б я меньше ебался с ошибками то уже закончил, конечно. Так что я вам хочу рассказать. Банк ошибок не признает. Потому что ночью (полвторого) в техподдержке банка сидит [...]]]></description>
			<content:encoded><![CDATA[<p>Я обещал рассказать о новой версии своего <a href="http://mabp.kiev.ua/2009/09/05/pbank/">e-banking</a>, но к сожалению у меня не вышло дописать его сегодня из-за ошибок в API банка. Ну то есть если б я меньше ебался с ошибками то уже  закончил, конечно. Так что я вам хочу рассказать. Банк ошибок не признает.</p>
<span id="more-1115"></span>
<p>Потому что ночью (полвторого) в техподдержке банка сидит тупая тренированная обезьянка Леночка. Леночка знает только одно: все надо передать техническим специалистам, причем "все" имеется виду мое имя, мыло и номер телефона. Слушать что я там себе делаю с API в полвторого ей не интересно. Эти мифические технические специалисты должны связаться со мной и я в телефонном режиме надиктую им пачки xml'ек которыми я обмениваюсь с сервером. Я уже раз оставлял им телефон - до сих пор звонят. Ну что, я завтра днем еще раз попробую пока все на работе будут.</p>

<p><b>UPD</b> Исторя с банком приобрела свое продолжение в лице тренированной обезьянки Кати. Которая с трудом нашла кнопку которая соединит меня с liqpaydev. Вполне нормальный и адекватный товарисч, который тоже не признал ошибок в апи но хотя бы смог объяснить толком.</p>

<p>Думаю не честно было бы говорить что есть ошибки и не сказать какие. Сначала мне в ответ на запрос о передаче денег приходила ошибка api_version incorrect. Оказывается что в профиле нужно включить API для того чтобы с ним работать. На вопрос о том почему же тогда можно проверить баланс мне ответили что это фича. Кстати в этой ошибке отсутствует подчерк. Мешает достаточно сильно так как его нельзя сделать ключом, но "так задумано" (с). В общем банк ошибок не признает, все так и задумано, ебитесь все конем!</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/09/11/banks-mistakes/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>PBank</title>
		<link>http://mabp.kiev.ua/2009/09/05/pbank/</link>
		<comments>http://mabp.kiev.ua/2009/09/05/pbank/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 19:00:09 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[hate]]></category>
		<category><![CDATA[pbank]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1108</guid>
		<description><![CDATA[Несмотря на то что я люто-бешено ненавижу Приват Банк за их бюрократию и прочую хуйню многократно описаную на просторах интернета, я тут взялся написать одно приложение для них. Ну не дял них а для себя, ну не для себя а на продажу... но взялся написать и пишу. Смысл вот в чем: на прошлой недели появилось [...]]]></description>
			<content:encoded><![CDATA[<p>Несмотря на то что я люто-бешено ненавижу Приват Банк за их бюрократию и прочую хуйню многократно описаную на просторах <a href="http://google.com" rel="nofollow external">интернета</a>, я тут взялся написать одно приложение для них.</p>
<span id="more-1108"></span>
<p>Ну не дял них а для себя, ну не для себя а на продажу... но взялся написать и пишу. Смысл вот в чем: на прошлой недели появилось вот такое забавное <a href="https://liqpay.com/">API</a>. По сути обычный клент-банк, ничего особенного. Единственное что появилось оно только на прошлой недели! Этим я и решил воспользоватся. У них есть родное приложение для iPhone, а я решил написать приложение для Android'a. С одной стороны реальный опыт писания под телефон с другой может даже что-то заработаю. В результате двух дней работы моё приложение умеет показывать главную менюшку, имеет настройку мерчанта, и может показывать баланс. Пока все но это еще даже на альфу не претендует.</p>
<p>Вот пара скриншотов для затравки.</p>
<div style="text-align:center"><img src="/content/img/pbank/main.jpg" alt="Главное меню" /></div>
<div style="text-align:center"><img src="/content/img/pbank/preference.jpg" alt="Настройки мерчанта" /></div>
<div style="text-align:center"><img src="/content/img/pbank/balance.jpg" alt="Баланс" /></div>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/09/05/pbank/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

