diff --git a/res/drawable-xlarge-xhdpi/add_call_more_default.png b/res/drawable-xlarge-land-xhdpi/add_call_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/add_call_more_default.png rename to res/drawable-xlarge-land-xhdpi/add_call_default.png diff --git a/res/drawable-xlarge-xhdpi/add_call_more_disabled.png b/res/drawable-xlarge-land-xhdpi/add_call_disabled.png similarity index 100% rename from res/drawable-xlarge-xhdpi/add_call_more_disabled.png rename to res/drawable-xlarge-land-xhdpi/add_call_disabled.png diff --git a/res/drawable-xlarge-land-xhdpi/add_call_more_default.png b/res/drawable-xlarge-land-xhdpi/add_call_more_default.png new file mode 100644 index 000000000..a3ddce2f2 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/add_call_more_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/add_call_more_disabled.png b/res/drawable-xlarge-land-xhdpi/add_call_more_disabled.png new file mode 100644 index 000000000..374aacc0b Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/add_call_more_disabled.png differ diff --git a/res/drawable-xlarge-xhdpi/add_call_more_over.png b/res/drawable-xlarge-land-xhdpi/add_call_more_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/add_call_more_over.png rename to res/drawable-xlarge-land-xhdpi/add_call_more_over.png diff --git a/res/drawable-xlarge-land-xhdpi/add_call_over.png b/res/drawable-xlarge-land-xhdpi/add_call_over.png new file mode 100644 index 000000000..24fdabed5 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/add_call_over.png differ diff --git a/res/drawable-xlarge-xhdpi/add_contact_default.png b/res/drawable-xlarge-land-xhdpi/add_contact_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/add_contact_default.png rename to res/drawable-xlarge-land-xhdpi/add_contact_default.png diff --git a/res/drawable-xlarge-xhdpi/add_contact_disabled.png b/res/drawable-xlarge-land-xhdpi/add_contact_disabled.png similarity index 100% rename from res/drawable-xlarge-xhdpi/add_contact_disabled.png rename to res/drawable-xlarge-land-xhdpi/add_contact_disabled.png diff --git a/res/drawable-xlarge-xhdpi/add_contact_over.png b/res/drawable-xlarge-land-xhdpi/add_contact_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/add_contact_over.png rename to res/drawable-xlarge-land-xhdpi/add_contact_over.png diff --git a/res/drawable-xlarge-xhdpi/cancel_white_bg_default.png b/res/drawable-xlarge-land-xhdpi/back_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/cancel_white_bg_default.png rename to res/drawable-xlarge-land-xhdpi/back_default.png diff --git a/res/drawable-xlarge-xhdpi/cancel_white_bg_disabled.png b/res/drawable-xlarge-land-xhdpi/back_disabled.png similarity index 100% rename from res/drawable-xlarge-xhdpi/cancel_white_bg_disabled.png rename to res/drawable-xlarge-land-xhdpi/back_disabled.png diff --git a/res/drawable-xlarge-xhdpi/cancel_white_bg_over.png b/res/drawable-xlarge-land-xhdpi/back_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/cancel_white_bg_over.png rename to res/drawable-xlarge-land-xhdpi/back_over.png diff --git a/res/drawable-xlarge-land-xhdpi/background_logo.png b/res/drawable-xlarge-land-xhdpi/background_logo.png new file mode 100644 index 000000000..749d70f30 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/background_logo.png differ diff --git a/res/drawable-xlarge-xhdpi/backspace_default.png b/res/drawable-xlarge-land-xhdpi/backspace_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/backspace_default.png rename to res/drawable-xlarge-land-xhdpi/backspace_default.png diff --git a/res/drawable-xlarge-xhdpi/backspace_disabled.png b/res/drawable-xlarge-land-xhdpi/backspace_disabled.png similarity index 100% rename from res/drawable-xlarge-xhdpi/backspace_disabled.png rename to res/drawable-xlarge-land-xhdpi/backspace_disabled.png diff --git a/res/drawable-xlarge-xhdpi/backspace_over.png b/res/drawable-xlarge-land-xhdpi/backspace_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/backspace_over.png rename to res/drawable-xlarge-land-xhdpi/backspace_over.png diff --git a/res/drawable-xlarge-xhdpi/call_default.png b/res/drawable-xlarge-land-xhdpi/call_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/call_default.png rename to res/drawable-xlarge-land-xhdpi/call_default.png diff --git a/res/drawable-xlarge-xhdpi/call_disabled.png b/res/drawable-xlarge-land-xhdpi/call_disabled.png similarity index 100% rename from res/drawable-xlarge-xhdpi/call_disabled.png rename to res/drawable-xlarge-land-xhdpi/call_disabled.png diff --git a/res/drawable-xlarge-xhdpi/call_over.png b/res/drawable-xlarge-land-xhdpi/call_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/call_over.png rename to res/drawable-xlarge-land-xhdpi/call_over.png diff --git a/res/drawable-xlarge-land-xhdpi/cancel_white_bg_default.png b/res/drawable-xlarge-land-xhdpi/cancel_white_bg_default.png new file mode 100644 index 000000000..3dad47eb4 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/cancel_white_bg_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/cancel_white_bg_disabled.png b/res/drawable-xlarge-land-xhdpi/cancel_white_bg_disabled.png new file mode 100644 index 000000000..da4d42006 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/cancel_white_bg_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/cancel_white_bg_over.png b/res/drawable-xlarge-land-xhdpi/cancel_white_bg_over.png new file mode 100644 index 000000000..4dea8f4c8 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/cancel_white_bg_over.png differ diff --git a/res/drawable-xlarge-xhdpi/conference_default.png b/res/drawable-xlarge-land-xhdpi/conference_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/conference_default.png rename to res/drawable-xlarge-land-xhdpi/conference_default.png diff --git a/res/drawable-xlarge-xhdpi/conference_over.png b/res/drawable-xlarge-land-xhdpi/conference_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/conference_over.png rename to res/drawable-xlarge-land-xhdpi/conference_over.png diff --git a/res/drawable-xlarge-land-xhdpi/dialer_alt_back_default.png b/res/drawable-xlarge-land-xhdpi/dialer_alt_back_default.png new file mode 100644 index 000000000..969dec7af Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/dialer_alt_back_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/dialer_alt_back_over.png b/res/drawable-xlarge-land-xhdpi/dialer_alt_back_over.png new file mode 100644 index 000000000..a2105442f Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/dialer_alt_back_over.png differ diff --git a/res/drawable-xlarge-xhdpi/dialer_alt_default.png b/res/drawable-xlarge-land-xhdpi/dialer_alt_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/dialer_alt_default.png rename to res/drawable-xlarge-land-xhdpi/dialer_alt_default.png diff --git a/res/drawable-xlarge-xhdpi/dialer_alt_over.png b/res/drawable-xlarge-land-xhdpi/dialer_alt_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/dialer_alt_over.png rename to res/drawable-xlarge-land-xhdpi/dialer_alt_over.png diff --git a/res/drawable-xlarge-xhdpi/hangup_default.png b/res/drawable-xlarge-land-xhdpi/hangup_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/hangup_default.png rename to res/drawable-xlarge-land-xhdpi/hangup_default.png diff --git a/res/drawable-xlarge-xhdpi/hangup_over.png b/res/drawable-xlarge-land-xhdpi/hangup_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/hangup_over.png rename to res/drawable-xlarge-land-xhdpi/hangup_over.png diff --git a/res/drawable-xlarge-land-xhdpi/mark.png b/res/drawable-xlarge-land-xhdpi/mark.png index ecd22c300..668a3fa9c 100644 Binary files a/res/drawable-xlarge-land-xhdpi/mark.png and b/res/drawable-xlarge-land-xhdpi/mark.png differ diff --git a/res/drawable-xlarge-land-xhdpi/micro_off_default.png b/res/drawable-xlarge-land-xhdpi/micro_off_default.png new file mode 100644 index 000000000..45a5e3686 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/micro_off_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/micro_off_disabled.png b/res/drawable-xlarge-land-xhdpi/micro_off_disabled.png new file mode 100644 index 000000000..1a890b399 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/micro_off_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/micro_off_over.png b/res/drawable-xlarge-land-xhdpi/micro_off_over.png new file mode 100644 index 000000000..747f22b75 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/micro_off_over.png differ diff --git a/res/drawable-xlarge-land-xhdpi/micro_on_default.png b/res/drawable-xlarge-land-xhdpi/micro_on_default.png new file mode 100644 index 000000000..29cdd5723 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/micro_on_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/micro_on_disabled.png b/res/drawable-xlarge-land-xhdpi/micro_on_disabled.png new file mode 100644 index 000000000..9221d6277 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/micro_on_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/micro_on_over.png b/res/drawable-xlarge-land-xhdpi/micro_on_over.png new file mode 100644 index 000000000..1f47f646c Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/micro_on_over.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_add_default.png b/res/drawable-xlarge-land-xhdpi/options_add_default.png new file mode 100644 index 000000000..16e482c1a Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_add_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_add_disabled.png b/res/drawable-xlarge-land-xhdpi/options_add_disabled.png new file mode 100644 index 000000000..d515be37f Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_add_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_add_over.png b/res/drawable-xlarge-land-xhdpi/options_add_over.png new file mode 100644 index 000000000..44b79256d Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_add_over.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_default.png b/res/drawable-xlarge-land-xhdpi/options_default.png new file mode 100644 index 000000000..77379da0e Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_disabled.png b/res/drawable-xlarge-land-xhdpi/options_disabled.png new file mode 100644 index 000000000..c56fae1ca Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_over.png b/res/drawable-xlarge-land-xhdpi/options_over.png new file mode 100644 index 000000000..b32bd7274 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_over.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_selected.png b/res/drawable-xlarge-land-xhdpi/options_selected.png new file mode 100644 index 000000000..4dde52145 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_selected.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_transfer_default.png b/res/drawable-xlarge-land-xhdpi/options_transfer_default.png new file mode 100644 index 000000000..17d2efa75 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_transfer_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_transfer_disabled.png b/res/drawable-xlarge-land-xhdpi/options_transfer_disabled.png new file mode 100644 index 000000000..10aba5a24 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_transfer_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/options_transfer_over.png b/res/drawable-xlarge-land-xhdpi/options_transfer_over.png new file mode 100644 index 000000000..c90279aa6 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/options_transfer_over.png differ diff --git a/res/drawable-xlarge-xhdpi/pause_off_default.png b/res/drawable-xlarge-land-xhdpi/pause_off_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/pause_off_default.png rename to res/drawable-xlarge-land-xhdpi/pause_off_default.png diff --git a/res/drawable-xlarge-xhdpi/pause_off_over.png b/res/drawable-xlarge-land-xhdpi/pause_off_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/pause_off_over.png rename to res/drawable-xlarge-land-xhdpi/pause_off_over.png diff --git a/res/drawable-xlarge-xhdpi/pause_on_default.png b/res/drawable-xlarge-land-xhdpi/pause_on_default.png similarity index 100% rename from res/drawable-xlarge-xhdpi/pause_on_default.png rename to res/drawable-xlarge-land-xhdpi/pause_on_default.png diff --git a/res/drawable-xlarge-xhdpi/pause_on_over.png b/res/drawable-xlarge-land-xhdpi/pause_on_over.png similarity index 100% rename from res/drawable-xlarge-xhdpi/pause_on_over.png rename to res/drawable-xlarge-land-xhdpi/pause_on_over.png diff --git a/res/drawable-xlarge-land-xhdpi/setup_back_default.png b/res/drawable-xlarge-land-xhdpi/setup_back_default.png new file mode 100644 index 000000000..24df95c3b Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/setup_back_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/setup_back_disabled.png b/res/drawable-xlarge-land-xhdpi/setup_back_disabled.png new file mode 100644 index 000000000..a3bf99b0a Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/setup_back_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/setup_back_over.png b/res/drawable-xlarge-land-xhdpi/setup_back_over.png new file mode 100644 index 000000000..b4b2cc8b7 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/setup_back_over.png differ diff --git a/res/drawable-xlarge-land-xhdpi/setup_cancel_default.png b/res/drawable-xlarge-land-xhdpi/setup_cancel_default.png new file mode 100644 index 000000000..a0557c5e9 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/setup_cancel_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/setup_cancel_disabled.png b/res/drawable-xlarge-land-xhdpi/setup_cancel_disabled.png new file mode 100644 index 000000000..e72f7b4d5 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/setup_cancel_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/setup_cancel_over_.png b/res/drawable-xlarge-land-xhdpi/setup_cancel_over_.png new file mode 100644 index 000000000..edf9a2624 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/setup_cancel_over_.png differ diff --git a/res/drawable-xlarge-land-xhdpi/setup_start_default.png b/res/drawable-xlarge-land-xhdpi/setup_start_default.png new file mode 100644 index 000000000..8d1af16b9 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/setup_start_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/setup_start_disabled.png b/res/drawable-xlarge-land-xhdpi/setup_start_disabled.png new file mode 100644 index 000000000..20b0b5b73 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/setup_start_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/setup_start_over.png b/res/drawable-xlarge-land-xhdpi/setup_start_over.png new file mode 100644 index 000000000..fc030704e Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/setup_start_over.png differ diff --git a/res/drawable-xlarge-land-xhdpi/speaker_off_default.png b/res/drawable-xlarge-land-xhdpi/speaker_off_default.png new file mode 100644 index 000000000..4b611178c Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/speaker_off_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/speaker_off_disabled.png b/res/drawable-xlarge-land-xhdpi/speaker_off_disabled.png new file mode 100644 index 000000000..ebd857da7 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/speaker_off_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/speaker_off_over.png b/res/drawable-xlarge-land-xhdpi/speaker_off_over.png new file mode 100644 index 000000000..a68c3eb9b Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/speaker_off_over.png differ diff --git a/res/drawable-xlarge-land-xhdpi/speaker_on_default.png b/res/drawable-xlarge-land-xhdpi/speaker_on_default.png new file mode 100644 index 000000000..75a192643 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/speaker_on_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/speaker_on_disabled.png b/res/drawable-xlarge-land-xhdpi/speaker_on_disabled.png new file mode 100644 index 000000000..d2447d870 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/speaker_on_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/speaker_on_over.png b/res/drawable-xlarge-land-xhdpi/speaker_on_over.png new file mode 100644 index 000000000..28483bf59 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/speaker_on_over.png differ diff --git a/res/drawable-xlarge-land-xhdpi/unknown_small.png b/res/drawable-xlarge-land-xhdpi/unknown_small.png new file mode 100644 index 000000000..b4f451da6 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/unknown_small.png differ diff --git a/res/drawable-xlarge-land-xhdpi/video_off_default.png b/res/drawable-xlarge-land-xhdpi/video_off_default.png new file mode 100644 index 000000000..c479bf714 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/video_off_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/video_off_disabled.png b/res/drawable-xlarge-land-xhdpi/video_off_disabled.png new file mode 100644 index 000000000..036ec556d Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/video_off_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/video_off_over.png b/res/drawable-xlarge-land-xhdpi/video_off_over.png new file mode 100644 index 000000000..292042214 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/video_off_over.png differ diff --git a/res/drawable-xlarge-land-xhdpi/video_on_default.png b/res/drawable-xlarge-land-xhdpi/video_on_default.png new file mode 100644 index 000000000..fa3976e72 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/video_on_default.png differ diff --git a/res/drawable-xlarge-land-xhdpi/video_on_disabled.png b/res/drawable-xlarge-land-xhdpi/video_on_disabled.png new file mode 100644 index 000000000..52a3515d3 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/video_on_disabled.png differ diff --git a/res/drawable-xlarge-land-xhdpi/video_on_over.png b/res/drawable-xlarge-land-xhdpi/video_on_over.png new file mode 100644 index 000000000..23abeffa5 Binary files /dev/null and b/res/drawable-xlarge-land-xhdpi/video_on_over.png differ diff --git a/res/drawable-xlarge-xhdpi/bottom.png b/res/drawable-xlarge-xhdpi/bottom.png deleted file mode 100644 index 7d0389882..000000000 Binary files a/res/drawable-xlarge-xhdpi/bottom.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/chat_default.png b/res/drawable-xlarge-xhdpi/chat_default.png deleted file mode 100644 index 09e2acd5a..000000000 Binary files a/res/drawable-xlarge-xhdpi/chat_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/chat_over.png b/res/drawable-xlarge-xhdpi/chat_over.png deleted file mode 100644 index c6ff510b2..000000000 Binary files a/res/drawable-xlarge-xhdpi/chat_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/chat_selected.png b/res/drawable-xlarge-xhdpi/chat_selected.png deleted file mode 100644 index ac50aa1f7..000000000 Binary files a/res/drawable-xlarge-xhdpi/chat_selected.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/contacts_default.png b/res/drawable-xlarge-xhdpi/contacts_default.png deleted file mode 100644 index 4c754a33b..000000000 Binary files a/res/drawable-xlarge-xhdpi/contacts_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/contacts_over.png b/res/drawable-xlarge-xhdpi/contacts_over.png deleted file mode 100644 index af9886500..000000000 Binary files a/res/drawable-xlarge-xhdpi/contacts_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/contacts_selected.png b/res/drawable-xlarge-xhdpi/contacts_selected.png deleted file mode 100644 index 397f71f8c..000000000 Binary files a/res/drawable-xlarge-xhdpi/contacts_selected.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/dialer_address_background.png b/res/drawable-xlarge-xhdpi/dialer_address_background.png deleted file mode 100644 index 302d82d5d..000000000 Binary files a/res/drawable-xlarge-xhdpi/dialer_address_background.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/history_default.png b/res/drawable-xlarge-xhdpi/history_default.png deleted file mode 100644 index ad31bf9b8..000000000 Binary files a/res/drawable-xlarge-xhdpi/history_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/history_over.png b/res/drawable-xlarge-xhdpi/history_over.png deleted file mode 100644 index 54944e122..000000000 Binary files a/res/drawable-xlarge-xhdpi/history_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/history_selected.png b/res/drawable-xlarge-xhdpi/history_selected.png deleted file mode 100644 index e880fb325..000000000 Binary files a/res/drawable-xlarge-xhdpi/history_selected.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/logo.png b/res/drawable-xlarge-xhdpi/logo.png deleted file mode 100644 index 18f8f255c..000000000 Binary files a/res/drawable-xlarge-xhdpi/logo.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/micro_off_default.png b/res/drawable-xlarge-xhdpi/micro_off_default.png deleted file mode 100644 index 6512dee9d..000000000 Binary files a/res/drawable-xlarge-xhdpi/micro_off_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/micro_off_disabled.png b/res/drawable-xlarge-xhdpi/micro_off_disabled.png deleted file mode 100644 index 4e69a2135..000000000 Binary files a/res/drawable-xlarge-xhdpi/micro_off_disabled.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/micro_off_over.png b/res/drawable-xlarge-xhdpi/micro_off_over.png deleted file mode 100644 index b9230d6e4..000000000 Binary files a/res/drawable-xlarge-xhdpi/micro_off_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/micro_on_default.png b/res/drawable-xlarge-xhdpi/micro_on_default.png deleted file mode 100644 index e1677a4fd..000000000 Binary files a/res/drawable-xlarge-xhdpi/micro_on_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/micro_on_disabled.png b/res/drawable-xlarge-xhdpi/micro_on_disabled.png deleted file mode 100644 index f8e3c49c3..000000000 Binary files a/res/drawable-xlarge-xhdpi/micro_on_disabled.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/micro_on_over.png b/res/drawable-xlarge-xhdpi/micro_on_over.png deleted file mode 100644 index 585fb8aa3..000000000 Binary files a/res/drawable-xlarge-xhdpi/micro_on_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_add_default.png b/res/drawable-xlarge-xhdpi/options_add_default.png deleted file mode 100644 index f3aa84165..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_add_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_add_disabled.png b/res/drawable-xlarge-xhdpi/options_add_disabled.png deleted file mode 100644 index 60874af11..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_add_disabled.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_add_over.png b/res/drawable-xlarge-xhdpi/options_add_over.png deleted file mode 100644 index 59caf0945..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_add_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_default.png b/res/drawable-xlarge-xhdpi/options_default.png deleted file mode 100644 index 891847836..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_disabled.png b/res/drawable-xlarge-xhdpi/options_disabled.png deleted file mode 100644 index 9927bc551..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_disabled.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_over.png b/res/drawable-xlarge-xhdpi/options_over.png deleted file mode 100644 index e69476a04..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_selected.png b/res/drawable-xlarge-xhdpi/options_selected.png deleted file mode 100644 index 69e81213d..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_selected.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_transfer_default.png b/res/drawable-xlarge-xhdpi/options_transfer_default.png deleted file mode 100644 index 113291d4f..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_transfer_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_transfer_disabled.png b/res/drawable-xlarge-xhdpi/options_transfer_disabled.png deleted file mode 100644 index 322d744c4..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_transfer_disabled.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/options_transfer_over.png b/res/drawable-xlarge-xhdpi/options_transfer_over.png deleted file mode 100644 index 31bb2a738..000000000 Binary files a/res/drawable-xlarge-xhdpi/options_transfer_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/settings_default.png b/res/drawable-xlarge-xhdpi/settings_default.png deleted file mode 100644 index 0000e2465..000000000 Binary files a/res/drawable-xlarge-xhdpi/settings_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/settings_over.png b/res/drawable-xlarge-xhdpi/settings_over.png deleted file mode 100644 index 0e93432ee..000000000 Binary files a/res/drawable-xlarge-xhdpi/settings_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/settings_selected.png b/res/drawable-xlarge-xhdpi/settings_selected.png deleted file mode 100644 index b1f1a1092..000000000 Binary files a/res/drawable-xlarge-xhdpi/settings_selected.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/speaker_off_default.png b/res/drawable-xlarge-xhdpi/speaker_off_default.png deleted file mode 100644 index 7c6cbd752..000000000 Binary files a/res/drawable-xlarge-xhdpi/speaker_off_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/speaker_off_disabled.png b/res/drawable-xlarge-xhdpi/speaker_off_disabled.png deleted file mode 100644 index 3eb0f62bb..000000000 Binary files a/res/drawable-xlarge-xhdpi/speaker_off_disabled.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/speaker_off_over.png b/res/drawable-xlarge-xhdpi/speaker_off_over.png deleted file mode 100644 index b2f3a9316..000000000 Binary files a/res/drawable-xlarge-xhdpi/speaker_off_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/speaker_on_default.png b/res/drawable-xlarge-xhdpi/speaker_on_default.png deleted file mode 100644 index 120aa0058..000000000 Binary files a/res/drawable-xlarge-xhdpi/speaker_on_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/speaker_on_disabled.png b/res/drawable-xlarge-xhdpi/speaker_on_disabled.png deleted file mode 100644 index 6fa314087..000000000 Binary files a/res/drawable-xlarge-xhdpi/speaker_on_disabled.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/speaker_on_over.png b/res/drawable-xlarge-xhdpi/speaker_on_over.png deleted file mode 100644 index bb8277584..000000000 Binary files a/res/drawable-xlarge-xhdpi/speaker_on_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/splashscreen.png b/res/drawable-xlarge-xhdpi/splashscreen.png deleted file mode 100644 index 168900c1c..000000000 Binary files a/res/drawable-xlarge-xhdpi/splashscreen.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/statebar_background.png b/res/drawable-xlarge-xhdpi/statebar_background.png deleted file mode 100644 index a9ba49f10..000000000 Binary files a/res/drawable-xlarge-xhdpi/statebar_background.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/transfer_default.png b/res/drawable-xlarge-xhdpi/transfer_default.png deleted file mode 100644 index 2f5813ee1..000000000 Binary files a/res/drawable-xlarge-xhdpi/transfer_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/transfer_over.png b/res/drawable-xlarge-xhdpi/transfer_over.png deleted file mode 100644 index 8e5edebad..000000000 Binary files a/res/drawable-xlarge-xhdpi/transfer_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/video_off_default.png b/res/drawable-xlarge-xhdpi/video_off_default.png deleted file mode 100644 index eacab0085..000000000 Binary files a/res/drawable-xlarge-xhdpi/video_off_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/video_off_disabled.png b/res/drawable-xlarge-xhdpi/video_off_disabled.png deleted file mode 100644 index 327a67cd4..000000000 Binary files a/res/drawable-xlarge-xhdpi/video_off_disabled.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/video_off_over.png b/res/drawable-xlarge-xhdpi/video_off_over.png deleted file mode 100644 index 5b9598b10..000000000 Binary files a/res/drawable-xlarge-xhdpi/video_off_over.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/video_on_default.png b/res/drawable-xlarge-xhdpi/video_on_default.png deleted file mode 100644 index a85287600..000000000 Binary files a/res/drawable-xlarge-xhdpi/video_on_default.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/video_on_disabled.png b/res/drawable-xlarge-xhdpi/video_on_disabled.png deleted file mode 100644 index 35c27a72a..000000000 Binary files a/res/drawable-xlarge-xhdpi/video_on_disabled.png and /dev/null differ diff --git a/res/drawable-xlarge-xhdpi/video_on_over.png b/res/drawable-xlarge-xhdpi/video_on_over.png deleted file mode 100644 index 3d04d5423..000000000 Binary files a/res/drawable-xlarge-xhdpi/video_on_over.png and /dev/null differ diff --git a/res/layout-xlarge-land/avatar.xml b/res/layout-xlarge-land/avatar.xml new file mode 100644 index 000000000..361ea0b10 --- /dev/null +++ b/res/layout-xlarge-land/avatar.xml @@ -0,0 +1,29 @@ + + + + + + + + + + \ No newline at end of file diff --git a/res/layout-xlarge-land/dialer.xml b/res/layout-xlarge-land/dialer.xml index 5c04c2913..2a034ca3b 100644 --- a/res/layout-xlarge-land/dialer.xml +++ b/res/layout-xlarge-land/dialer.xml @@ -10,6 +10,7 @@ android:layout_alignParentTop="true" android:focusable="true" android:focusableInTouchMode="true" + android:background="@drawable/dialer_address_background" android:layout_gravity="center"> @@ -18,15 +19,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@android:color/white" + android:layout_toLeftOf="@+id/Erase" + android:background="@color/transparent" android:textSize="30dp" - android:background="@drawable/dialer_address_background" android:paddingLeft="20dp" android:paddingRight="20dp" android:gravity="center" - android:inputType="textEmailAddress" /> + android:inputType="textEmailAddress" + android:hint="@string/addressHint" /> - - + android:layout_height="match_parent"> - + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_alignParentLeft="true" /> - - - - - - - - - - - - - - + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_alignParentRight="true"> - - + + \ No newline at end of file diff --git a/res/layout-xlarge-land/incall.xml b/res/layout-xlarge-land/incall.xml new file mode 100644 index 000000000..5e6d52c0b --- /dev/null +++ b/res/layout-xlarge-land/incall.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout-xlarge-land/main.xml b/res/layout-xlarge-land/main.xml index 4f43ef48e..233a5542d 100644 --- a/res/layout-xlarge-land/main.xml +++ b/res/layout-xlarge-land/main.xml @@ -2,7 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/landscape_background"> + + diff --git a/res/values/color.xml b/res/values/color.xml index a4d8c06c8..f07034e8d 100644 --- a/res/values/color.xml +++ b/res/values/color.xml @@ -23,4 +23,6 @@ #ffcf4c29 #00000000 + + #CCCCCC diff --git a/src/org/linphone/InCallActivity.java b/src/org/linphone/InCallActivity.java index ce34bb30f..ba89744ba 100644 --- a/src/org/linphone/InCallActivity.java +++ b/src/org/linphone/InCallActivity.java @@ -57,7 +57,6 @@ import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.Button; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.TextView; /** @@ -81,7 +80,7 @@ public class InCallActivity extends FragmentActivity implements private AudioCallFragment audioCallFragment; private VideoCallFragment videoCallFragment; private boolean isSpeakerEnabled = false, isMicMuted = false, isVideoEnabled, isTransferAllowed, isAnimationDisabled; - private LinearLayout mControlsLayout; + private ViewGroup mControlsLayout; private Numpad numpad; private int cameraNumber; private Animation slideOutLeftToRight, slideInRightToLeft, slideInBottomToTop, slideInTopToBottom, slideOutBottomToTop, slideOutTopToBottom; @@ -180,7 +179,7 @@ public class InCallActivity extends FragmentActivity implements switchCamera = (ImageView) findViewById(R.id.switchCamera); switchCamera.setOnClickListener(this); - mControlsLayout = (LinearLayout) findViewById(R.id.menu); + mControlsLayout = (ViewGroup) findViewById(R.id.menu); if (!isTransferAllowed) { addCall.setBackgroundResource(R.drawable.options_add_call); diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 53f2c500e..d006bc073 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -1,22 +1,23 @@ package org.linphone; + /* -LinphoneActivity.java -Copyright (C) 2012 Belledonne Communications, Grenoble, France + LinphoneActivity.java + Copyright (C) 2012 Belledonne Communications, Grenoble, France -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ import static android.content.Intent.ACTION_MAIN; import java.text.SimpleDateFormat; @@ -84,107 +85,121 @@ import android.widget.Toast; /** * @author Sylvain Berfini */ -public class LinphoneActivity extends FragmentActivity implements OnClickListener, ContactPicked, - LinphoneOnCallStateChangedListener, - LinphoneOnMessageReceivedListener, - LinphoneOnRegistrationStateChangedListener { - public static final String PREF_FIRST_LAUNCH = "pref_first_launch"; +public class LinphoneActivity extends FragmentActivity implements + OnClickListener, ContactPicked, LinphoneOnCallStateChangedListener, + LinphoneOnMessageReceivedListener, + LinphoneOnRegistrationStateChangedListener { + public static final String PREF_FIRST_LAUNCH = "pref_first_launch"; private static final int SETTINGS_ACTIVITY = 123; - private static final int FIRST_LOGIN_ACTIVITY = 101; + private static final int FIRST_LOGIN_ACTIVITY = 101; private static final int callActivity = 19; - + private static LinphoneActivity instance; private StatusFragment statusFragment; private TextView missedCalls, missedChats; private ImageView dialer; private LinearLayout menu, mark; - private RelativeLayout contacts, history, settings, chat, aboutChat, aboutSettings; + private RelativeLayout contacts, history, settings, chat, aboutChat, + aboutSettings; private FragmentsAvailable currentFragment, nextFragment; - private Fragment dialerFragment, messageListenerFragment, messageListFragment, friendStatusListenerFragment; + private Fragment dialerFragment, messageListenerFragment, + messageListFragment, friendStatusListenerFragment; private SavedState dialerSavedState; private ChatStorage chatStorage; - private boolean preferLinphoneContacts = false, isAnimationDisabled = false, isContactPresenceDisabled = true; + private boolean preferLinphoneContacts = false, + isAnimationDisabled = false, isContactPresenceDisabled = true; private Handler mHandler = new Handler(); private List contactList, sipContactList; private Cursor contactCursor, sipContactCursor; private OrientationEventListener mOrientationHelper; - + static final boolean isInstanciated() { return instance != null; } - + public static final LinphoneActivity instance() { - if (instance != null) return instance; + if (instance != null) + return instance; throw new RuntimeException("LinphoneActivity not instantiated yet"); } - + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - if (!LinphoneManager.isInstanciated()) { - Log.e("No service running: avoid crash by starting the launcher", this.getClass().getName()); + + if (!LinphoneManager.isInstanciated()) { + Log.e("No service running: avoid crash by starting the launcher", + this.getClass().getName()); // super.onCreate called earlier finish(); - startActivity(getIntent().setClass(this, LinphoneLauncherActivity.class)); + startActivity(getIntent().setClass(this, + LinphoneLauncherActivity.class)); return; } - - boolean useFirstLoginActivity = getResources().getBoolean(R.bool.useFirstLoginActivity); - SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); - if (useFirstLoginActivity && !pref.getBoolean(getString(R.string.first_launch_suceeded_once_key), false)) { - startActivityForResult(new Intent().setClass(this, SetupActivity.class), FIRST_LOGIN_ACTIVITY); + + boolean useFirstLoginActivity = getResources().getBoolean( + R.bool.useFirstLoginActivity); + SharedPreferences pref = PreferenceManager + .getDefaultSharedPreferences(this); + if (useFirstLoginActivity + && !pref.getBoolean( + getString(R.string.first_launch_suceeded_once_key), + false)) { + startActivityForResult( + new Intent().setClass(this, SetupActivity.class), + FIRST_LOGIN_ACTIVITY); } - setContentView(R.layout.main); - instance = this; - initButtons(); - - currentFragment = nextFragment = FragmentsAvailable.DIALER; - if (savedInstanceState == null) { - if (findViewById(R.id.fragmentContainer) != null) { - dialerFragment = new DialerFragment(); - dialerFragment.setArguments(getIntent().getExtras()); - getSupportFragmentManager().beginTransaction() - .add(R.id.fragmentContainer, dialerFragment).commit(); - selectMenu(FragmentsAvailable.DIALER); - } - } - - int missedCalls = LinphoneManager.getLc().getMissedCallsCount(); + setContentView(R.layout.main); + instance = this; + initButtons(); + + currentFragment = nextFragment = FragmentsAvailable.DIALER; + if (savedInstanceState == null) { + if (findViewById(R.id.fragmentContainer) != null) { + dialerFragment = new DialerFragment(); + dialerFragment.setArguments(getIntent().getExtras()); + getSupportFragmentManager().beginTransaction() + .add(R.id.fragmentContainer, dialerFragment).commit(); + selectMenu(FragmentsAvailable.DIALER); + } + } + + int missedCalls = LinphoneManager.getLc().getMissedCallsCount(); displayMissedCalls(missedCalls); - - int rotation = Compatibility.getRotation(getWindowManager().getDefaultDisplay()); + + int rotation = Compatibility.getRotation(getWindowManager() + .getDefaultDisplay()); // Inverse landscape rotation to initiate linphoneCore correctly if (rotation == 270) rotation = 90; else if (rotation == 90) rotation = 270; - + LinphoneManager.getLc().setDeviceRotation(rotation); mAlwaysChangingPhoneAngle = rotation; - + updateAnimationsState(); } - + private void initButtons() { menu = (LinearLayout) findViewById(R.id.menu); mark = (LinearLayout) findViewById(R.id.mark); - + history = (RelativeLayout) findViewById(R.id.history); - history.setOnClickListener(this); - contacts = (RelativeLayout) findViewById(R.id.contacts); - contacts.setOnClickListener(this); - dialer = (ImageView) findViewById(R.id.dialer); - dialer.setOnClickListener(this); - settings = (RelativeLayout) findViewById(R.id.settings); - settings.setOnClickListener(this); - chat = (RelativeLayout) findViewById(R.id.chat); + history.setOnClickListener(this); + contacts = (RelativeLayout) findViewById(R.id.contacts); + contacts.setOnClickListener(this); + dialer = (ImageView) findViewById(R.id.dialer); + dialer.setOnClickListener(this); + settings = (RelativeLayout) findViewById(R.id.settings); + settings.setOnClickListener(this); + chat = (RelativeLayout) findViewById(R.id.chat); chat.setOnClickListener(this); aboutChat = (RelativeLayout) findViewById(R.id.about_chat); aboutSettings = (RelativeLayout) findViewById(R.id.about_settings); - + if (getResources().getBoolean(R.bool.replace_chat_by_about)) { chat.setVisibility(View.GONE); chat.setOnClickListener(null); @@ -198,44 +213,51 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene aboutSettings.setVisibility(View.VISIBLE); aboutSettings.setOnClickListener(this); } - + missedCalls = (TextView) findViewById(R.id.missedCalls); missedChats = (TextView) findViewById(R.id.missedChats); } - + private void hideStatusBar() { findViewById(R.id.status).setVisibility(View.GONE); findViewById(R.id.fragmentContainer).setPadding(0, 0, 0, 0); } - + private void showStatusBar() { findViewById(R.id.status).setVisibility(View.VISIBLE); if (statusFragment != null && !statusFragment.isVisible()) { - // Hack to ensure statusFragment is visible after coming back to dialer from chat + // Hack to ensure statusFragment is visible after coming back to + // dialer from chat statusFragment.getView().setVisibility(View.VISIBLE); } - findViewById(R.id.fragmentContainer).setPadding(0, LinphoneUtils.pixelsToDpi(getResources(), 40), 0, 0); + findViewById(R.id.fragmentContainer).setPadding(0, + LinphoneUtils.pixelsToDpi(getResources(), 40), 0, 0); } - - private void changeCurrentFragment(FragmentsAvailable newFragmentType, Bundle extras) { + + private void changeCurrentFragment(FragmentsAvailable newFragmentType, + Bundle extras) { changeCurrentFragment(newFragmentType, extras, false); } - + @SuppressWarnings("incomplete-switch") - private void changeCurrentFragment(FragmentsAvailable newFragmentType, Bundle extras, boolean withoutAnimation) { - if (newFragmentType == currentFragment && newFragmentType != FragmentsAvailable.CHAT) { + private void changeCurrentFragment(FragmentsAvailable newFragmentType, + Bundle extras, boolean withoutAnimation) { + if (newFragmentType == currentFragment + && newFragmentType != FragmentsAvailable.CHAT) { return; } nextFragment = newFragmentType; - + if (currentFragment == FragmentsAvailable.DIALER) { try { - dialerSavedState = getSupportFragmentManager().saveFragmentInstanceState(dialerFragment); - } catch (Exception e) {} + dialerSavedState = getSupportFragmentManager() + .saveFragmentInstanceState(dialerFragment); + } catch (Exception e) { + } } - + Fragment newFragment = null; - + switch (newFragmentType) { case HISTORY: if (getResources().getBoolean(R.bool.use_simple_history)) { @@ -281,31 +303,37 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene messageListFragment = new Fragment(); break; } - + if (newFragment != null) { newFragment.setArguments(extras); if (Version.isXLargeScreen(this)) { - changeFragmentForTablets(newFragment, newFragmentType, withoutAnimation); + changeFragmentForTablets(newFragment, newFragmentType, + withoutAnimation); } else { changeFragment(newFragment, newFragmentType, withoutAnimation); } } } - + private void updateAnimationsState() { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - isAnimationDisabled = getResources().getBoolean(R.bool.disable_animations) || !prefs.getBoolean(getString(R.string.pref_animation_enable_key), false); - isContactPresenceDisabled = !getResources().getBoolean(R.bool.enable_linphone_friends); + SharedPreferences prefs = PreferenceManager + .getDefaultSharedPreferences(this); + isAnimationDisabled = getResources().getBoolean( + R.bool.disable_animations) + || !prefs.getBoolean( + getString(R.string.pref_animation_enable_key), false); + isContactPresenceDisabled = !getResources().getBoolean( + R.bool.enable_linphone_friends); } - + public boolean isAnimationDisabled() { return isAnimationDisabled; } - + public boolean isContactPresenceDisabled() { return isContactPresenceDisabled; } - + private void changeFragment(Fragment newFragment, FragmentsAvailable newFragmentType, boolean withoutAnimation) { if (getResources().getBoolean(R.bool.show_statusbar_only_on_dialer)) { if (newFragmentType == FragmentsAvailable.DIALER) { @@ -317,38 +345,48 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene if (statusFragment != null) { statusFragment.closeStatusBar(); } - - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - if (!withoutAnimation && !isAnimationDisabled && currentFragment.shouldAnimate()) { + FragmentTransaction transaction = getSupportFragmentManager() + .beginTransaction(); + + if (!withoutAnimation && !isAnimationDisabled + && currentFragment.shouldAnimate()) { if (newFragmentType.isRightOf(currentFragment)) { - transaction.setCustomAnimations(R.anim.slide_in_right_to_left, R.anim.slide_out_right_to_left, R.anim.slide_in_left_to_right, R.anim.slide_out_left_to_right); + transaction.setCustomAnimations(R.anim.slide_in_right_to_left, + R.anim.slide_out_right_to_left, + R.anim.slide_in_left_to_right, + R.anim.slide_out_left_to_right); } else { - transaction.setCustomAnimations(R.anim.slide_in_left_to_right, R.anim.slide_out_left_to_right, R.anim.slide_in_right_to_left, R.anim.slide_out_right_to_left); + transaction.setCustomAnimations(R.anim.slide_in_left_to_right, + R.anim.slide_out_left_to_right, + R.anim.slide_in_right_to_left, + R.anim.slide_out_right_to_left); } } try { - getSupportFragmentManager().popBackStackImmediate(newFragmentType.toString(), FragmentManager.POP_BACK_STACK_INCLUSIVE); + getSupportFragmentManager().popBackStackImmediate( + newFragmentType.toString(), + FragmentManager.POP_BACK_STACK_INCLUSIVE); } catch (java.lang.IllegalStateException e) { - + } - + transaction.addToBackStack(newFragmentType.toString()); transaction.replace(R.id.fragmentContainer, newFragment); transaction.commitAllowingStateLoss(); getSupportFragmentManager().executePendingTransactions(); - + currentFragment = newFragmentType; } - + private void changeFragmentForTablets(Fragment newFragment, FragmentsAvailable newFragmentType, boolean withoutAnimation) { - if (getResources().getBoolean(R.bool.show_statusbar_only_on_dialer)) { - if (newFragmentType == FragmentsAvailable.DIALER) { - showStatusBar(); - } else { - hideStatusBar(); - } - } +// if (getResources().getBoolean(R.bool.show_statusbar_only_on_dialer)) { +// if (newFragmentType == FragmentsAvailable.DIALER) { +// showStatusBar(); +// } else { +// hideStatusBar(); +// } +// } if (statusFragment != null) { statusFragment.closeStatusBar(); } @@ -363,6 +401,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene transaction.replace(R.id.fragmentContainer2, newFragment); } else { if (newFragmentType == FragmentsAvailable.DIALER + || newFragmentType == FragmentsAvailable.ABOUT || newFragmentType == FragmentsAvailable.ABOUT_INSTEAD_OF_CHAT || newFragmentType == FragmentsAvailable.ABOUT_INSTEAD_OF_SETTINGS || newFragmentType == FragmentsAvailable.SETTINGS || newFragmentType == FragmentsAvailable.ACCOUNT_SETTINGS) { ll.setVisibility(View.GONE); @@ -392,14 +431,16 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene currentFragment = newFragmentType; } - + public void displayHistoryDetail(String sipUri, LinphoneCallLog log) { - LinphoneAddress lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri); - Uri uri = LinphoneUtils.findUriPictureOfContactAndSetDisplayName(lAddress, getContentResolver()); - + LinphoneAddress lAddress = LinphoneCoreFactory.instance() + .createLinphoneAddress(sipUri); + Uri uri = LinphoneUtils.findUriPictureOfContactAndSetDisplayName( + lAddress, getContentResolver()); + String displayName = lAddress.getDisplayName(); String pictureUri = uri == null ? null : uri.toString(); - + String status; if (log.getDirection() == CallDirection.Outgoing) { status = "Outgoing"; @@ -410,15 +451,18 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene status = "Incoming"; } } - + String callTime = secondsToDisplayableString(log.getCallDuration()); String callDate = log.getStartDate(); - - Fragment fragment2 = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer2); - if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.HISTORY_DETAIL) { + + Fragment fragment2 = getSupportFragmentManager().findFragmentById( + R.id.fragmentContainer2); + if (fragment2 != null && fragment2.isVisible() + && currentFragment == FragmentsAvailable.HISTORY_DETAIL) { HistoryDetailFragment historyDetailFragment = (HistoryDetailFragment) fragment2; - historyDetailFragment.changeDisplayedHistory(sipUri, displayName, pictureUri, status, callTime, callDate); - } else { + historyDetailFragment.changeDisplayedHistory(sipUri, displayName, + pictureUri, status, callTime, callDate); + } else { Bundle extras = new Bundle(); extras.putString("SipUri", sipUri); if (displayName != null) { @@ -428,68 +472,76 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene extras.putString("CallStatus", status); extras.putString("CallTime", callTime); extras.putString("CallDate", callDate); - + changeCurrentFragment(FragmentsAvailable.HISTORY_DETAIL, extras); } } - + private String secondsToDisplayableString(int secs) { SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); Calendar cal = Calendar.getInstance(); cal.set(0, 0, 0, 0, 0, secs); return dateFormat.format(cal.getTime()); } - + public void displayContact(Contact contact, boolean chatOnly) { - Fragment fragment2 = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer2); - if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.CONTACT) { + Fragment fragment2 = getSupportFragmentManager().findFragmentById( + R.id.fragmentContainer2); + if (fragment2 != null && fragment2.isVisible() + && currentFragment == FragmentsAvailable.CONTACT) { ContactFragment contactFragment = (ContactFragment) fragment2; contactFragment.changeDisplayedContact(contact); - } else { + } else { Bundle extras = new Bundle(); extras.putSerializable("Contact", contact); extras.putBoolean("ChatAddressOnly", chatOnly); changeCurrentFragment(FragmentsAvailable.CONTACT, extras); } } - + public void displayContacts(boolean chatOnly) { if (chatOnly) { preferLinphoneContacts = true; } - + Bundle extras = new Bundle(); extras.putBoolean("ChatAddressOnly", chatOnly); changeCurrentFragment(FragmentsAvailable.CONTACTS, extras); preferLinphoneContacts = false; } - + public void displayContactsForEdition(String sipAddress) { Bundle extras = new Bundle(); extras.putBoolean("EditOnClick", true); extras.putString("SipAddress", sipAddress); changeCurrentFragment(FragmentsAvailable.CONTACTS, extras); } - + public void displayAbout() { changeCurrentFragment(FragmentsAvailable.ABOUT, null); } - + public void displayChat(String sipUri) { if (getResources().getBoolean(R.bool.disable_chat)) { return; } - - LinphoneAddress lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri); - Uri uri = LinphoneUtils.findUriPictureOfContactAndSetDisplayName(lAddress, getContentResolver()); + + LinphoneAddress lAddress = LinphoneCoreFactory.instance() + .createLinphoneAddress(sipUri); + Uri uri = LinphoneUtils.findUriPictureOfContactAndSetDisplayName( + lAddress, getContentResolver()); String displayName = lAddress.getDisplayName(); String pictureUri = uri == null ? null : uri.toString(); - - if (currentFragment == FragmentsAvailable.CHATLIST || currentFragment == FragmentsAvailable.CHAT) { - Fragment fragment2 = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer2); - if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.CHAT) { + + if (currentFragment == FragmentsAvailable.CHATLIST + || currentFragment == FragmentsAvailable.CHAT) { + Fragment fragment2 = getSupportFragmentManager().findFragmentById( + R.id.fragmentContainer2); + if (fragment2 != null && fragment2.isVisible() + && currentFragment == FragmentsAvailable.CHAT) { ChatFragment chatFragment = (ChatFragment) fragment2; - chatFragment.changeDisplayedChat(sipUri, displayName, pictureUri); + chatFragment.changeDisplayedChat(sipUri, displayName, + pictureUri); } else { Bundle extras = new Bundle(); extras.putString("SipUri", sipUri); @@ -512,43 +564,39 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene public void onClick(View v) { int id = v.getId(); resetSelection(); - + if (id == R.id.history) { changeCurrentFragment(FragmentsAvailable.HISTORY, null); history.setSelected(true); LinphoneManager.getLc().resetMissedCallsCount(); displayMissedCalls(0); - } - else if (id == R.id.contacts) { + } else if (id == R.id.contacts) { changeCurrentFragment(FragmentsAvailable.CONTACTS, null); contacts.setSelected(true); - } - else if (id == R.id.dialer) { + } else if (id == R.id.dialer) { changeCurrentFragment(FragmentsAvailable.DIALER, null); dialer.setSelected(true); - } - else if (id == R.id.settings) { + } else if (id == R.id.settings) { changeCurrentFragment(FragmentsAvailable.SETTINGS, null); settings.setSelected(true); - } - else if (id == R.id.about_chat) { + } else if (id == R.id.about_chat) { Bundle b = new Bundle(); b.putSerializable("About", FragmentsAvailable.ABOUT_INSTEAD_OF_CHAT); changeCurrentFragment(FragmentsAvailable.ABOUT_INSTEAD_OF_CHAT, b); aboutChat.setSelected(true); - } - else if (id == R.id.about_settings) { + } else if (id == R.id.about_settings) { Bundle b = new Bundle(); - b.putSerializable("About", FragmentsAvailable.ABOUT_INSTEAD_OF_SETTINGS); - changeCurrentFragment(FragmentsAvailable.ABOUT_INSTEAD_OF_SETTINGS, b); + b.putSerializable("About", + FragmentsAvailable.ABOUT_INSTEAD_OF_SETTINGS); + changeCurrentFragment(FragmentsAvailable.ABOUT_INSTEAD_OF_SETTINGS, + b); aboutSettings.setSelected(true); - } - else if (id == R.id.chat) { + } else if (id == R.id.chat) { changeCurrentFragment(FragmentsAvailable.CHATLIST, null); chat.setSelected(true); } } - + private void resetSelection() { history.setSelected(false); contacts.setSelected(false); @@ -558,12 +606,12 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene aboutChat.setSelected(false); aboutSettings.setSelected(false); } - + @SuppressWarnings("incomplete-switch") public void selectMenu(FragmentsAvailable menuToSelect) { currentFragment = menuToSelect; resetSelection(); - + switch (menuToSelect) { case HISTORY: case HISTORY_DETAIL: @@ -596,47 +644,53 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene public void updateDialerFragment(DialerFragment fragment) { dialerFragment = fragment; // Hack to maintain soft input flags - getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); + getWindow().setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN + | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); } - + public void updateChatFragment(ChatFragment fragment) { messageListenerFragment = fragment; // Hack to maintain soft input flags - getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); + getWindow().setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE + | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); } - + public void updateChatListFragment(ChatListFragment fragment) { messageListFragment = fragment; } - + public void hideMenu(boolean hide) { menu.setVisibility(hide ? View.GONE : View.VISIBLE); mark.setVisibility(hide ? View.GONE : View.VISIBLE); } - + public void updateStatusFragment(StatusFragment fragment) { statusFragment = fragment; - + if (LinphoneManager.getLc().getDefaultProxyConfig() != null) { - statusFragment.registrationStateChanged(LinphoneManager.getLc().getDefaultProxyConfig().getState()); + statusFragment.registrationStateChanged(LinphoneManager.getLc() + .getDefaultProxyConfig().getState()); } } - + public void displaySettings() { changeCurrentFragment(FragmentsAvailable.SETTINGS, null); settings.setSelected(true); } - + public void applyConfigChangesIfNeeded() { - if (nextFragment != FragmentsAvailable.SETTINGS && nextFragment != FragmentsAvailable.ACCOUNT_SETTINGS) { + if (nextFragment != FragmentsAvailable.SETTINGS + && nextFragment != FragmentsAvailable.ACCOUNT_SETTINGS) { reloadConfig(); updateAnimationsState(); } } - + private void reloadConfig() { LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); - + if (lc != null && (lc.isInComingInvitePending() || lc.isIncall())) { Log.w("Call in progress => settings not applied"); return; @@ -644,24 +698,27 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene try { LinphoneManager.getInstance().initFromConf(); - lc.setVideoPolicy(LinphoneManager.getInstance().isAutoInitiateVideoCalls(), LinphoneManager.getInstance().isAutoAcceptCamera()); + lc.setVideoPolicy(LinphoneManager.getInstance() + .isAutoInitiateVideoCalls(), LinphoneManager.getInstance() + .isAutoAcceptCamera()); } catch (LinphoneException e) { - if (! (e instanceof LinphoneConfigException)) { + if (!(e instanceof LinphoneConfigException)) { Log.e(e, "Cannot update config"); return; } - LinphoneActivity.instance().showPreferenceErrorDialog(e.getMessage()); + LinphoneActivity.instance().showPreferenceErrorDialog( + e.getMessage()); } } - + public void displayAccountSettings(int accountNumber) { Bundle bundle = new Bundle(); bundle.putInt("Account", accountNumber); changeCurrentFragment(FragmentsAvailable.ACCOUNT_SETTINGS, bundle); settings.setSelected(true); } - + public StatusFragment getStatusFragment() { return statusFragment; } @@ -673,40 +730,44 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene public List getDraftChatList() { return getChatStorage().getDrafts(); } - + public List getChatMessages(String correspondent) { return getChatStorage().getMessages(correspondent); } - + public void removeFromChatList(String sipUri) { getChatStorage().removeDiscussion(sipUri); } - + public void removeFromDrafts(String sipUri) { getChatStorage().deleteDraft(sipUri); } - + @Override - public void onMessageReceived(LinphoneAddress from, LinphoneChatMessage message) { + public void onMessageReceived(LinphoneAddress from, + LinphoneChatMessage message) { if (getResources().getBoolean(R.bool.disable_chat)) { return; } - + String textMessage = message.getMessage(); String url = message.getExternalBodyUrl(); String notificationText = null; int id = -1; if (textMessage != null && textMessage.length() > 0) { - id = getChatStorage().saveMessage(from.asStringUriOnly(), "", textMessage); + id = getChatStorage().saveMessage(from.asStringUriOnly(), "", + textMessage); notificationText = textMessage; } else if (url != null && url.length() > 0) { Bitmap bm = ChatFragment.downloadImage(url); id = getChatStorage().saveMessage(from.asStringUriOnly(), "", bm); notificationText = url; } - + ChatFragment chatFragment = ((ChatFragment) messageListenerFragment); - if (messageListenerFragment != null && messageListenerFragment.isVisible() && chatFragment.getSipUri().equals(from.asStringUriOnly())) { + if (messageListenerFragment != null + && messageListenerFragment.isVisible() + && chatFragment.getSipUri().equals(from.asStringUriOnly())) { chatFragment.onMessageReceived(id, from, message); getChatStorage().markMessageAsRead(id); } else if (LinphoneService.isReady()) { @@ -715,28 +776,31 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene ((ChatListFragment) messageListFragment).refresh(); } } - LinphoneUtils.findUriPictureOfContactAndSetDisplayName(from, getContentResolver()); - LinphoneService.instance().displayMessageNotification(from.asStringUriOnly(), from.getDisplayName(), notificationText); + LinphoneUtils.findUriPictureOfContactAndSetDisplayName(from, + getContentResolver()); + LinphoneService.instance() + .displayMessageNotification(from.asStringUriOnly(), + from.getDisplayName(), notificationText); } - + public void updateMissedChatCount() { displayMissedChats(getChatStorage().getUnreadMessageCount()); } - + public int onMessageSent(String to, String message) { getChatStorage().deleteDraft(to); return getChatStorage().saveMessage("", to, message); } - + public int onMessageSent(String to, Bitmap image, String imageURL) { getChatStorage().deleteDraft(to); return getChatStorage().saveMessage("", to, image); } - + public void onMessageStateChanged(String to, String message, int newState) { getChatStorage().updateMessageStatus(to, message, newState); } - + public void onImageMessageStateChanged(String to, int id, int newState) { getChatStorage().updateMessageStatus(to, id, newState); } @@ -747,7 +811,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene statusFragment.registrationStateChanged(state); } } - + private void displayMissedCalls(final int missedCallsCount) { mHandler.post(new Runnable() { @Override @@ -756,7 +820,9 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene missedCalls.setText(missedCallsCount + ""); missedCalls.setVisibility(View.VISIBLE); if (!isAnimationDisabled) { - missedCalls.startAnimation(AnimationUtils.loadAnimation(LinphoneActivity.this, R.anim.bounce)); + missedCalls.startAnimation(AnimationUtils + .loadAnimation(LinphoneActivity.this, + R.anim.bounce)); } } else { missedCalls.clearAnimation(); @@ -765,7 +831,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } }); } - + private void displayMissedChats(final int missedChatCount) { mHandler.post(new Runnable() { @Override @@ -779,7 +845,9 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } missedChats.setVisibility(View.VISIBLE); if (!isAnimationDisabled) { - missedChats.startAnimation(AnimationUtils.loadAnimation(LinphoneActivity.this, R.anim.bounce)); + missedChats.startAnimation(AnimationUtils + .loadAnimation(LinphoneActivity.this, + R.anim.bounce)); } } else { missedChats.clearAnimation(); @@ -790,11 +858,12 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } @Override - public void onCallStateChanged(LinphoneCall call, State state, String message) { + public void onCallStateChanged(LinphoneCall call, State state, + String message) { if (state == State.Error) { displayCustomToast(message, Toast.LENGTH_LONG); } - + if (state == State.IncomingReceived) { startActivity(new Intent(this, IncomingCallActivity.class)); } else if (state == State.OutgoingInit) { @@ -803,24 +872,27 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } else { startIncallActivity(call); } - } else if (state == State.CallEnd || state == State.Error || state == State.CallReleased) { + } else if (state == State.CallEnd || state == State.Error + || state == State.CallReleased) { resetClassicMenuLayoutAndGoBackToCallIfStillRunning(); } - + int missedCalls = LinphoneManager.getLc().getMissedCallsCount(); displayMissedCalls(missedCalls); } - + public void displayCustomToast(final String message, final int duration) { mHandler.post(new Runnable() { @Override public void run() { LayoutInflater inflater = getLayoutInflater(); - View layout = inflater.inflate(R.layout.toast, (ViewGroup) findViewById(R.id.toastRoot)); + View layout = inflater.inflate(R.layout.toast, + (ViewGroup) findViewById(R.id.toastRoot)); - TextView toastText = (TextView) layout.findViewById(R.id.toastMessage); + TextView toastText = (TextView) layout + .findViewById(R.id.toastMessage); toastText.setText(message); - + final Toast toast = new Toast(getApplicationContext()); toast.setGravity(Gravity.CENTER, 0, 0); toast.setDuration(duration); @@ -837,7 +909,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene extras.putString("DisplayName", name); extras.putString("Photo", photo == null ? null : photo.toString()); changeCurrentFragment(FragmentsAvailable.DIALER, extras); - + AddressType address = new AddressText(this, null); address.setDisplayedName(name); address.setText(number); @@ -845,7 +917,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene LinphoneManager.getInstance().newOutgoingCall(address); } } - + public void setAddressAndGoToDialer(String number) { Bundle extras = new Bundle(); extras.putString("SipUri", number); @@ -863,14 +935,14 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene startOrientationSensor(); startActivityForResult(intent, callActivity); } - + public void startIncallActivity(LinphoneCall currentCall) { Intent intent = new Intent(this, InCallActivity.class); intent.putExtra("VideoEnabled", false); startOrientationSensor(); startActivityForResult(intent, callActivity); } - + /** * Register a sensor to track phoneOrientation changes */ @@ -880,13 +952,16 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } mOrientationHelper.enable(); } - + private int mAlwaysChangingPhoneAngle = -1; private AcceptNewFriendDialog acceptNewFriendDialog; - private class LocalOrientationEventListener extends OrientationEventListener { + + private class LocalOrientationEventListener extends + OrientationEventListener { public LocalOrientationEventListener(Context context) { super(context); } + @Override public void onOrientationChanged(final int o) { if (o == OrientationEventListener.ORIENTATION_UNKNOWN) { @@ -894,9 +969,12 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } int degrees = 270; - if (o < 45 || o >315) degrees = 0; - else if (o < 135) degrees = 90; - else if (o < 225) degrees = 180; + if (o < 45 || o > 315) + degrees = 0; + else if (o < 135) + degrees = 90; + else if (o < 225) + degrees = 180; if (mAlwaysChangingPhoneAngle == degrees) { return; @@ -905,11 +983,13 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene Log.d("Phone orientation changed to ", degrees); int rotation = (360 - degrees) % 360; - LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); - if (lc != null){ + LinphoneCore lc = LinphoneManager + .getLcIfManagerNotDestroyedOrNull(); + if (lc != null) { lc.setDeviceRotation(rotation); LinphoneCall currentCall = lc.getCurrentCall(); - if (currentCall != null && currentCall.cameraEnabled() && currentCall.getCurrentParamsCopy().getVideoEnabled()) { + if (currentCall != null && currentCall.cameraEnabled() + && currentCall.getCurrentParamsCopy().getVideoEnabled()) { lc.updateCall(currentCall, null); } } @@ -917,13 +997,13 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } public void showPreferenceErrorDialog(String message) { - + } - + public List getAllContacts() { return contactList; } - + public List getSIPContacts() { return sipContactList; } @@ -931,33 +1011,37 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene public Cursor getAllContactsCursor() { return contactCursor; } - + public Cursor getSIPContactsCursor() { return sipContactCursor; } - + public void setLinphoneContactsPrefered(boolean isPrefered) { preferLinphoneContacts = isPrefered; } - + public boolean isLinphoneContactsPrefered() { return preferLinphoneContacts; } - + private void refreshStatus(OnlineStatus status) { if (LinphoneManager.isInstanciated()) { - LinphoneManager.getLcIfManagerNotDestroyedOrNull().setPresenceInfo(0, "", status); + LinphoneManager.getLcIfManagerNotDestroyedOrNull().setPresenceInfo( + 0, "", status); } } - - public void onNewSubscriptionRequestReceived(LinphoneFriend friend, String sipUri) { + + public void onNewSubscriptionRequestReceived(LinphoneFriend friend, + String sipUri) { if (isContactPresenceDisabled) { return; } - + sipUri = sipUri.replace("<", "").replace(">", ""); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - if (prefs.getBoolean(getString(R.string.pref_auto_accept_friends_key), false)) { + SharedPreferences prefs = PreferenceManager + .getDefaultSharedPreferences(this); + if (prefs.getBoolean(getString(R.string.pref_auto_accept_friends_key), + false)) { Contact contact = findContactWithSipAddress(sipUri); if (contact != null) { friend.enableSubscribes(true); @@ -972,17 +1056,18 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene Contact contact = findContactWithSipAddress(sipUri); if (contact != null) { FragmentManager fm = getSupportFragmentManager(); - acceptNewFriendDialog = new AcceptNewFriendDialog(contact, sipUri); - acceptNewFriendDialog.show(fm, "New Friend Request Dialog"); + acceptNewFriendDialog = new AcceptNewFriendDialog(contact, + sipUri); + acceptNewFriendDialog.show(fm, "New Friend Request Dialog"); } } } - + private Contact findContactWithSipAddress(String sipUri) { if (!sipUri.startsWith("sip:")) { sipUri = "sip:" + sipUri; } - + for (Contact contact : sipContactList) { for (String addr : contact.getNumerosOrAddresses()) { if (addr.equals(sipUri)) { @@ -994,13 +1079,16 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } public void onNotifyPresenceReceived(LinphoneFriend friend) { - if (!isContactPresenceDisabled && currentFragment == FragmentsAvailable.CONTACTS && friendStatusListenerFragment != null) { + if (!isContactPresenceDisabled + && currentFragment == FragmentsAvailable.CONTACTS + && friendStatusListenerFragment != null) { ((ContactsFragment) friendStatusListenerFragment).invalidate(); } } - + public boolean newFriend(Contact contact, String sipUri) { - LinphoneFriend friend = LinphoneCoreFactory.instance().createLinphoneFriend(sipUri); + LinphoneFriend friend = LinphoneCoreFactory.instance() + .createLinphoneFriend(sipUri); friend.enableSubscribes(true); friend.setIncSubscribePolicy(LinphoneFriend.SubscribePolicy.SPAccept); try { @@ -1012,16 +1100,18 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } return false; } - - private void acceptNewFriend(Contact contact, String sipUri, boolean accepted) { + + private void acceptNewFriend(Contact contact, String sipUri, + boolean accepted) { acceptNewFriendDialog.dismissAllowingStateLoss(); if (accepted) { newFriend(contact, sipUri); } } - + public boolean removeFriend(Contact contact, String sipUri) { - LinphoneFriend friend = LinphoneManager.getLc().findFriendByAddress(sipUri); + LinphoneFriend friend = LinphoneManager.getLc().findFriendByAddress( + sipUri); if (friend != null) { friend.enableSubscribes(false); LinphoneManager.getLc().removeFriend(friend); @@ -1030,15 +1120,16 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } return false; } - + private void searchFriendAndAddToContact(Contact contact) { if (contact == null || contact.getNumerosOrAddresses() == null) { return; } - + for (String sipUri : contact.getNumerosOrAddresses()) { if (LinphoneUtils.isSipAddress(sipUri)) { - LinphoneFriend friend = LinphoneManager.getLc().findFriendByAddress(sipUri); + LinphoneFriend friend = LinphoneManager.getLc() + .findFriendByAddress(sipUri); if (friend != null) { friend.enableSubscribes(true); friend.setIncSubscribePolicy(LinphoneFriend.SubscribePolicy.SPAccept); @@ -1048,7 +1139,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } } } - + private synchronized void prepareContactsInBackground() { if (contactCursor != null) { contactCursor.close(); @@ -1056,15 +1147,17 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene if (sipContactCursor != null) { sipContactCursor.close(); } - + contactCursor = Compatibility.getContactsCursor(getContentResolver()); - sipContactCursor = Compatibility.getSIPContactsCursor(getContentResolver()); - + sipContactCursor = Compatibility + .getSIPContactsCursor(getContentResolver()); + Thread sipContactsHandler = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < sipContactCursor.getCount(); i++) { - Contact contact = Compatibility.getContact(getContentResolver(), sipContactCursor, i); + Contact contact = Compatibility.getContact( + getContentResolver(), sipContactCursor, i); contact.refresh(getContentResolver()); if (!isContactPresenceDisabled) { searchFriendAndAddToContact(contact); @@ -1072,7 +1165,8 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene sipContactList.add(contact); } for (int i = 0; i < contactCursor.getCount(); i++) { - Contact contact = Compatibility.getContact(getContentResolver(), contactCursor, i); + Contact contact = Compatibility.getContact( + getContentResolver(), contactCursor, i); for (Contact c : sipContactList) { if (c.getID().equals(contact.getID())) { contact = c; @@ -1084,18 +1178,18 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } }); sipContactsHandler.start(); - + contactList = new ArrayList(); sipContactList = new ArrayList(); } - + private void initInCallMenuLayout(boolean callTransfer) { selectMenu(FragmentsAvailable.DIALER); if (dialerFragment != null) { ((DialerFragment) dialerFragment).resetLayout(callTransfer); } } - + public void resetClassicMenuLayoutAndGoBackToCallIfStillRunning() { mHandler.post(new Runnable() { @Override @@ -1103,8 +1197,9 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene if (dialerFragment != null) { ((DialerFragment) dialerFragment).resetLayout(false); } - - if (LinphoneManager.isInstanciated() && LinphoneManager.getLc().getCallsNb() > 0) { + + if (LinphoneManager.isInstanciated() + && LinphoneManager.getLc().getCallsNb() > 0) { LinphoneCall call = LinphoneManager.getLc().getCalls()[0]; if (call.getCurrentParamsCopy().getVideoEnabled()) { startVideoActivity(call); @@ -1115,64 +1210,66 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } }); } - + public FragmentsAvailable getCurrentFragment() { return currentFragment; } - + public ChatStorage getChatStorage() { if (chatStorage == null) { chatStorage = new ChatStorage(this); } return chatStorage; } - + public void exit() { - refreshStatus(OnlineStatus.Offline); + refreshStatus(OnlineStatus.Offline); finish(); - stopService(new Intent(ACTION_MAIN).setClass(this, LinphoneService.class)); + stopService(new Intent(ACTION_MAIN).setClass(this, + LinphoneService.class)); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == Activity.RESULT_FIRST_USER && requestCode == SETTINGS_ACTIVITY) { + if (resultCode == Activity.RESULT_FIRST_USER + && requestCode == SETTINGS_ACTIVITY) { if (data.getExtras().getBoolean("Exit", false)) { exit(); } else { - FragmentsAvailable newFragment = (FragmentsAvailable) data.getExtras().getSerializable("FragmentToDisplay"); + FragmentsAvailable newFragment = (FragmentsAvailable) data + .getExtras().getSerializable("FragmentToDisplay"); changeCurrentFragment(newFragment, null, true); selectMenu(newFragment); } - } - else if (requestCode == callActivity) { - boolean callTransfer = data == null ? false : data.getBooleanExtra("Transfer", false); + } else if (requestCode == callActivity) { + boolean callTransfer = data == null ? false : data.getBooleanExtra( + "Transfer", false); if (LinphoneManager.getLc().getCallsNb() > 0) { - initInCallMenuLayout(callTransfer); + initInCallMenuLayout(callTransfer); } else { resetClassicMenuLayoutAndGoBackToCallIfStillRunning(); } - } - else { + } else { super.onActivityResult(requestCode, resultCode, data); } } - + @Override - protected void onResume() { + protected void onResume() { super.onResume(); - - LinphoneManager.addListener(this); - - prepareContactsInBackground(); - + + LinphoneManager.addListener(this); + + prepareContactsInBackground(); + if (chatStorage != null) { chatStorage.close(); } chatStorage = new ChatStorage(this); - + updateMissedChatCount(); displayMissedCalls(LinphoneManager.getLc().getMissedCallsCount()); - + if (LinphoneManager.getLc().getCalls().length > 0) { LinphoneCall call = LinphoneManager.getLc().getCalls()[0]; LinphoneCall.State callState = call.getState(); @@ -1180,60 +1277,59 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene startActivity(new Intent(this, IncomingCallActivity.class)); } } - - refreshStatus(OnlineStatus.Online); + + refreshStatus(OnlineStatus.Online); } - + @Override protected void onPause() { super.onPause(); - refreshStatus(OnlineStatus.Away); + refreshStatus(OnlineStatus.Away); } - + @Override protected void onDestroy() { LinphoneManager.removeListener(this); - + if (chatStorage != null) { chatStorage.close(); chatStorage = null; } - + if (mOrientationHelper != null) { mOrientationHelper.disable(); mOrientationHelper = null; } - + instance = null; super.onDestroy(); - + unbindDrawables(findViewById(R.id.topLayout)); - System.gc(); + System.gc(); } - + private void unbindDrawables(View view) { - if (view != null && view.getBackground() != null) { - view.getBackground().setCallback(null); - } - if (view instanceof ViewGroup && !(view instanceof AdapterView)) { - for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { - unbindDrawables(((ViewGroup) view).getChildAt(i)); - } - ((ViewGroup) view).removeAllViews(); - } + if (view != null && view.getBackground() != null) { + view.getBackground().setCallback(null); + } + if (view instanceof ViewGroup && !(view instanceof AdapterView)) { + for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { + unbindDrawables(((ViewGroup) view).getChildAt(i)); + } + ((ViewGroup) view).removeAllViews(); + } } - + @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - + Bundle extras = intent.getExtras(); if (extras != null && extras.getBoolean("GoToChat", false)) { LinphoneService.instance().removeMessageNotification(); String sipUri = extras.getString("ChatContactSipUri"); displayChat(sipUri); - } - else if (extras != null && extras.getBoolean("Notification", false)) { + } else if (extras != null && extras.getBoolean("Notification", false)) { if (LinphoneManager.getLc().getCallsNb() > 0) { LinphoneCall call = LinphoneManager.getLc().getCalls()[0]; if (call.getCurrentParamsCopy().getVideoEnabled()) { @@ -1242,14 +1338,14 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene startIncallActivity(call); } } - } - else { + } else { if (dialerFragment != null) { ((DialerFragment) dialerFragment).newOutgoingCall(intent); } if (LinphoneManager.getLc().getCalls().length > 0) { LinphoneCall call = LinphoneManager.getLc().getCalls()[0]; - if (call != null && call.getState() != LinphoneCall.State.IncomingReceived) { + if (call != null + && call.getState() != LinphoneCall.State.IncomingReceived) { if (call.getCurrentParamsCopy().getVideoEnabled()) { startVideoActivity(call); } else { @@ -1259,7 +1355,7 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } } } - + public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (currentFragment == FragmentsAvailable.DIALER) { @@ -1267,11 +1363,12 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene return true; } } else { - int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount(); + int backStackEntryCount = getSupportFragmentManager() + .getBackStackEntryCount(); if (backStackEntryCount <= 1) { showStatusBar(); } - + if (currentFragment == FragmentsAvailable.SETTINGS) { showStatusBar(); reloadConfig(); @@ -1285,44 +1382,47 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } return super.onKeyDown(keyCode, event); } - + class AcceptNewFriendDialog extends DialogFragment { private Contact contact; private String sipUri; - - public AcceptNewFriendDialog(Contact c, String a) { - contact = c; - sipUri = a; - } - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.new_friend_request_dialog, container); + public AcceptNewFriendDialog(Contact c, String a) { + contact = c; + sipUri = a; + } - getDialog().setTitle(R.string.linphone_friend_new_request_title); - - Button yes = (Button) view.findViewById(R.id.yes); - yes.setOnClickListener(new OnClickListener() { + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.new_friend_request_dialog, + container); + + getDialog().setTitle(R.string.linphone_friend_new_request_title); + + Button yes = (Button) view.findViewById(R.id.yes); + yes.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - acceptNewFriend(contact, sipUri, true); + acceptNewFriend(contact, sipUri, true); } }); - - Button no = (Button) view.findViewById(R.id.no); - no.setOnClickListener(new OnClickListener() { + + Button no = (Button) view.findViewById(R.id.no); + no.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { acceptNewFriend(contact, sipUri, false); } }); - - return view; - } + + return view; + } } } interface ContactPicked { void setAddresGoToDialerAndCall(String number, String name, Uri photo); + void goToDialer(); } \ No newline at end of file diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index 4ace9e132..d8ebf7b26 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -509,7 +509,8 @@ public final class LinphoneService extends Service implements LinphoneServiceLis if (state == RegistrationState.RegistrationOk && LinphoneManager.getLc().getDefaultProxyConfig() != null && LinphoneManager.getLc().getDefaultProxyConfig().isRegistered()) { sendNotification(IC_LEVEL_ORANGE, R.string.notification_registered); } - else { + + if (state == RegistrationState.RegistrationFailed || state == RegistrationState.RegistrationCleared) { sendNotification(IC_LEVEL_OFFLINE, R.string.notification_register_failure); }