Доступна запись вебкаста “Palm WebOS: Application Basics“, который проходил 9 сентября 2009г. Скачать можно здесь.

Описание

This session begins with an overview of the basic webOS application structure and a demo of the core SDK developer tools, and includes detail presentations on the application launch lifecycle, and Mojo controllers and methods. We’ll create the initial version of News application with a single story view which will use many of the elements described in this segment including appinfo.json, sources.json, basic scene styles, stage and scene controllers, pushScene and swapScene methods among others.

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

Leave a Reply

Your email address will not be published. Required fields are marked *

Т.

Таможня дает Zlo. История вторая о покупке дешевых ноутбуков в Китае

Вступление

Умные люди учатся на чужих ошибках, глупые – на своих, есть люди, которые ничему не учатся (таких мало). Но бывают ситуации, когда для того чтобы сделать что-то умное, приходится совершать довольно странные, и порой нелогичные поступки. И, в общем, о чем это я. Какое-то время назад я уже писал о покупке дешевых ноутбуков в Китае и о том, чем это все обернулось для меня. В этот раз я расскажу тоже о покупке ноутбуков, но уже немного другого класса и у другого производителя и о том, «как это было». Китайцы, они разные Как я уже говорил ранее, прежде чем работать с китайцами, надо бы хорошо подумать, т.к. без личного вашего присутствия при отправке, сам могут подсунуть все что угодно и вообще шанс получить то, что вы покупали, довольно невысок. Но китайцы, …. они разные. С кем-то можно делать бизнес, а с кем-то нет. Проверить это можно только опытным путем. И вот такой опытный путь выбрал я в этот раз. Надо быть авантюристом (или оптимистом) до мозга костей чтобы заказать большую партию оборудования в Китае у незнакомого производителя и не будучи уверенным, что заказанное вами оборудование будет именно того качества, которого вы ожидаете. Так, при покупке партии ноутбуков лучше для начала (если вы все-таки решились на это) заказать образец (sample). Вот и я, блуждая по бизнес-порталу Alibaba.com, набрел на довольно интересный экземпляр субноутбука, который мне показался интересным с коммерческой точки зрения и как обычному пользователю. Выглядело все это добро как-то так:

  • Процессор: Mobile Diamondville-SC(Intel Atom N270 1.6GHz)
  • Чипсет: Intel 945GSE+82801GBM(ICH7)
  • Монитор: 10″TFT LCD panel 1024*600 &1024*576 Backlight unit:LED
  • HDD: 2.5″, 9.5mm SATA 5400/7200rpm 160GB
  • Wi-Fi: Intel WLAN abg 802.11 b/g
  • Сеть: 10/100Mbps Ethernet
  • 3G: (Опционально)
  • Web-камера: 1.30M Pixels (Опционально)
  • Порты
    • 1 x Mic in
    • 1 x Headphone out
    • 1 x RJ-11
    • 1 x RJ-45
    • 1 x Mini USB 2.0 Port
    • 3 x USB 2.0 Ports
    • 1 x DC-in
    • 1 x VGA (15Pin)

Ну, вот как-то так. И все это добро за… 275 американских зеленых президентов. Для наших широт это вполне-таки неплохая цена. Даже очень, учитывая встроенный 3G, который, как видно из спецификации, доставляется по желанию. 3G-модуль удорожает зверушку на 7 президентов, что, в общем-то, сносно. Когда писал письмо производителю, особо на ответ не рассчитывал, помня свое общение с производителями нетбуков NPX-9000, да и вообще далеко не все производители будут с вами разговаривать, если вы не собираетесь заказывать стопицод экземпляров их товара. На удивление, в этот раз отписали быстро. Буквально на следующий день. Ответы на все последующие письма приходили тоже довольно быстро. Складывалось впечатление что эти граждане действительно хотят работать. Так за неделю я узнал, сколько будет стоить вставить 3G-модуль ($7), сколько будет стоить доставка (стоимость отправки EMS’ом – $100, DHL’ом – 150). Но EMS отказалась от пересылки ноутбука (непонятно почему, хотя в прошлый раз тоже отказалась, но ладно – значит они не хотят денег). Предложили отправку UPS’ом, т.к. у них с ними какой-то контракт и поэтому отправка будет стоить немного дешевле, чем в DHL – $130. Тоже неплохо – двадцать баксов скидка. ОК, договорились о конфигурации и стоимости, я получил инвойс. Общая сумма в инвойсе – $440 (из них $20 – комиссия банка, $130 – стоимость отправки). Теперь нужно было выполнить перевод денег в Китай. Что касается зарубежных переводов, то выбор у нас не особо большой. Я обычно пользуюсь услугами ПриватБанка. Они хоть и очень неправы в плане качества обслуживания, но на безрыбье, как говорится… особо и не повыбираешь. С приватбанком, в этот раз, проблем не было… Очень и очень странно 😉 прямо-таки небывалый случай. Хотя это не значит что цирка не было. Перевод они осуществили быстро (не забыв при этом взять 126 гривен комиссионных, это ~$15.75. Пока общался с сотрудницей банка, услышал от нее, что SWIFT-переводы как бы собираются отменять в пользу Western Union. Бред, вообще полный бред, не представляю каким образом банк будет себя лишать неплохого источника дохода, к тому же SWIFT-переводами пользуется весь мир и Western Union вообще левая компания. В общем, я ей не поверил и, думаю, правильно. В общем, что-то неладное творится в датском королевстве. Но это уже не мои заботы. Деньги ушли, до Китая дошли через 8 дней и, как оказалось не вся сумма. Вместо $440 получилось $420. И тут, как это ни странно, китайцы решили все равно отправить мне ноутбук даже без этих $20, хотя я и предлагал переслать им недостающую сумму, например PayPal’ом. До сих пор не пойму, почему я о PayPal сразу не подумал, а пошел в банк. Это было бы быстрее, я думаю, хотя может в Китае, как и у нас, PayPal не работает на прием, а только на отправку средств. И вот, через три или четыре дня посылка была отправлена. Приблизительно две недели ушло на доставку. На самом деле, многовато, с DHL кажется было быстрее. Когда ждать мне надоело, а трекинг на сайте UPS работает довольно коряво, информация в английской и украинской версии трекинговой системы сайта очень сильно отличается, позвонил в офис UPS самостоятельно. Сказали что посылка через два дня приедет. Через два дня заехал к ним офис и таки-да, посылка пришла, но все самое интересное только должно было начаться, т.к. после прихода посылки ее необходимо растаможить.

Учимся делать финт ушами

Если вдруг вам посчастливилось хоть что-нибудь получать с помощью курьерских фирм в Украине, поздравляю – вы стали участником незабываемого действа, в котором роль главного клоуна принадлежит вам и только вам. Если вы человек впечатлительный или у вас проблемы с нервами – просто откажитесь от этой глупой затеи, пользуйтесь EMS’ом или просите друзей чтобы получили посылку в другой стране вместо вас и переотправили обычной почтой. В случае если роль клоуна вас устраивает, можете пообщаться с таможенниками. Level up вам гарантирован. Первым делом, когда посылка уже пришла, необходимо пройти пройти радиологический контроль и санэпидемстанцию. Для этого нужна ОБЯЗАТЕЛЬНО копия авианакладной, переведенная на русский или украинский язык. Просто перевести мало, надо чтобы на этом переводе стоял штамп организации, уполномоченной делать официальные переводы. Если вам не повезло – за перевод прийдется платить деньги, например в агентстве переводов. В этот раз перевод названия товара мне сделала сотрудница компании UPS и поставила штампик. Этого штампика мне вполне хватило чтобы пройти контроль в санэпидемстанции, за что компании UPS большое человеческое спасибо. Поставить штампик радиологического контроля оказалось сложнее, чем в предыдущие разы. Теперь для прохождения контроля необходимо:

  • Заполнить заявление на прохождение контроля
  • Зарегистрировать это заявление
  • Пойти с ним в бухгалтерию, получить документы на оплату
  • Оплатить 42 гривны (~$5.25) в банке
  • Отнести чеки
  • Получить печать на авианакладной

Наши банки снова на высоте, взяли с меня комиссию 10 гривен ($1.25) Во, чуть не забыл. Как-то странно себя повела компания UPS. Оказалось что для того чтобы доставить посылку из Киева под таможенным контролем в Запорожье, мне нужно заплатить еще 115 гривен ($14.4). Ну, спрашивается, за что? В накладной же английским по белому написано, доставить из Гонконга в Запорожье. Причем здесь Киев? Причем здесь вообще таможенный контроль, если у нас в городе есть региональное отделение таможни? С DHL и с FedEx такого не было поэтому подобные сборы я трактую как желание на@бать клиента. Итого, что у нас получается на данный момент: $440 за ноутбук и доставку + $15.75 комиссия банка + $6.5 радиологический контроль + $14.5 непонятная мзда за доставку под таможенным контролем = $476.75 Много, а было мало – начальная стоимость зверушки $290 Но ладно, индейцы не ищут легких путей. Через 5 дней праздников надо было ехать в отделение таможни проводить таможенный досмотр. К слову хочу сказать, что китайцы по какой-то ведомой только их китайским богам причине указали стоимость посылки в $10. В UPS мне сказали, что при таможенном досмотре эта цена может показаться, мягко говоря, подозрительной, поэтому я попросил перепослать мне инвойс, с ценой, ну, скажем, в $120. Нормальная такая цена, учитывая, что когда я заказывал NPX-9000 в прошлый раз, их себестоимость была $129. Копию инвойса со стоимостью $120 мне прислали по e-mail’у, а в локальный офис UPS она почему-то не дошла – еще один пример невнимательного отношения к документам. В DHL уточнения приходили за 3 дня и с этим проблем не было вообще. Таким образом, получилось что на руках у меня один инвойс, а с посылкой пришел другой, на что таможенный инспектор, конечно же, обратил внимание. Мою копию инвойса на таможне проигнориловали, а из-за того что цена указана не соответствующая действительности, пришлось ехать в отдел тарифов проводить оценку содержимого посылки. А из-за того что в посылке были еще и диски с драйверами, надо пройти еще и отдел проверки носителей информации. Вообще не понимаю, на каком принципе у них все это построено: санэпидемстанция и радиологический контроль проходится без предъявления посылки. Просто пришел с накладной, заплатил бабло и получил штамп. И никого не волнует, что там, в действительности пришло. Относительно честный способ отъема денег у населения. Отдел тарифов делает оценку по текстуальному описанию содержимого посылки, которое напишет таможенный инспектор. Кстати в отделе тарифов мне довелось побывать впервые, т.к. все предыдущие разы за меня этот делал таможенный брокер. Все это можно и нужно делать самостоятельно. Работа брокера стоит довольно дорого, а покататься немного по городу вы можете и сами, нечего свои деньги за зря отдавать. Посылку в отделе тарифов оценили в… 285 американских президентов. И никого не волнует что там написано на вашем инвойсе, никого не волнует что указано на авианакладной. Наша любимая таможня трактует все только в свою пользу. Если вы, например, купили какие-то шмотки на eBay и нидайбох получаете их курьерской фирмой, то например, за те же джинсы, купленные за 30 баксов, вы заплатите пошлину равную 20% от стоимости, которую вам посчитает отдел тарифов + стоимость доставки. Ну, это где-то так вам получится еще +50. Классно? Вот я так же обрадовался, когда мне мою посылочку оценили в 2.5 раза выше, чем заявленная стоимость. Да, в этом месте сэкономить не получилось, я, правда, немного расстроился, ибо, в общем, сумма получалась уже совсем не радужная, но в целом еще не совсем разочаровался в затее. Итак, НДС для моей посылочки составила 571 гривну ($71.4) и еще 13 гривен комиссии пришлось отдать банку ($1.6). И вот тут мы подходим еще к одному интересному моменту, от которого я в непонятках до сих пор. Для того чтобы оформить посылку на таможне, необходимо заполнять таможенную декларацию. Для посылок до 1000 евро это декларация формы M-16. Подавать эту декларацию нужно в письменном и электронном виде. Электронная копия должна быть ОБЯЗАТЕЛЬНО и представлена должна быть на floppy-диске. А-фи-ген-но! НО это еще не самое интересное. Самое интересное что декларация подается в виде файла определенного формата. Файлики эти делаются проприетарной программой, которой для обычных людей в свободном доступе нет. После небольшого допроса представителя UPS я узнал что:

  • Программа стоит 1200 гривен ($150)
  • Шаблон документа M-16 стоит 600 гривен ($75)
  • Ежемесячная плата за поддержку и обновления 120 гривен ($15)

Ну и спрашивается, как обычному человеку можно сдать документы нашей доблестной таможне, не прибегая к услугам брокеров (которых заставили покупать эту программу и теперь они за оформление декларации берут 150 гривен, это $18.75)? Супер. Монополия блин. Вот и мне пришлось расстаться с честно заработанными 150 деньгами непонятно по какой причине. Написать все в текстовом виде я мог бы и сам. И в итоге, что мы получили: $476.75 + 71.4 + 1.6 + 18.75 = 568.5 В общем итоге переплата за доставку и мзду нашим таможенным органам составила 278.5, это почти столько же, сколько стоит сам ноутбук. small_notebook Вот так получается, в нашей стране честно работать невозможно. НО Я не говорю что, я не доволен результатом. Во-первых, ноутбук оказался рабочим, при чем, рабочим полностью. Во-вторых, ноутбук оказался довольно хорошего качества и сборка аккуратная, я даже не ожидал: лакированный корпус, довольно удобный тачпад и клавиатура, Windows XP на нем тоже отлично работает, Web-камера – полет нормальный. Если еще и заявленная поддержка 3G заработает, будет вообще шикарно. 3G не пробовал, ибо нет карточки. Сам ноутбук, как я писал выше, я заказал в качестве пробного образца и как рабочий инструмент он меня мало интересует, поэтому если кто-то захочет его приобрести ровно за ту сумму, которую я на него потратил, можно написать в приват – договоримся. Обзор… готовлю. Несколько фоток даю прямо сейчас 🙂 Скачать полную спецификацию ноутбука.

В виду того, что у читателей появляется много вопросов, где лучше покупать китайскую электронику, говорю – я покупаю на DealExtreme. Пока проблем не было ни разу.

A.

ActionBarSherlock – Удобная реализация UI-паттерна ActionBar для Android-приложений – Часть I

Что-то пауза с постами у нас получается совсем нечеловеческая. Попробуем еще разок возобновить публикации.
И сегодня мы познакомимся с библиотекой, реализующей UI-паттерн Action Bar для Android-приложений.

Разработчики библиотеки позиционируют ее как расширение к Compatibility Library, которое для создания ActionBar использует нативную реализацию, если это поддерживается системой, или же вручную дублирует нужный функционал.

Библиотека является open-source проектом и доступна для загрузки на GitHub.

Начало

Начать пользоваться библиотекой довольно просто. Нужно сделать вот что:

  • Унаследовать активити от SherlockActivity (или SherlockListActivity)
  • Переопределить метод onCreateOptionsMenu() и в нем заполнить объект Menu информацией о кнопках
  • В onCreate() или в манифесте указать что используется тема Theme_Sherlock

В итоге код получится приблизительно таким:

package ru.mobiledeveloper.actionbarsherlocktest;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

import android.os.Bundle;
import ru.mobiledeveloper.actionbarsherlocktest.R;

public class ActionBarSherlockTestActivity extends SherlockActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
    	setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add("Save")
            .setIcon(R.drawable.ic_compose)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

        menu.add("Search")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | 
                MenuItem.SHOW_AS_ACTION_WITH_TEXT);

        return true;
    }
}

В результате получим такой внешний вид окна приложения:

Режим действия

ActionBar Sherlock поддерживает возможность отображения контекстно-зависимого содержания. Такая возможность называется режим действий (ActionMode). режим действий можно использовать, например, для отображения контекстного “меню” при длинном нажатии на єлемент списка.
Для того, чтобі добавить возможность отображать режим действий в приложение, нужно сделать следующее:

  • Создать класс, производный от ActionMode.Callback
  • Реализовать в этом классе метод onCreateActionMode(), в котором добавить нужные команды.
  • Реализовать в этом классе метод onActionItemClicked(), в котором написать код, обрабатывающий нажатия на кнопки в ActionBar
  • Для перехода в режим действий вызвать метод startActionMode() и в качестве параметра передать ему объект выше указанного класса

В коде это выглядит приблизительно так:

public class ActionBarSherlockTestActivity extends SherlockActivity {
	
	ActionMode mMode;
	
	private final class ActionModeA implements ActionMode.Callback {

        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            menu.add("Save")
                .setIcon(R.drawable.ic_compose)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
            menu.add("Search")
                .setIcon(R.drawable.ic_search)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
            return true;
        }

		public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
			// TODO Auto-generated method stub
			return false;
		}

		public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
			Toast.makeText(ActionBarSherlockTestActivity.this, 
                            "Got click: " + item, Toast.LENGTH_SHORT).show();
            mode.finish();
			return true;
		}

		public void onDestroyActionMode(ActionMode mode) {
			// TODO Auto-generated method stub
			
		}
        
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
    	setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btnTest = (Button)findViewById(R.id.btnTest);
        if(btnTest != null) {
        	btnTest.setOnClickListener(new OnClickListener() {
				
				public void onClick(View v) {
					mMode = startActionMode(new ActionModeA());
				}
			});
        }
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add("Save")
            .setIcon(R.drawable.ic_compose)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);

        menu.add("Search")
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | 
                MenuItem.SHOW_AS_ACTION_WITH_TEXT);
        return true;
    }
}

И в результате получаем такое:

Существует, также, возможность отображать ActionBar только в режиме Action Mode и скрывать ее в остальное время работы приложения. Для этого в onCreate() надо вызвать requestWindowFeature(Window.FEATURE_NO_TITLE).

Провайдеры действий

ActionBar Sherlock поддерживает работу с провайдерами действий (Action Provider), которые позволяют реализовать отображение собственных виджетов в ActionBar и добавить более гибкое взаимодействие с пользователем. Action Provier можно повторно использовать в нескольких активитях.
Есть две возможности указать Action Provider для элемента – прописать его в XML файле для пункта меню или указать в коде с помощью setActionProvider().
Рассмотрим реализацию Action Provider’а, который по нажатию на кнопку в ActionBar открывает системные настройки:

public static class SettingsActionProvider extends ActionProvider {
	private static final Intent sSettingsIntent = new Intent(Settings.ACTION_SETTINGS);

	private final Context mContext;

    public SettingsActionProvider(Context context) {
        super(context);
        mContext = context;
    }

    @Override
    public View onCreateActionView() {
        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
        View view = layoutInflater.inflate(R.layout.settings_action_provider, null);
        ImageButton button = (ImageButton) view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                mContext.startActivity(sSettingsIntent);
            }
        });
        return view;
    }

    @Override
    public boolean onPerformDefaultAction() {
        mContext.startActivity(sSettingsIntent);
        return true;
    }
}
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Этот элемент будет отображен в ActionBar
    menu.add("Settings")
        .setActionProvider(new SettingsActionProvider(
        		ActionBarSherlockTestActivity.this))
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | 
        		MenuItem.SHOW_AS_ACTION_WITH_TEXT);
        
    // Этот элемент будет отображен в стандартном меню
    menu.add("Settings")
        .setActionProvider(new SettingsActionProvider(
        		ActionBarSherlockTestActivity.this))
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
    return true;
}

XML-файл для кнопки:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:focusable="true"
    android:addStatesFromChildren="true"
    android:background="?attr/actionBarItemBackground"
    style="?attr/actionButtonStyle">
    <ImageButton android:id="@+id/button"
        android:background="@drawable/ic_launcher_settings"
        android:layout_width="32dip"
        android:layout_height="32dip"
        android:layout_gravity="center"
        android:scaleType="fitCenter"
        android:adjustViewBounds="true" />
</LinearLayout>

После создания провайдера действий и добавления его к пунктам меню получим такое:

Collapsible Actions

Есть возможность, при нажатии на пункт меню, отображать собственный контрол на всю ширину ActionBar. Например, для поиска можно отображать текстовое поле. Сделать это можно, указав дайаут с помощью setActionView() и стиль MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW.

public boolean onCreateOptionsMenu(Menu menu) {
    boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light;
    menu.add("Search")
        .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
        .setActionView(R.layout.collapsible_edittext)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | 
                MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    return true;
}

При нажатии на пункт в ActionBar будет отображен контрол из XML файла collapsible_edittext.xml.

Полезные функции

Индикатор прогресса
Есть возможность отобразить индикатор прогресса в ActionBar. Такая возможность может быть полезна для отображения прогресса длительной операции. Сделать это можно с помощью метода setSupportProgressBarIndeterminateVisibility().
Оверлей
Можно отображать ActionBar поверх контента при скроллинге. Очень полезная возможность, например, при просмотре текстов. Перевести ActinBar в режим оверлея можно с помощью метода requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY).

Различные типы активитей

В ActionBar Sherlock помимо обычной активити есть классы для отображения активитей со списками, активитей настройки, диалогов.
SherlockPreferenceActivity
Этот класс используется для отображения окон настройки. Функционал аналогичен PreferenceActivity из Android SDK.

SherlockListActivity и SherlockExpandableListActivity
Это активити, производные от ListActivity и ExpandableListActivity соответственно, в которую добавлен функционал по работе с ActionBar.
Диалоги
Есть возможность отображать активити в виде диалогов. Для этого надо указать соответствующую тему в манифесте (необходимо указывать тему именно в манифесте).

<activity
    android:name=".Dialog"
    android:label="@string/dialog"
    android:theme="@style/Theme.Sherlock.Dialog">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="com.actionbarsherlock.sample.demos.EXAMPLE" />
    </intent-filter>
</activity>

На вид выглядит так:

Пара слов о навигации

В ActionBar Sherlock есть возможность организовать навигацию внутри приложения средствами ActionBar. Визуально получается очень приятный результат, например можно реализовать навигацию посредством выпадающего списка или вкладками или еще каким-либо способом, встроив контрол для навигации в ActionBar.

Более подробно реализацию навигации рассмотрим в следующей части статьи.