UI code refactoring

This commit is contained in:
iNPUTmice 2014-11-07 15:38:20 +01:00
parent e42b6d715b
commit e45d7bda38
3 changed files with 177 additions and 258 deletions

View file

@ -15,6 +15,7 @@ import android.os.SystemClock;
import android.provider.MediaStore;
import android.support.v4.widget.SlidingPaneLayout;
import android.support.v4.widget.SlidingPaneLayout.PanelSlideListener;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
@ -31,6 +32,7 @@ import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation;
@ -72,8 +74,8 @@ public class ConversationActivity extends XmppActivity implements
private List<Conversation> conversationList = new ArrayList<Conversation>();
private Conversation selectedConversation = null;
private ListView listView;
private ConversationFragment mConversationFragment;
private boolean paneShouldBeOpen = true;
private ArrayAdapter<Conversation> listAdapter;
private Toast prepareImageToast;
@ -95,10 +97,6 @@ public class ConversationActivity extends XmppActivity implements
return this.listView;
}
public boolean shouldPaneBeOpen() {
return paneShouldBeOpen;
}
public void showConversationsOverview() {
if (mContentView instanceof SlidingPaneLayout) {
SlidingPaneLayout mSlidingPaneLayout = (SlidingPaneLayout) mContentView;
@ -143,10 +141,14 @@ public class ConversationActivity extends XmppActivity implements
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(Config.LOGTAG, "on create");
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
Log.d(Config.LOGTAG, savedInstanceState.toString());
mOpenConverstaion = savedInstanceState.getString(
STATE_OPEN_CONVERSATION, null);
Log.d(Config.LOGTAG, "recovered " + mOpenConverstaion);
mPanelOpen = savedInstanceState.getBoolean(STATE_PANEL_OPEN, true);
String pending = savedInstanceState.getString(STATE_PENDING_URI, null);
if (pending != null) {
@ -156,6 +158,11 @@ public class ConversationActivity extends XmppActivity implements
setContentView(R.layout.fragment_conversations_overview);
this.mConversationFragment = new ConversationFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.selected_conversation, this.mConversationFragment, "conversation");
transaction.commit();
listView = (ListView) findViewById(R.id.list);
getActionBar().setDisplayHomeAsUpEnabled(false);
@ -168,13 +175,11 @@ public class ConversationActivity extends XmppActivity implements
@Override
public void onItemClick(AdapterView<?> arg0, View clickedView,
int position, long arg3) {
paneShouldBeOpen = false;
if (getSelectedConversation() != conversationList.get(position)) {
setSelectedConversation(conversationList.get(position));
swapConversationFragment();
} else {
hideConversationsOverview();
ConversationActivity.this.mConversationFragment.reInit(getSelectedConversation());
}
hideConversationsOverview();
}
});
mContentView = findViewById(R.id.content_view_spl);
@ -191,7 +196,6 @@ public class ConversationActivity extends XmppActivity implements
@Override
public void onPanelOpened(View arg0) {
paneShouldBeOpen = true;
ActionBar ab = getActionBar();
if (ab != null) {
ab.setDisplayHomeAsUpEnabled(false);
@ -209,7 +213,6 @@ public class ConversationActivity extends XmppActivity implements
@Override
public void onPanelClosed(View arg0) {
paneShouldBeOpen = false;
if ((conversationList.size() > 0)
&& (getSelectedConversation() != null)) {
openConversation(getSelectedConversation());
@ -436,7 +439,6 @@ public class ConversationActivity extends XmppActivity implements
public void endConversation(Conversation conversation) {
conversation.setStatus(Conversation.STATUS_ARCHIVED);
paneShouldBeOpen = true;
showConversationsOverview();
xmppConnectionService.archiveConversation(conversation);
if (conversationList.size() > 0) {
@ -608,23 +610,6 @@ public class ConversationActivity extends XmppActivity implements
builder.create().show();
}
protected ConversationFragment swapConversationFragment() {
ConversationFragment selectedFragment = new ConversationFragment();
if (!isFinishing()) {
FragmentTransaction transaction = getFragmentManager()
.beginTransaction();
transaction.replace(R.id.selected_conversation, selectedFragment,
"conversation");
try {
transaction.commitAllowingStateLoss();
} catch (IllegalStateException e) {
return selectedFragment;
}
}
return selectedFragment;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
@ -674,6 +659,7 @@ public class ConversationActivity extends XmppActivity implements
public void onSaveInstanceState(Bundle savedInstanceState) {
Conversation conversation = getSelectedConversation();
if (conversation != null) {
Log.d(Config.LOGTAG, "saving conversation: " + conversation.getName() + " " + conversation.getUuid());
savedInstanceState.putString(STATE_OPEN_CONVERSATION,
conversation.getUuid());
}
@ -700,24 +686,18 @@ public class ConversationActivity extends XmppActivity implements
handleViewConversationIntent(getIntent());
setIntent(null);
} else if (mOpenConverstaion != null) {
Log.d(Config.LOGTAG, "open conversation: " + mOpenConverstaion);
selectConversationByUuid(mOpenConverstaion);
paneShouldBeOpen = mPanelOpen;
if (paneShouldBeOpen) {
if (mPanelOpen) {
showConversationsOverview();
}
swapConversationFragment();
this.mConversationFragment.reInit(getSelectedConversation());
mOpenConverstaion = null;
} else {
} else if (getSelectedConversation() == null) {
showConversationsOverview();
ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager()
.findFragmentByTag("conversation");
if (selectedFragment != null) {
selectedFragment.onBackendConnected();
} else {
mPendingImageUri = null;
setSelectedConversation(conversationList.get(0));
swapConversationFragment();
}
mPendingImageUri = null;
setSelectedConversation(conversationList.get(0));
this.mConversationFragment.reInit(getSelectedConversation());
}
if (mPendingImageUri != null) {
@ -730,10 +710,12 @@ public class ConversationActivity extends XmppActivity implements
private void handleViewConversationIntent(Intent intent) {
String uuid = (String) intent.getExtras().get(CONVERSATION);
String text = intent.getExtras().getString(TEXT, null);
String text = intent.getExtras().getString(TEXT, "");
selectConversationByUuid(uuid);
paneShouldBeOpen = false;
swapConversationFragment().setText(text);
this.mConversationFragment.reInit(getSelectedConversation());
this.mConversationFragment.appendText(text);
hideConversationsOverview();
openConversation(getSelectedConversation());
}
private void selectConversationByUuid(String uuid) {
@ -917,19 +899,12 @@ public class ConversationActivity extends XmppActivity implements
@Override
public void run() {
updateConversationList();
if (paneShouldBeOpen) {
if (conversationList.size() >= 1) {
swapConversationFragment();
} else {
if (conversationList.size() == 0) {
startActivity(new Intent(getApplicationContext(),
StartConversationActivity.class));
finish();
}
}
ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager()
.findFragmentByTag("conversation");
if (selectedFragment != null) {
selectedFragment.updateMessages();
} else {
ConversationActivity.this.mConversationFragment.updateMessages();
}
}
});
@ -937,16 +912,12 @@ public class ConversationActivity extends XmppActivity implements
@Override
public void onRosterUpdate() {
final ConversationFragment fragment = (ConversationFragment) getFragmentManager()
.findFragmentByTag("conversation");
if (fragment != null) {
runOnUiThread(new Runnable() {
runOnUiThread(new Runnable() {
@Override
public void run() {
fragment.updateMessages();
ConversationActivity.this.mConversationFragment.updateMessages();
}
});
}
}
}

View file

@ -9,8 +9,6 @@ import android.content.Intent;
import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
import android.os.Bundle;
import android.text.Editable;
import android.text.Selection;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Gravity;
@ -60,80 +58,6 @@ import eu.siacs.conversations.utils.UIHelper;
public class ConversationFragment extends Fragment {
protected Conversation conversation;
protected ListView messagesView;
protected LayoutInflater inflater;
protected List<Message> messageList = new ArrayList<Message>();
protected MessageAdapter messageListAdapter;
protected Contact contact;
protected String queuedPqpMessage = null;
private EditMessage mEditMessage;
private ImageButton mSendButton;
private String pastedText = null;
private RelativeLayout snackbar;
private TextView snackbarMessage;
private TextView snackbarAction;
private boolean messagesLoaded = false;
private IntentSender askForPassphraseIntent = null;
private ConcurrentLinkedQueue<Message> mEncryptedMessages = new ConcurrentLinkedQueue<Message>();
private boolean mDecryptJobRunning = false;
private OnEditorActionListener mEditorActionListener = new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEND) {
InputMethodManager imm = (InputMethodManager) v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
sendMessage();
return true;
} else {
return false;
}
}
};
private OnClickListener mSendButtonListener = new OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
};
protected OnClickListener clickToDecryptListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (activity.hasPgp() && askForPassphraseIntent != null) {
try {
getActivity().startIntentSenderForResult(
askForPassphraseIntent,
ConversationActivity.REQUEST_DECRYPT_PGP, null, 0,
0, 0);
} catch (SendIntentException e) {
//
}
}
}
};
private OnClickListener clickToMuc = new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(),
ConferenceDetailsActivity.class);
intent.setAction(ConferenceDetailsActivity.ACTION_VIEW_MUC);
intent.putExtra("uuid", conversation.getUuid());
startActivity(intent);
}
};
private OnClickListener leaveMuc = new OnClickListener() {
@Override
@ -141,7 +65,6 @@ public class ConversationFragment extends Fragment {
activity.endConversation(conversation);
}
};
private OnClickListener joinMuc = new OnClickListener() {
@Override
@ -149,7 +72,6 @@ public class ConversationFragment extends Fragment {
activity.xmppConnectionService.joinMuc(conversation);
}
};
private OnClickListener enterPassword = new OnClickListener() {
@Override
@ -169,7 +91,18 @@ public class ConversationFragment extends Fragment {
});
}
};
protected ListView messagesView;
protected LayoutInflater inflater;
protected List<Message> messageList = new ArrayList<Message>();
protected MessageAdapter messageListAdapter;
protected Contact contact;
protected String queuedPqpMessage = null;
private EditMessage mEditMessage;
private ImageButton mSendButton;
private RelativeLayout snackbar;
private TextView snackbarMessage;
private TextView snackbarAction;
private boolean messagesLoaded = false;
private OnScrollListener mOnScrollListener = new OnScrollListener() {
@Override
@ -197,7 +130,58 @@ public class ConversationFragment extends Fragment {
}
}
};
private IntentSender askForPassphraseIntent = null;
protected OnClickListener clickToDecryptListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (activity.hasPgp() && askForPassphraseIntent != null) {
try {
getActivity().startIntentSenderForResult(
askForPassphraseIntent,
ConversationActivity.REQUEST_DECRYPT_PGP, null, 0,
0, 0);
} catch (SendIntentException e) {
//
}
}
}
};
private ConcurrentLinkedQueue<Message> mEncryptedMessages = new ConcurrentLinkedQueue<Message>();
private boolean mDecryptJobRunning = false;
private OnEditorActionListener mEditorActionListener = new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEND) {
InputMethodManager imm = (InputMethodManager) v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
sendMessage();
return true;
} else {
return false;
}
}
};
private OnClickListener mSendButtonListener = new OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
};
private OnClickListener clickToMuc = new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(),
ConferenceDetailsActivity.class);
intent.setAction(ConferenceDetailsActivity.ACTION_VIEW_MUC);
intent.putExtra("uuid", conversation.getUuid());
startActivity(intent);
}
};
private ConversationActivity activity;
private Message selectedMessage;
@ -466,15 +450,6 @@ public class ConversationFragment extends Fragment {
}
}
@Override
public void onStart() {
super.onStart();
this.activity = (ConversationActivity) getActivity();
if (activity.xmppConnectionServiceBound) {
this.onBackendConnected();
}
}
@Override
public void onStop() {
mDecryptJobRunning = false;
@ -484,36 +459,18 @@ public class ConversationFragment extends Fragment {
}
}
public void onBackendConnected() {
public void reInit(Conversation conversation) {
if (this.conversation != null) {
this.conversation.setNextMessage(mEditMessage.getText().toString());
}
this.activity = (ConversationActivity) getActivity();
this.conversation = activity.getSelectedConversation();
if (this.conversation == null) {
return;
}
String oldString = conversation.getNextMessage().trim();
if (this.pastedText == null) {
this.mEditMessage.setText(oldString);
} else {
if (oldString.isEmpty()) {
mEditMessage.setText(pastedText);
} else {
mEditMessage.setText(oldString + " " + pastedText);
}
pastedText = null;
}
int position = mEditMessage.length();
Editable etext = mEditMessage.getText();
Selection.setSelection(etext, position);
if (activity.isConversationsOverviewHideable()) {
if (!activity.shouldPaneBeOpen()) {
activity.hideConversationsOverview();
activity.openConversation(conversation);
}
}
this.conversation = conversation;
if (this.conversation.getMode() == Conversation.MODE_MULTI) {
conversation.setNextPresence(null);
this.conversation.setNextPresence(null);
}
this.mEditMessage.setText("");
this.mEditMessage.append(this.conversation.getNextMessage());
this.messagesView.invalidate();
updateMessages();
}
@ -611,7 +568,7 @@ public class ConversationFragment extends Fragment {
}
getActivity().invalidateOptionsMenu();
updateChatMsgHint();
if (!activity.shouldPaneBeOpen()) {
if (!activity.isConversationsOverviewVisable() || !activity.isConversationsOverviewHideable()) {
activity.xmppConnectionService.markRead(conversation, true);
activity.updateConversationList();
}
@ -888,8 +845,12 @@ public class ConversationFragment extends Fragment {
}
}
public void setText(String text) {
this.pastedText = text;
public void appendText(String text) {
String previous = this.mEditMessage.getText().toString();
if (previous.length() != 0 && !previous.endsWith(" ")) {
text = " " + text;
}
this.mEditMessage.append(text);
}
public void clearInputField() {

View file

@ -1,5 +1,23 @@
package eu.siacs.conversations.ui.adapter;
import android.content.Intent;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import eu.siacs.conversations.Config;
@ -11,23 +29,6 @@ import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.Message.ImageParams;
import eu.siacs.conversations.ui.ConversationActivity;
import eu.siacs.conversations.utils.UIHelper;
import android.content.Intent;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MessageAdapter extends ArrayAdapter<Message> {
@ -323,10 +324,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
.findViewById(R.id.message_box);
viewHolder.contact_picture = (ImageView) view
.findViewById(R.id.message_photo);
viewHolder.contact_picture.setImageBitmap(activity
.avatarService().get(
item.getConversation().getAccount(),
activity.getPixel(48)));
viewHolder.download_button = (Button) view
.findViewById(R.id.download_button);
viewHolder.indicator = (ImageView) view
@ -350,11 +347,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
.findViewById(R.id.message_photo);
viewHolder.download_button = (Button) view
.findViewById(R.id.download_button);
if (item.getConversation().getMode() == Conversation.MODE_SINGLE) {
viewHolder.contact_picture.setImageBitmap(activity
.avatarService().get(item.getContact(),
activity.getPixel(48)));
}
viewHolder.indicator = (ImageView) view
.findViewById(R.id.security_indicator);
viewHolder.image = (ImageView) view
@ -363,6 +355,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
.findViewById(R.id.message_body);
viewHolder.time = (TextView) view
.findViewById(R.id.message_time);
viewHolder.indicatorReceived = (ImageView) view
.findViewById(R.id.indicator_received);
view.setTag(viewHolder);
break;
case STATUS:
@ -370,30 +364,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
R.layout.message_status, parent, false);
viewHolder.contact_picture = (ImageView) view
.findViewById(R.id.message_photo);
if (item.getConversation().getMode() == Conversation.MODE_SINGLE) {
viewHolder.contact_picture.setImageBitmap(activity
.avatarService().get(
item.getConversation().getContact(),
activity.getPixel(32)));
viewHolder.contact_picture.setAlpha(0.5f);
viewHolder.contact_picture
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = item.getConversation()
.getName();
String read = getContext()
.getString(
R.string.contact_has_read_up_to_this_point,
name);
Toast.makeText(getContext(), read,
Toast.LENGTH_SHORT).show();
}
});
}
break;
default:
viewHolder = null;
@ -404,9 +374,32 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
if (type == STATUS) {
if (item.getConversation().getMode() == Conversation.MODE_SINGLE) {
viewHolder.contact_picture.setImageBitmap(activity
.avatarService().get(
item.getConversation().getContact(),
activity.getPixel(32)));
viewHolder.contact_picture.setAlpha(0.5f);
viewHolder.contact_picture
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = item.getConversation()
.getName();
String read = getContext()
.getString(
R.string.contact_has_read_up_to_this_point,
name);
Toast.makeText(getContext(), read,
Toast.LENGTH_SHORT).show();
}
});
}
return view;
}
if (type == NULL) {
} else if (type == NULL) {
if (position == getCount() - 1) {
view.getLayoutParams().height = 1;
} else {
@ -415,6 +408,19 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
view.setLayoutParams(view.getLayoutParams());
return view;
} else if (type == RECEIVED) {
Contact contact = item.getContact();
if (contact != null) {
viewHolder.contact_picture.setImageBitmap(activity.avatarService().get(contact, activity.getPixel(48)));
} else if (item.getConversation().getMode() == Conversation.MODE_MULTI) {
String name = item.getPresence();
if (name == null) {
name = item.getCounterpart();
}
viewHolder.contact_picture.setImageBitmap(activity.avatarService().get(name, activity.getPixel(48)));
}
} else if (type == SENT) {
viewHolder.contact_picture.setImageBitmap(activity.avatarService().get(item.getConversation().getAccount(), activity.getPixel(48)));
}
if (viewHolder.contact_picture != null) {
@ -426,7 +432,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
if (MessageAdapter.this.mOnContactPictureClickedListener != null) {
MessageAdapter.this.mOnContactPictureClickedListener
.onContactPictureClicked(item);
;
}
}
@ -447,24 +452,6 @@ public class MessageAdapter extends ArrayAdapter<Message> {
});
}
if (type == RECEIVED) {
if (item.getConversation().getMode() == Conversation.MODE_MULTI) {
Contact contact = item.getContact();
if (contact != null) {
viewHolder.contact_picture.setImageBitmap(activity
.avatarService()
.get(contact, activity.getPixel(48)));
} else {
String name = item.getPresence();
if (name == null) {
name = item.getCounterpart();
}
viewHolder.contact_picture.setImageBitmap(activity
.avatarService().get(name, activity.getPixel(48)));
}
}
}
if (item.getType() == Message.TYPE_IMAGE
|| item.getDownloadable() != null) {
Downloadable d = item.getDownloadable();
@ -532,6 +519,14 @@ public class MessageAdapter extends ArrayAdapter<Message> {
}
}
public interface OnContactPictureClicked {
public void onContactPictureClicked(Message message);
}
public interface OnContactPictureLongClicked {
public void onContactPictureLongClicked(Message message);
}
private static class ViewHolder {
protected LinearLayout message_box;
@ -544,12 +539,4 @@ public class MessageAdapter extends ArrayAdapter<Message> {
protected ImageView contact_picture;
}
public interface OnContactPictureClicked {
public void onContactPictureClicked(Message message);
}
public interface OnContactPictureLongClicked {
public void onContactPictureLongClicked(Message message);
}
}