Tablet dialer layout + using fragments to fill empty space on tablet

This commit is contained in:
Sylvain Berfini 2012-08-01 10:46:33 +02:00
parent 8e4a40e6e9
commit 84e6d1b5aa
8 changed files with 211 additions and 114 deletions

View file

@ -64,7 +64,7 @@
<activity android:name="org.linphone.IncomingCallActivity"
android:theme="@android:style/Theme.NoTitleBar"
android:launchMode="singleTop"
android:screenOrientation="portrait">
android:screenOrientation="behind">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
@ -81,12 +81,12 @@
<activity android:name=".AccountPreferencesActivity"
android:theme="@android:style/Theme.NoTitleBar"
android:screenOrientation="portrait">
android:screenOrientation="behind">
</activity>
<activity android:name=".PreferencesActivity"
android:theme="@android:style/Theme.NoTitleBar"
android:screenOrientation="portrait">
android:screenOrientation="behind">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
@ -94,7 +94,7 @@
<activity android:name=".setup.SetupActivity"
android:theme="@android:style/Theme.NoTitleBar"
android:screenOrientation="portrait">
android:screenOrientation="behind">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>

View file

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res/org.linphone">
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/addressbar"
@ -34,38 +34,81 @@
</RelativeLayout>
<org.linphone.ui.Numpad
android:id="@+id/Dialer"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/addressbar"
android:background="@drawable/background"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true">
<ImageView
android:contentDescription="@string/content_description_add_contact"
android:id="@+id/addContact"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/add_contact" />
<View
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0.5" />
<org.linphone.ui.CallButton
android:id="@+id/Call"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/call" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.5">
<org.linphone.ui.Numpad
android:id="@+id/Dialer"
android:background="@drawable/background_alt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.7" />
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.3" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:gravity="right">
<View
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0.15" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0.85">
<ImageView
android:id="@+id/addContact"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:adjustViewBounds="true"
android:contentDescription="@string/content_description_add_contact"
android:scaleType="fitXY"
android:src="@drawable/add_contact" />
<org.linphone.ui.CallButton
android:id="@+id/Call"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:layout_weight="1"
android:scaleType="fitXY"
android:src="@drawable/call" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>

View file

@ -48,8 +48,11 @@ import android.widget.TextView;
*/
public class ChatFragment extends Fragment implements OnClickListener, LinphoneOnMessageReceivedListener {
private LinphoneChatRoom chatRoom;
private View view;
private String sipUri;
private EditText message;
private TextView contactName;
private AvatarWithShadow contactPicture;
private RelativeLayout messagesLayout;
private ScrollView messagesScrollView;
private int previousMessageID;
@ -59,41 +62,22 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneO
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
sipUri = getArguments().getString("SipUri");
String name = getArguments().getString("DisplayName");
String displayName = getArguments().getString("DisplayName");
String pictureUri = getArguments().getString("PictureUri");
View view = inflater.inflate(R.layout.chat, container, false);
view = inflater.inflate(R.layout.chat, container, false);
TextView contactName = (TextView) view.findViewById(R.id.contactName);
if (name == null && getResources().getBoolean(R.bool.only_display_username_if_unknown) && LinphoneUtils.isSipAddress(sipUri)) {
contactName.setText(LinphoneUtils.getUsernameFromAddress(sipUri));
} else if (name == null) {
contactName.setText(sipUri);
}
else {
contactName.setText(name);
}
AvatarWithShadow contactPicture = (AvatarWithShadow) view.findViewById(R.id.contactPicture);
if (pictureUri != null) {
LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(), Uri.parse(pictureUri), R.drawable.unknown_small);
}
contactName = (TextView) view.findViewById(R.id.contactName);
contactPicture = (AvatarWithShadow) view.findViewById(R.id.contactPicture);
ImageView sendMessage = (ImageView) view.findViewById(R.id.sendMessage);
sendMessage.setOnClickListener(this);
message = (EditText) view.findViewById(R.id.message);
messagesLayout = (RelativeLayout) view.findViewById(R.id.messages);
messagesScrollView = (ScrollView) view.findViewById(R.id.chatScrollView);
messagesScrollView.post(new Runnable() {
@Override
public void run() {
scrollToEnd();
}
});
invalidate();
displayChat(displayName, pictureUri);
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null)
@ -117,6 +101,30 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneO
scrollToEnd();
}
private void displayChat(String displayName, String pictureUri) {
if (displayName == null && getResources().getBoolean(R.bool.only_display_username_if_unknown) && LinphoneUtils.isSipAddress(sipUri)) {
contactName.setText(LinphoneUtils.getUsernameFromAddress(sipUri));
} else if (displayName == null) {
contactName.setText(sipUri);
}
else {
contactName.setText(displayName);
}
if (pictureUri != null) {
LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(), Uri.parse(pictureUri), R.drawable.unknown_small);
}
messagesScrollView.post(new Runnable() {
@Override
public void run() {
scrollToEnd();
}
});
invalidate();
}
private void displayMessage(final int id, final String message, final String time, final boolean isIncoming, final RelativeLayout layout) {
mHandler.post(new Runnable() {
@Override
@ -128,6 +136,11 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneO
}
});
}
public void changeDisplayedChat(String sipUri, String displayName, String pictureUri) {
this.sipUri = sipUri;
displayChat(displayName, pictureUri);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {

View file

@ -40,9 +40,22 @@ import android.widget.TextView;
public class ContactFragment extends Fragment implements OnClickListener {
private Contact contact;
private ImageView back, editContact, newContact;
private OnClickListener dialListener, chatListener;
private LayoutInflater inflater;
private View view;
private OnClickListener dialListener = new OnClickListener() {
@Override
public void onClick(View v) {
LinphoneActivity.instance().setAddresGoToDialerAndCall(v.getTag().toString(), contact.getName(), contact.getPhotoUri());
}
};
private OnClickListener chatListener = new OnClickListener() {
@Override
public void onClick(View v) {
LinphoneActivity.instance().displayChat(v.getTag().toString());
}
};
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
@ -58,19 +71,22 @@ public class ContactFragment extends Fragment implements OnClickListener {
newContact = (ImageView) view.findViewById(R.id.newContact);
newContact.setOnClickListener(this);
chatListener = getChatListener();
dialListener = getDialListener();
return view;
}
public void changeDisplayedContact(Contact newContact) {
contact = newContact;
contact.refresh(getActivity().getContentResolver());
displayContact(inflater, view);
}
private void displayContact(LayoutInflater inflater, View view) {
AvatarWithShadow contactPicture = (AvatarWithShadow) view.findViewById(R.id.contactPicture);
if (contact.getPhotoUri() != null) {
InputStream input = Compatibility.getContactPictureInputStream(getActivity().getContentResolver(), contact.getID());
contactPicture.setImageBitmap(BitmapFactory.decodeStream(input));
} else {
contactPicture.setBackgroundResource(R.drawable.unknown_small);
contactPicture.setImageResource(R.drawable.unknown_small);
}
TextView contactName = (TextView) view.findViewById(R.id.contactName);
@ -107,24 +123,6 @@ public class ContactFragment extends Fragment implements OnClickListener {
displayContact(inflater, view);
}
public OnClickListener getDialListener() {
return new OnClickListener() {
@Override
public void onClick(View v) {
LinphoneActivity.instance().setAddresGoToDialerAndCall(v.getTag().toString(), contact.getName(), contact.getPhotoUri());
}
};
}
public OnClickListener getChatListener() {
return new OnClickListener() {
@Override
public void onClick(View v) {
LinphoneActivity.instance().displayChat(v.getTag().toString());
}
};
}
@Override
public void onClick(View v) {
int id = v.getId();

View file

@ -37,6 +37,7 @@ import android.widget.TextView;
public class HistoryDetailFragment extends Fragment implements OnClickListener {
private ImageView dialBack, chat, addToContacts;
private AvatarWithShadow contactPicture;
private View view;
private TextView contactName, callDirection, time, date, dialBackUri;
private String sipUri, displayName, pictureUri;
@ -50,12 +51,9 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
String callTime = getArguments().getString("CallTime");
String callDate = getArguments().getString("CallDate");
View view = inflater.inflate(R.layout.history_detail, container, false);
view = inflater.inflate(R.layout.history_detail, container, false);
contactPicture = (AvatarWithShadow) view.findViewById(R.id.contactPicture);
if (pictureUri != null) {
LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(), Uri.parse(pictureUri), R.drawable.unknown_small);
}
dialBack = (ImageView) view.findViewById(R.id.dialBack);
dialBack.setOnClickListener(this);
@ -70,23 +68,42 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener {
if (displayName == null && getResources().getBoolean(R.bool.only_display_username_if_unknown) && LinphoneUtils.isSipAddress(sipUri)) {
displayName = LinphoneUtils.getUsernameFromAddress(sipUri);
}
contactName.setText(displayName == null ? sipUri : displayName);
dialBackUri = (TextView) view.findViewById(R.id.dialBackUri);
dialBackUri.setText(sipUri);
callDirection = (TextView) view.findViewById(R.id.callDirection);
callDirection.setText(status);
time = (TextView) view.findViewById(R.id.time);
time.setText(callTime == null ? "" : callTime);
date = (TextView) view.findViewById(R.id.date);
date.setText(callDate == null ? "" : callDate);
displayHistory(status, callTime, callDate);
return view;
}
private void displayHistory(String status, String callTime, String callDate) {
if (pictureUri != null) {
LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture.getView(), Uri.parse(pictureUri), R.drawable.unknown_small);
}
contactName.setText(displayName == null ? sipUri : displayName);
dialBackUri.setText(sipUri);
callDirection.setText(status);
time.setText(callTime == null ? "" : callTime);
date.setText(callDate == null ? "" : callDate);
}
public void changeDisplayedHistory(String sipUri, String displayName, String pictureUri, String status, String callTime, String callDate) {
if (displayName == null && getResources().getBoolean(R.bool.only_display_username_if_unknown) && LinphoneUtils.isSipAddress(sipUri)) {
displayName = LinphoneUtils.getUsernameFromAddress(sipUri);
}
this.sipUri = sipUri;
this.displayName = displayName;
this.pictureUri = pictureUri;
displayHistory(status, callTime, callDate);
}
@Override
public void onResume() {
super.onResume();

View file

@ -45,7 +45,6 @@ import org.linphone.ui.AddressText;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
@ -281,16 +280,11 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
}
public void displayHistoryDetail(String sipUri, LinphoneCallLog log) {
//TODO Update current fragment if already visible (tablets)
LinphoneAddress lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri);
Uri uri = LinphoneUtils.findUriPictureOfContactAndSetDisplayName(lAddress, getContentResolver());
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
if (lAddress.getDisplayName() != null) {
extras.putString("DisplayName", lAddress.getDisplayName());
extras.putString("PictureUri", uri.toString());
}
String displayName = lAddress.getDisplayName();
String pictureUri = uri == null ? null : uri.toString();
String status;
if (log.getDirection() == CallDirection.Outgoing) {
@ -302,11 +296,27 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
status = "Incoming";
}
}
extras.putString("CallStatus", status);
extras.putString("CallTime", secondsToDisplayableString(log.getCallDuration()));
extras.putString("CallDate", log.getStartDate());
changeCurrentFragment(FragmentsAvailable.HISTORY_DETAIL, extras);
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) {
HistoryDetailFragment historyDetailFragment = (HistoryDetailFragment) fragment2;
historyDetailFragment.changeDisplayedHistory(sipUri, displayName, pictureUri, status, callTime, callDate);
} else {
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
if (displayName != null) {
extras.putString("DisplayName", displayName);
extras.putString("PictureUri", pictureUri);
}
extras.putString("CallStatus", status);
extras.putString("CallTime", callTime);
extras.putString("CallDate", callDate);
changeCurrentFragment(FragmentsAvailable.HISTORY_DETAIL, extras);
}
}
private String secondsToDisplayableString(int secs) {
@ -317,10 +327,15 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
}
public void displayContact(Contact contact) {
//TODO Update current fragment if already visible (tablets)
Bundle extras = new Bundle();
extras.putSerializable("Contact", contact);
changeCurrentFragment(FragmentsAvailable.CONTACT, extras);
Fragment fragment2 = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer2);
if (fragment2 != null && fragment2.isVisible() && currentFragment == FragmentsAvailable.CONTACT) {
ContactFragment contactFragment = (ContactFragment) fragment2;
contactFragment.changeDisplayedContact(contact);
} else {
Bundle extras = new Bundle();
extras.putSerializable("Contact", contact);
changeCurrentFragment(FragmentsAvailable.CONTACT, extras);
}
}
public void displayContacts() {
@ -328,20 +343,31 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene
}
public void displayChat(String sipUri) {
//TODO Update current fragment if already visible (tablets)
LinphoneAddress lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri);
Uri uri = LinphoneUtils.findUriPictureOfContactAndSetDisplayName(lAddress, getContentResolver());
String displayName = lAddress.getDisplayName();
String pictureUri = uri == null ? null : uri.toString();
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
if (lAddress.getDisplayName() != null) {
extras.putString("DisplayName", lAddress.getDisplayName());
extras.putString("PictureUri", uri.toString());
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);
} else {
Bundle extras = new Bundle();
extras.putString("SipUri", sipUri);
if (lAddress.getDisplayName() != null) {
extras.putString("DisplayName", displayName);
extras.putString("PictureUri", pictureUri);
}
changeCurrentFragment(FragmentsAvailable.CHAT, extras);
}
} else {
changeCurrentFragment(FragmentsAvailable.CHATLIST, null);
displayChat(sipUri);
}
LinphoneService.instance().resetMessageNotifCount();
LinphoneService.instance().removeMessageNotification();
changeCurrentFragment(FragmentsAvailable.CHAT, extras);
displayMissedChats(getChatStorage().getUnreadMessageCount());
}

View file

@ -54,7 +54,7 @@ public class AvatarWithShadow extends LinearLayout {
contactPicture.setImageBitmap(bitmap);
}
public void setBackgroundResource(int res) {
contactPicture.setBackgroundResource(res);
public void setImageResource(int res) {
contactPicture.setImageResource(res);
}
}