iosched読書会向け資料
TRANSCRIPT
iosched読書会
T.K
at 頓智・会議室
機能概要
• Google I/O 2011 スケジュール閲覧
• セッションの詳細とスピーカー情報の閲覧
• セッションとサンドボックスの評価
• リアルタイムの buzz 情報の閲覧
• カンファレンス地図を利用したガイド
• Catch を利用したノート作成・管理
アプリ画面
phoneのみtablet未所持なもので・・・
Top , search
Schedule
Map
Sessions
Starred
Sandbox
Blletin
Realtime Stream
初見の雑感
• 素直によくできている– tabletも使ってみたかったが、emulator は立ち上げる気が起きず・・・
• オプションメニューで機能を提供していない– iOS向けに同じアプリを提供したいから?
– ActionBarがあるから?
• ActionBarが機能ごとに微妙に異なる機能を提供–どこからでも Home に戻れる機能を提供
中身をざっとみた雑感
• Honycombで Activity + Fragment のアプリを作ったことがないため、違和感あり– 3.0以上では、Activity+Fragment
– 2.3以下では、FragmentActivity + Fragment
• 互換ライブラリの準備が必要
• ioschedのビルドにも必要
– 1画面 1Activity に慣れているAndroid開発者はつらそう
– tabletの1Activity 複数Fragmentからみたほうがよかったかも
• 端末がないからイメージできず・・・
• これをベースに他のイベント向けスケジュールアプリ作るのは、意外と時間がかかりそう– phone向けのみで Fragment 利用無し版があればいいのに・・・
– でも、CEATECなどでは両対応のものを提供してもらいたい
Buildするのに思ったより時間が・・・・orz
技術詳細
AndroidManifest.xml(1/?)
<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.google.android.apps.iosched"android:versionCode="16"android:versionName="0.16"android:installLocation="auto">
<uses-sdkandroid:minSdkVersion="7"android:targetSdkVersion="11" />
<permissionandroid:name="com.google.android.apps.iosched.permission.WRITE_SCHEDULE"android:protectionLevel="normal"android:label="@string/permission_write"android:description="@string/permission_write" />
2.1 eclair
3.0 honycomb
AndroidManifest.xml(2/?)
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:logo="@drawable/title_logo"
android:theme="@style/Theme.IOSched"
android:hardwareAccelerated="true">
AndroidManifest.xml <application>
android:logo
AndroidManifest.xml(3/?)
<!-- Used for install referrer tracking -->
<receiver
android:name="com.google.android.apps.analytics.AnalyticsReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
<!-- Other manifest items -->
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.SearchActivity" />
<service android:name=".service.SyncService" />
<provider
android:name=".provider.ScheduleProvider"
android:authorities="com.google.android.apps.iosched"
android:writePermission="com.google.android.apps.iosched.permission.WRITE_SCHEDULE" />
Google Analytics向け
インストール数計算?
.service.SyncService
• com.google.android.apps.iosched.service– SyncService.java
• 機能– BackGround で動作
– 最新情報をデータベース(ScheduleProvider)に同期
• 備考– アプリ起動時に起動
• HomeActivity:102line:startService(intent)
– xmlフォルダ内から各種情報を取得(オフライン対応)• blocks, rooms, tracks, search_suggest, sessions
– ネットワーク上から最新情報取得も可能
Activity 一覧
• Common Activity– .ui.HomeActivity
– .ui.BulletinActivity
– .ui.TagStreamActivity
– .ui.StarredActivity
– .ui.SearchActivity
• For Phone– .ui.phone.ScheduleActivity
– .ui.phone.TracksActivity
– .ui.phone.SessionsActivity
– .ui.phone.SessionDetailActivity
– .ui.phone.VendorsActivity
– .ui.phone.VendorDetailActivity
– .ui.phone.MapActivity
• For Tablet– .ui.tablet.SessionsMultiPaneActivity
– .ui.tablet.VendorsMultiPaneActivity
– .ui.tablet.ScheduleMultiPaneActivity
– .ui.tablet.MapMultiPaneActivity
– .ui.tablet.NowPlayingMultiPaneActivity
Activity 一覧
• Common Activity– .ui.HomeActivity
• intent-filter– android.intent.action.MAIN
– android.intent.category.LAUNCHER
– .ui.BulletinActivity
– .ui.TagStreamActivity
– .ui.StarredActivity
– .ui.SearchActivity• android:launchMode="singleTop“
• intent-filter– android.intent.action.SEARCH
– android.intent.category.DEFAULT
• <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
Activity 一覧
• For Phone
– .ui.phone.ScheduleActivity
– .ui.phone.TracksActivity
– .ui.phone.SessionsActivity
– .ui.phone.SessionDetailActivity
– .ui.phone.VendorsActivity
– .ui.phone.VendorDetailActivity
– .ui.phone.MapActivity
Common Activity系クラス図.ui.*(AndroidManifestベース)
Base
Activity
Home
Activity
Fragment
Activity
BaseSinglePane
Activity
Bulletin
Activity
BaseMultiPane
Activity
Starred
Activity
Search
Activity
TagStream
Activity
phone Activity系クラス図.ui.phohe.* (AndroidManifestベース)
Base
Activity
Fragment
Activity
BaseSinglePane
Activity
Schedule
Activity
Tracks
Activity
SessionDetail
Activity
Vendors
Activity
Sessions
Activity
VendorDetail
Activity
Map
Activity
ui.Phone Activity
tablet Activity系クラス図.ui.tablet.*(AndroidManifestベース)Base
Activity
Fragment
Activity
BaseMultiPane
Activity
ScheduleMultiPane
Activity
SessionsMultiPane
Activity
NowPlaying
MultiPane
Activity
VendorsMultiPane
Activity
MapMultiPane
Activity
FragmentManager.
OnBackStackChangedListener
View.
OnClickListener
.ui.HomeActivity
• トップページで、phone と tablet で異なるレイアウト– Phone
• ダッシュボード(DashboardFragment)
– tablet• ダッシュボード(DashboardFragment)• Stream(TagStreamFragment)
• Layout– activity_home.xml
• [include] actionbar.xml– [include] colorstrip.xml
• [fragment] DashboradFragment– layout/fragment_dashboard.xml
• [fragment] WhatsOnFragment– layout/fragment_whats_on
• 疑問– Actionbarのデザインや機能は誰が設定しているか?
• *Fragment の中で Honycombかどうかを判断して、View を構築し、onCreateView()の返り値として、そのview として返すことによって画面を作成
DashboardFragment
• layout
– R.layout.fragment_dashboard
• .ui.widget.DashboardLayout
– 子Viewとして、ダッシュボードの各ボタンを保持
– 子Viewをグリッドのように表示し、縦、横の空白を同じにするカスタ
ムレイアウト
• view を構築して、onCreateView() の返り値で返す
– 各ボタンへのクリック処理を追加
– この View が HomeActivityの<fragment>に展開される
WhatsOnFragment
• layout– R.layout.fragment_whats_on
• <LinearLayout>のみ horizontal
• 第1要素– 3パターンの文言表示
• Google IO 開催前– R.layout.whats_on_countdown
– カウントダウンタイマー– 残り時間、日数を表示
• 開催中– R.layout.whats_on_now_playing
– Now Playing(リンク設定)» Honycombの場合:NowPlayingMultiPaneActivityへのリンク» phoneの場合:現在開催中のScheduleContractへのリンク
• 開催後– R.layout.whats_on_thank_you
» @string/whats_on_thank_you_title
» you next year!
• 参考情報– UIUtils
» public static final long CONFERENCE_START_MILLIS = ParserUtils.parseTime("2011-05-10T09:00:00.000-07:00");
» public static final long CONFERENCE_END_MILLIS = ParserUtils.parseTime("2011-05-11T17:30:00.000-07:00");
• 第2要素– phoneのみ
• R.layout.whats_on_stream– 文言:Realtime¥nStream– TagStreamActivityへのリンク
第1 第2
Fragment系クラス
• Fragment の派生クラス– .ui
• BulletinFragment
• DashboardFragment
• MapFragment
• ScheduleFragment
• SessionDetailFragment
• SessionsFragment
• TagStreamFragment
• TracksFragment
• VendorDetailFragment
• VendorsFragment
• WhatsOnFragment
– .ui.tablet• TracksDropdownFragment
Fragment系 クラス図Fragment
.tablet.
TracksDropdown
Fragment
NotifyingAsyncQueryHandler.
AsyncQueryListener
AdapterView.
OnItemClickListener
PopupWindow.
OnDismissListener
Bulletin
Fragment
Dashboard
Fragment
Map
Fragment
Schedule
Fragment
SessionDetail
Fragment
Sessions
Fragment
TagStream
Fragment Tracks
Fragment
VendorDetail
Fragment
Vendors
Fragment
WhatsOn
Fragment
View.
OnClickListener
ObservableScrollView.
OnScrollListener
CompoundButton.
OnCheckedChangeListener
というところで、力尽きました・・・