move new activity back to original name
This commit is contained in:
parent
02c78bb1fb
commit
6b689edb52
|
@ -44,7 +44,7 @@
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.ConversationsMainActivity"
|
android:name=".ui.ConversationActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:minWidth="300dp"
|
android:minWidth="300dp"
|
||||||
|
|
|
@ -46,7 +46,6 @@ import eu.siacs.conversations.entities.Message;
|
||||||
import eu.siacs.conversations.persistance.FileBackend;
|
import eu.siacs.conversations.persistance.FileBackend;
|
||||||
import eu.siacs.conversations.ui.ConversationActivity;
|
import eu.siacs.conversations.ui.ConversationActivity;
|
||||||
import eu.siacs.conversations.ui.ManageAccountActivity;
|
import eu.siacs.conversations.ui.ManageAccountActivity;
|
||||||
import eu.siacs.conversations.ui.SettingsActivity;
|
|
||||||
import eu.siacs.conversations.ui.TimePreference;
|
import eu.siacs.conversations.ui.TimePreference;
|
||||||
import eu.siacs.conversations.utils.GeoHelper;
|
import eu.siacs.conversations.utils.GeoHelper;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
import eu.siacs.conversations.utils.UIHelper;
|
||||||
|
@ -618,7 +617,7 @@ public class NotificationService {
|
||||||
private PendingIntent createContentIntent(final String conversationUuid, final String downloadMessageUuid) {
|
private PendingIntent createContentIntent(final String conversationUuid, final String downloadMessageUuid) {
|
||||||
final Intent viewConversationIntent = new Intent(mXmppConnectionService,ConversationActivity.class);
|
final Intent viewConversationIntent = new Intent(mXmppConnectionService,ConversationActivity.class);
|
||||||
viewConversationIntent.setAction(ConversationActivity.ACTION_VIEW_CONVERSATION);
|
viewConversationIntent.setAction(ConversationActivity.ACTION_VIEW_CONVERSATION);
|
||||||
viewConversationIntent.putExtra(ConversationActivity.CONVERSATION, conversationUuid);
|
viewConversationIntent.putExtra(ConversationActivity.EXTRA_CONVERSATION, conversationUuid);
|
||||||
if (downloadMessageUuid != null) {
|
if (downloadMessageUuid != null) {
|
||||||
viewConversationIntent.putExtra(ConversationActivity.EXTRA_DOWNLOAD_UUID, downloadMessageUuid);
|
viewConversationIntent.putExtra(ConversationActivity.EXTRA_DOWNLOAD_UUID, downloadMessageUuid);
|
||||||
return PendingIntent.getActivity(mXmppConnectionService,
|
return PendingIntent.getActivity(mXmppConnectionService,
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -133,7 +133,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
|
||||||
private Conversation conversation;
|
private Conversation conversation;
|
||||||
private FragmentConversationBinding binding;
|
private FragmentConversationBinding binding;
|
||||||
private Toast messageLoaderToast;
|
private Toast messageLoaderToast;
|
||||||
private ConversationsMainActivity activity;
|
private ConversationActivity activity;
|
||||||
|
|
||||||
private OnClickListener clickToMuc = new OnClickListener() {
|
private OnClickListener clickToMuc = new OnClickListener() {
|
||||||
|
|
||||||
|
@ -719,9 +719,9 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
|
||||||
@Override
|
@Override
|
||||||
public void onAttach(Activity activity) {
|
public void onAttach(Activity activity) {
|
||||||
super.onAttach(activity);
|
super.onAttach(activity);
|
||||||
Log.d(Config.LOGTAG, "onAttach()");
|
Log.d(Config.LOGTAG, "ConversationFragment.onAttach()");
|
||||||
if (activity instanceof ConversationsMainActivity) {
|
if (activity instanceof ConversationActivity) {
|
||||||
this.activity = (ConversationsMainActivity) activity;
|
this.activity = (ConversationActivity) activity;
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalStateException("Trying to attach fragment to activity that is not the ConversationActivity");
|
throw new IllegalStateException("Trying to attach fragment to activity that is not the ConversationActivity");
|
||||||
}
|
}
|
||||||
|
@ -1532,6 +1532,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
|
Log.d(Config.LOGTAG,"ConversationFragment.onActivityCreated()");
|
||||||
super.onActivityCreated(savedInstanceState);
|
super.onActivityCreated(savedInstanceState);
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -0,0 +1,871 @@
|
||||||
|
package eu.siacs.conversations.ui;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
|
import android.app.FragmentTransaction;
|
||||||
|
import android.content.ActivityNotFoundException;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.provider.Settings;
|
||||||
|
import android.support.v4.widget.SlidingPaneLayout;
|
||||||
|
import android.support.v4.widget.SlidingPaneLayout.PanelSlideListener;
|
||||||
|
import android.support.v7.app.ActionBar;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
|
import android.view.KeyEvent;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.Surface;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.AdapterView.OnItemClickListener;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import de.timroes.android.listview.EnhancedListView;
|
||||||
|
import eu.siacs.conversations.Config;
|
||||||
|
import eu.siacs.conversations.R;
|
||||||
|
import eu.siacs.conversations.entities.Account;
|
||||||
|
import eu.siacs.conversations.entities.Conversation;
|
||||||
|
import eu.siacs.conversations.entities.Message;
|
||||||
|
import eu.siacs.conversations.services.XmppConnectionService;
|
||||||
|
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
|
||||||
|
import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate;
|
||||||
|
import eu.siacs.conversations.services.XmppConnectionService.OnRosterUpdate;
|
||||||
|
import eu.siacs.conversations.ui.adapter.ConversationAdapter;
|
||||||
|
import eu.siacs.conversations.ui.service.EmojiService;
|
||||||
|
import eu.siacs.conversations.utils.ExceptionHelper;
|
||||||
|
import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
|
||||||
|
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
|
||||||
|
import eu.siacs.conversations.xmpp.jid.Jid;
|
||||||
|
|
||||||
|
public class ConversationLegacyActivity extends XmppActivity
|
||||||
|
implements OnAccountUpdate, OnConversationUpdate, OnRosterUpdate, OnUpdateBlocklist, XmppConnectionService.OnShowErrorToast {
|
||||||
|
|
||||||
|
public static final String ACTION_VIEW_CONVERSATION = "eu.siacs.conversations.action.VIEW";
|
||||||
|
public static final String CONVERSATION = "conversationUuid";
|
||||||
|
public static final String EXTRA_DOWNLOAD_UUID = "eu.siacs.conversations.download_uuid";
|
||||||
|
public static final String TEXT = "text";
|
||||||
|
public static final String NICK = "nick";
|
||||||
|
public static final String PRIVATE_MESSAGE = "pm";
|
||||||
|
|
||||||
|
private static final String STATE_OPEN_CONVERSATION = "state_open_conversation";
|
||||||
|
private static final String STATE_PANEL_OPEN = "state_panel_open";
|
||||||
|
private static final String STATE_PENDING_URI = "state_pending_uri";
|
||||||
|
private static final String STATE_FIRST_VISIBLE = "first_visible";
|
||||||
|
private static final String STATE_OFFSET_FROM_TOP = "offset_from_top";
|
||||||
|
|
||||||
|
private String mOpenConversation = null;
|
||||||
|
private boolean mPanelOpen = true;
|
||||||
|
private AtomicBoolean mShouldPanelBeOpen = new AtomicBoolean(false);
|
||||||
|
private Pair<Integer, Integer> mScrollPosition = null;
|
||||||
|
private boolean forbidProcessingPendings = false;
|
||||||
|
|
||||||
|
private boolean conversationWasSelectedByKeyboard = false;
|
||||||
|
|
||||||
|
private View mContentView;
|
||||||
|
|
||||||
|
private List<Conversation> conversationList = new ArrayList<>();
|
||||||
|
private Conversation swipedConversation = null;
|
||||||
|
private Conversation mSelectedConversation = null;
|
||||||
|
private EnhancedListView listView;
|
||||||
|
private ConversationFragment mConversationFragment;
|
||||||
|
|
||||||
|
private ArrayAdapter<Conversation> listAdapter;
|
||||||
|
|
||||||
|
private boolean mActivityPaused = false;
|
||||||
|
private AtomicBoolean mRedirected = new AtomicBoolean(false);
|
||||||
|
private boolean mUnprocessedNewIntent = false;
|
||||||
|
|
||||||
|
public Conversation getSelectedConversation() {
|
||||||
|
return this.mSelectedConversation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedConversation(Conversation conversation) {
|
||||||
|
this.mSelectedConversation = conversation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showConversationsOverview() {
|
||||||
|
if (mConversationFragment != null) {
|
||||||
|
mConversationFragment.stopScrolling();
|
||||||
|
}
|
||||||
|
if (mContentView instanceof SlidingPaneLayout) {
|
||||||
|
SlidingPaneLayout mSlidingPaneLayout = (SlidingPaneLayout) mContentView;
|
||||||
|
mShouldPanelBeOpen.set(true);
|
||||||
|
mSlidingPaneLayout.openPane();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getShareableUri() {
|
||||||
|
Conversation conversation = getSelectedConversation();
|
||||||
|
if (conversation != null) {
|
||||||
|
return conversation.getAccount().getShareableUri();
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void hideConversationsOverview() {
|
||||||
|
if (mContentView instanceof SlidingPaneLayout) {
|
||||||
|
SlidingPaneLayout mSlidingPaneLayout = (SlidingPaneLayout) mContentView;
|
||||||
|
mShouldPanelBeOpen.set(false);
|
||||||
|
mSlidingPaneLayout.closePane();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isConversationsOverviewHideable() {
|
||||||
|
return mContentView instanceof SlidingPaneLayout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isConversationsOverviewVisable() {
|
||||||
|
if (mContentView instanceof SlidingPaneLayout) {
|
||||||
|
return mShouldPanelBeOpen.get();
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(final Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
new EmojiService(this).init();
|
||||||
|
if (savedInstanceState != null) {
|
||||||
|
mOpenConversation = savedInstanceState.getString(STATE_OPEN_CONVERSATION, null);
|
||||||
|
mPanelOpen = savedInstanceState.getBoolean(STATE_PANEL_OPEN, true);
|
||||||
|
int pos = savedInstanceState.getInt(STATE_FIRST_VISIBLE, -1);
|
||||||
|
int offset = savedInstanceState.getInt(STATE_OFFSET_FROM_TOP, 1);
|
||||||
|
if (pos >= 0 && offset <= 0) {
|
||||||
|
Log.d(Config.LOGTAG, "retrieved scroll position from instanceState " + pos + ":" + offset);
|
||||||
|
mScrollPosition = new Pair<>(pos, offset);
|
||||||
|
} else {
|
||||||
|
mScrollPosition = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
this.listView = findViewById(R.id.list);
|
||||||
|
this.listAdapter = new ConversationAdapter(this, conversationList);
|
||||||
|
this.listView.setAdapter(this.listAdapter);
|
||||||
|
this.listView.setSwipeDirection(EnhancedListView.SwipeDirection.END);
|
||||||
|
|
||||||
|
final ActionBar actionBar = getSupportActionBar();
|
||||||
|
if (actionBar != null) {
|
||||||
|
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
listView.setOnItemClickListener(new OnItemClickListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onItemClick(AdapterView<?> arg0, View clickedView,
|
||||||
|
int position, long arg3) {
|
||||||
|
if (getSelectedConversation() != conversationList.get(position)) {
|
||||||
|
ConversationLegacyActivity.this.mConversationFragment.stopScrolling();
|
||||||
|
setSelectedConversation(conversationList.get(position));
|
||||||
|
ConversationLegacyActivity.this.mConversationFragment.reInit(getSelectedConversation());
|
||||||
|
conversationWasSelectedByKeyboard = false;
|
||||||
|
}
|
||||||
|
hideConversationsOverview();
|
||||||
|
openConversation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
listView.setDismissCallback(new EnhancedListView.OnDismissCallback() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EnhancedListView.Undoable onDismiss(final EnhancedListView enhancedListView, final int position) {
|
||||||
|
|
||||||
|
final int index = listView.getFirstVisiblePosition();
|
||||||
|
View v = listView.getChildAt(0);
|
||||||
|
final int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop());
|
||||||
|
|
||||||
|
try {
|
||||||
|
swipedConversation = listAdapter.getItem(position);
|
||||||
|
} catch (IndexOutOfBoundsException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
listAdapter.remove(swipedConversation);
|
||||||
|
xmppConnectionService.markRead(swipedConversation);
|
||||||
|
|
||||||
|
final boolean formerlySelected = (getSelectedConversation() == swipedConversation);
|
||||||
|
if (position == 0 && listAdapter.getCount() == 0) {
|
||||||
|
endConversation(swipedConversation, false, true);
|
||||||
|
return null;
|
||||||
|
} else if (formerlySelected) {
|
||||||
|
setSelectedConversation(listAdapter.getItem(0));
|
||||||
|
ConversationLegacyActivity.this.mConversationFragment
|
||||||
|
.reInit(getSelectedConversation());
|
||||||
|
}
|
||||||
|
|
||||||
|
return new EnhancedListView.Undoable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void undo() {
|
||||||
|
listAdapter.insert(swipedConversation, position);
|
||||||
|
if (formerlySelected) {
|
||||||
|
setSelectedConversation(swipedConversation);
|
||||||
|
ConversationLegacyActivity.this.mConversationFragment
|
||||||
|
.reInit(getSelectedConversation());
|
||||||
|
}
|
||||||
|
swipedConversation = null;
|
||||||
|
listView.setSelectionFromTop(index + (listView.getChildCount() < position ? 1 : 0), top);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void discard() {
|
||||||
|
if (!swipedConversation.isRead()
|
||||||
|
&& swipedConversation.getMode() == Conversation.MODE_SINGLE) {
|
||||||
|
swipedConversation = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
endConversation(swipedConversation, false, false);
|
||||||
|
swipedConversation = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTitle() {
|
||||||
|
if (swipedConversation.getMode() == Conversation.MODE_MULTI) {
|
||||||
|
return getResources().getString(R.string.title_undo_swipe_out_muc);
|
||||||
|
} else {
|
||||||
|
return getResources().getString(R.string.title_undo_swipe_out_conversation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
listView.enableSwipeToDismiss();
|
||||||
|
listView.setSwipingLayout(R.id.swipeable_item);
|
||||||
|
listView.setUndoStyle(EnhancedListView.UndoStyle.SINGLE_POPUP);
|
||||||
|
listView.setUndoHideDelay(5000);
|
||||||
|
listView.setRequireTouchBeforeDismiss(false);
|
||||||
|
|
||||||
|
//mContentView = findViewById(R.id.content_view_spl);
|
||||||
|
if (mContentView == null) {
|
||||||
|
//mContentView = findViewById(R.id.content_view_ll);
|
||||||
|
}
|
||||||
|
if (mContentView instanceof SlidingPaneLayout) {
|
||||||
|
SlidingPaneLayout mSlidingPaneLayout = (SlidingPaneLayout) mContentView;
|
||||||
|
mSlidingPaneLayout.setShadowResource(R.drawable.es_slidingpane_shadow);
|
||||||
|
mSlidingPaneLayout.setSliderFadeColor(0);
|
||||||
|
mSlidingPaneLayout.setPanelSlideListener(new PanelSlideListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPanelOpened(View arg0) {
|
||||||
|
mShouldPanelBeOpen.set(true);
|
||||||
|
updateActionBarTitle();
|
||||||
|
invalidateOptionsMenu();
|
||||||
|
hideKeyboard();
|
||||||
|
if (xmppConnectionServiceBound) {
|
||||||
|
xmppConnectionService.getNotificationService().setOpenConversation(null);
|
||||||
|
}
|
||||||
|
closeContextMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPanelClosed(View arg0) {
|
||||||
|
mShouldPanelBeOpen.set(false);
|
||||||
|
listView.discardUndo();
|
||||||
|
openConversation();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPanelSlide(View arg0, float arg1) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void switchToConversation(Conversation conversation) {
|
||||||
|
setSelectedConversation(conversation);
|
||||||
|
runOnUiThread(() -> {
|
||||||
|
ConversationLegacyActivity.this.mConversationFragment.reInit(getSelectedConversation());
|
||||||
|
openConversation();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateActionBarTitle() {
|
||||||
|
updateActionBarTitle(isConversationsOverviewHideable() && !isConversationsOverviewVisable());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateActionBarTitle(boolean titleShouldBeName) {
|
||||||
|
final ActionBar ab = getSupportActionBar();
|
||||||
|
final Conversation conversation = getSelectedConversation();
|
||||||
|
if (ab != null) {
|
||||||
|
if (titleShouldBeName && conversation != null) {
|
||||||
|
if ((ab.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != ActionBar.DISPLAY_HOME_AS_UP) {
|
||||||
|
ab.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE);
|
||||||
|
}
|
||||||
|
if (conversation.getMode() == Conversation.MODE_SINGLE || useSubjectToIdentifyConference()) {
|
||||||
|
ab.setTitle(conversation.getName());
|
||||||
|
} else {
|
||||||
|
ab.setTitle(conversation.getJid().toBareJid().toString());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ((ab.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) == ActionBar.DISPLAY_HOME_AS_UP) {
|
||||||
|
ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE);
|
||||||
|
}
|
||||||
|
ab.setTitle(R.string.app_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void openConversation() {
|
||||||
|
this.updateActionBarTitle();
|
||||||
|
this.invalidateOptionsMenu();
|
||||||
|
if (xmppConnectionServiceBound) {
|
||||||
|
final Conversation conversation = getSelectedConversation();
|
||||||
|
xmppConnectionService.getNotificationService().setOpenConversation(conversation);
|
||||||
|
sendReadMarkerIfNecessary(conversation);
|
||||||
|
}
|
||||||
|
listAdapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendReadMarkerIfNecessary(final Conversation conversation) {
|
||||||
|
if (!mActivityPaused && !mUnprocessedNewIntent && conversation != null) {
|
||||||
|
xmppConnectionService.sendReadMarker(conversation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
getMenuInflater().inflate(R.menu.activity_conversations, menu);
|
||||||
|
return super.onCreateOptionsMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(final MenuItem item) {
|
||||||
|
if (item.getItemId() == android.R.id.home) {
|
||||||
|
showConversationsOverview();
|
||||||
|
return true;
|
||||||
|
} else if (item.getItemId() == R.id.action_add) {
|
||||||
|
startActivity(new Intent(this, StartConversationActivity.class));
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endConversation(Conversation conversation) {
|
||||||
|
endConversation(conversation, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endConversation(Conversation conversation, boolean showOverview, boolean reinit) {
|
||||||
|
if (showOverview) {
|
||||||
|
showConversationsOverview();
|
||||||
|
}
|
||||||
|
xmppConnectionService.archiveConversation(conversation);
|
||||||
|
if (reinit) {
|
||||||
|
if (conversationList.size() > 0) {
|
||||||
|
setSelectedConversation(conversationList.get(0));
|
||||||
|
this.mConversationFragment.reInit(getSelectedConversation());
|
||||||
|
} else {
|
||||||
|
setSelectedConversation(null);
|
||||||
|
if (mRedirected.compareAndSet(false, true)) {
|
||||||
|
Intent intent = new Intent(this, StartConversationActivity.class);
|
||||||
|
intent.putExtra("init", true);
|
||||||
|
startActivity(intent);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBackPressed() {
|
||||||
|
if (!isConversationsOverviewVisable()) {
|
||||||
|
showConversationsOverview();
|
||||||
|
} else {
|
||||||
|
super.onBackPressed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onKeyUp(int key, KeyEvent event) {
|
||||||
|
int rotation = getWindowManager().getDefaultDisplay().getRotation();
|
||||||
|
final int upKey;
|
||||||
|
final int downKey;
|
||||||
|
switch (rotation) {
|
||||||
|
case Surface.ROTATION_90:
|
||||||
|
upKey = KeyEvent.KEYCODE_DPAD_LEFT;
|
||||||
|
downKey = KeyEvent.KEYCODE_DPAD_RIGHT;
|
||||||
|
break;
|
||||||
|
case Surface.ROTATION_180:
|
||||||
|
upKey = KeyEvent.KEYCODE_DPAD_DOWN;
|
||||||
|
downKey = KeyEvent.KEYCODE_DPAD_UP;
|
||||||
|
break;
|
||||||
|
case Surface.ROTATION_270:
|
||||||
|
upKey = KeyEvent.KEYCODE_DPAD_RIGHT;
|
||||||
|
downKey = KeyEvent.KEYCODE_DPAD_LEFT;
|
||||||
|
break;
|
||||||
|
case Surface.ROTATION_0:
|
||||||
|
default:
|
||||||
|
upKey = KeyEvent.KEYCODE_DPAD_UP;
|
||||||
|
downKey = KeyEvent.KEYCODE_DPAD_DOWN;
|
||||||
|
}
|
||||||
|
final boolean modifier = event.isCtrlPressed() || (event.getMetaState() & KeyEvent.META_ALT_LEFT_ON) != 0;
|
||||||
|
if (modifier && key == KeyEvent.KEYCODE_TAB && isConversationsOverviewHideable()) {
|
||||||
|
toggleConversationsOverview();
|
||||||
|
return true;
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_SPACE) {
|
||||||
|
startActivity(new Intent(this, StartConversationActivity.class));
|
||||||
|
return true;
|
||||||
|
} else if (modifier && key == downKey) {
|
||||||
|
if (isConversationsOverviewHideable() && !isConversationsOverviewVisable()) {
|
||||||
|
showConversationsOverview();
|
||||||
|
;
|
||||||
|
}
|
||||||
|
return selectDownConversation();
|
||||||
|
} else if (modifier && key == upKey) {
|
||||||
|
if (isConversationsOverviewHideable() && !isConversationsOverviewVisable()) {
|
||||||
|
showConversationsOverview();
|
||||||
|
}
|
||||||
|
return selectUpConversation();
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_1) {
|
||||||
|
return openConversationByIndex(0);
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_2) {
|
||||||
|
return openConversationByIndex(1);
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_3) {
|
||||||
|
return openConversationByIndex(2);
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_4) {
|
||||||
|
return openConversationByIndex(3);
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_5) {
|
||||||
|
return openConversationByIndex(4);
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_6) {
|
||||||
|
return openConversationByIndex(5);
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_7) {
|
||||||
|
return openConversationByIndex(6);
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_8) {
|
||||||
|
return openConversationByIndex(7);
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_9) {
|
||||||
|
return openConversationByIndex(8);
|
||||||
|
} else if (modifier && key == KeyEvent.KEYCODE_0) {
|
||||||
|
return openConversationByIndex(9);
|
||||||
|
} else {
|
||||||
|
return super.onKeyUp(key, event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toggleConversationsOverview() {
|
||||||
|
if (isConversationsOverviewVisable()) {
|
||||||
|
hideConversationsOverview();
|
||||||
|
if (mConversationFragment != null) {
|
||||||
|
mConversationFragment.setFocusOnInputField();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
showConversationsOverview();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean selectUpConversation() {
|
||||||
|
if (this.mSelectedConversation != null) {
|
||||||
|
int index = this.conversationList.indexOf(this.mSelectedConversation);
|
||||||
|
if (index > 0) {
|
||||||
|
return openConversationByIndex(index - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean selectDownConversation() {
|
||||||
|
if (this.mSelectedConversation != null) {
|
||||||
|
int index = this.conversationList.indexOf(this.mSelectedConversation);
|
||||||
|
if (index != -1 && index < this.conversationList.size() - 1) {
|
||||||
|
return openConversationByIndex(index + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean openConversationByIndex(int index) {
|
||||||
|
try {
|
||||||
|
this.conversationWasSelectedByKeyboard = true;
|
||||||
|
this.mConversationFragment.stopScrolling();
|
||||||
|
setSelectedConversation(this.conversationList.get(index));
|
||||||
|
this.mConversationFragment.reInit(getSelectedConversation());
|
||||||
|
if (index > listView.getLastVisiblePosition() - 1 || index < listView.getFirstVisiblePosition() + 1) {
|
||||||
|
this.listView.setSelection(index);
|
||||||
|
}
|
||||||
|
openConversation();
|
||||||
|
return true;
|
||||||
|
} catch (IndexOutOfBoundsException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onNewIntent(final Intent intent) {
|
||||||
|
if (intent != null && ACTION_VIEW_CONVERSATION.equals(intent.getAction())) {
|
||||||
|
mOpenConversation = null;
|
||||||
|
mUnprocessedNewIntent = true;
|
||||||
|
if (xmppConnectionServiceBound) {
|
||||||
|
handleViewConversationIntent(intent);
|
||||||
|
intent.setAction(Intent.ACTION_MAIN);
|
||||||
|
} else {
|
||||||
|
setIntent(intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
this.mRedirected.set(false);
|
||||||
|
if (this.xmppConnectionServiceBound) {
|
||||||
|
this.onBackendConnected();
|
||||||
|
}
|
||||||
|
if (conversationList.size() >= 1) {
|
||||||
|
this.onConversationUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
listView.discardUndo();
|
||||||
|
super.onPause();
|
||||||
|
this.mActivityPaused = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
final int theme = findTheme();
|
||||||
|
final boolean usingEnterKey = usingEnterKey();
|
||||||
|
if (this.mTheme != theme || usingEnterKey != mUsingEnterKey) {
|
||||||
|
recreate();
|
||||||
|
}
|
||||||
|
this.mActivityPaused = false;
|
||||||
|
if (!isConversationsOverviewVisable() || !isConversationsOverviewHideable()) {
|
||||||
|
sendReadMarkerIfNecessary(getSelectedConversation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(final Bundle savedInstanceState) {
|
||||||
|
Conversation conversation = getSelectedConversation();
|
||||||
|
if (conversation != null) {
|
||||||
|
savedInstanceState.putString(STATE_OPEN_CONVERSATION, conversation.getUuid());
|
||||||
|
Pair<Integer, Integer> scrollPosition = mConversationFragment.getScrollPosition();
|
||||||
|
if (scrollPosition != null) {
|
||||||
|
savedInstanceState.putInt(STATE_FIRST_VISIBLE, scrollPosition.first);
|
||||||
|
savedInstanceState.putInt(STATE_OFFSET_FROM_TOP, scrollPosition.second);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
savedInstanceState.remove(STATE_OPEN_CONVERSATION);
|
||||||
|
}
|
||||||
|
savedInstanceState.putBoolean(STATE_PANEL_OPEN, isConversationsOverviewVisable());
|
||||||
|
/*if (this.mPendingImageUris.size() >= 1) {
|
||||||
|
Log.d(Config.LOGTAG, "ConversationsActivity.onSaveInstanceState() - saving pending image uri");
|
||||||
|
savedInstanceState.putString(STATE_PENDING_URI, this.mPendingImageUris.get(0).toString());
|
||||||
|
} else {
|
||||||
|
savedInstanceState.remove(STATE_PENDING_URI);
|
||||||
|
}*/
|
||||||
|
super.onSaveInstanceState(savedInstanceState);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearPending() {
|
||||||
|
mConversationFragment.clearPending();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void redirectToStartConversationActivity(boolean noAnimation) {
|
||||||
|
Account pendingAccount = xmppConnectionService.getPendingAccount();
|
||||||
|
if (pendingAccount == null) {
|
||||||
|
Intent startConversationActivity = new Intent(this, StartConversationActivity.class);
|
||||||
|
startConversationActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||||
|
if (noAnimation) {
|
||||||
|
startConversationActivity.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
||||||
|
}
|
||||||
|
startConversationActivity.putExtra("init", true);
|
||||||
|
startActivity(startConversationActivity);
|
||||||
|
if (noAnimation) {
|
||||||
|
overridePendingTransition(0, 0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switchToAccount(pendingAccount, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void onBackendConnected() {
|
||||||
|
this.xmppConnectionService.getNotificationService().setIsInForeground(true);
|
||||||
|
updateConversationList();
|
||||||
|
|
||||||
|
if (mPendingConferenceInvite != null) {
|
||||||
|
if (mPendingConferenceInvite.execute(this)) {
|
||||||
|
mToast = Toast.makeText(this, R.string.creating_conference, Toast.LENGTH_LONG);
|
||||||
|
mToast.show();
|
||||||
|
}
|
||||||
|
mPendingConferenceInvite = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Intent intent = getIntent();
|
||||||
|
|
||||||
|
if (xmppConnectionService.getAccounts().size() == 0) {
|
||||||
|
if (mRedirected.compareAndSet(false, true)) {
|
||||||
|
if (Config.X509_VERIFICATION) {
|
||||||
|
Intent redirectionIntent = new Intent(this, ManageAccountActivity.class);
|
||||||
|
redirectionIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
||||||
|
startActivity(redirectionIntent);
|
||||||
|
overridePendingTransition(0, 0);
|
||||||
|
} else if (Config.MAGIC_CREATE_DOMAIN != null) {
|
||||||
|
WelcomeActivity.launch(this);
|
||||||
|
} else {
|
||||||
|
Intent editAccount = new Intent(this, EditAccountActivity.class);
|
||||||
|
editAccount.putExtra("init", true);
|
||||||
|
editAccount.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
|
||||||
|
startActivity(editAccount);
|
||||||
|
overridePendingTransition(0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (conversationList.size() <= 0) {
|
||||||
|
if (mRedirected.compareAndSet(false, true)) {
|
||||||
|
redirectToStartConversationActivity(true);
|
||||||
|
}
|
||||||
|
} else if (selectConversationByUuid(mOpenConversation)) {
|
||||||
|
if (mPanelOpen) {
|
||||||
|
showConversationsOverview();
|
||||||
|
} else {
|
||||||
|
if (isConversationsOverviewHideable()) {
|
||||||
|
openConversation();
|
||||||
|
updateActionBarTitle(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.mConversationFragment.reInit(getSelectedConversation())) {
|
||||||
|
Log.d(Config.LOGTAG, "setting scroll position on fragment");
|
||||||
|
this.mConversationFragment.setScrollPosition(mScrollPosition);
|
||||||
|
}
|
||||||
|
mOpenConversation = null;
|
||||||
|
} else if (intent != null && ACTION_VIEW_CONVERSATION.equals(intent.getAction())) {
|
||||||
|
clearPending();
|
||||||
|
handleViewConversationIntent(intent);
|
||||||
|
intent.setAction(Intent.ACTION_MAIN);
|
||||||
|
} else if (getSelectedConversation() == null) {
|
||||||
|
reInitLatestConversation();
|
||||||
|
} else {
|
||||||
|
this.mConversationFragment.messageListAdapter.updatePreferences();
|
||||||
|
//this.mConversationFragment.messagesView.invalidateViews();
|
||||||
|
this.mConversationFragment.setupIme();
|
||||||
|
}
|
||||||
|
|
||||||
|
mConversationFragment.onBackendConnected();
|
||||||
|
|
||||||
|
/*if (!ExceptionHelper.checkForCrash(this, this.xmppConnectionService) && !mRedirected.get()) {
|
||||||
|
openBatteryOptimizationDialogIfNeeded();
|
||||||
|
}*/
|
||||||
|
if (isConversationsOverviewVisable() && isConversationsOverviewHideable()) {
|
||||||
|
xmppConnectionService.getNotificationService().setOpenConversation(null);
|
||||||
|
} else {
|
||||||
|
xmppConnectionService.getNotificationService().setOpenConversation(getSelectedConversation());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isStopping() {
|
||||||
|
if (Build.VERSION.SDK_INT >= 17) {
|
||||||
|
return isFinishing() || isDestroyed();
|
||||||
|
} else {
|
||||||
|
return isFinishing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reInitLatestConversation() {
|
||||||
|
showConversationsOverview();
|
||||||
|
clearPending();
|
||||||
|
setSelectedConversation(conversationList.get(0));
|
||||||
|
this.mConversationFragment.reInit(getSelectedConversation());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleViewConversationIntent(final Intent intent) {
|
||||||
|
final String uuid = intent.getStringExtra(CONVERSATION);
|
||||||
|
final String downloadUuid = intent.getStringExtra(EXTRA_DOWNLOAD_UUID);
|
||||||
|
final String text = intent.getStringExtra(TEXT);
|
||||||
|
final String nick = intent.getStringExtra(NICK);
|
||||||
|
final boolean pm = intent.getBooleanExtra(PRIVATE_MESSAGE, false);
|
||||||
|
this.mConversationFragment.stopScrolling();
|
||||||
|
if (selectConversationByUuid(uuid)) {
|
||||||
|
this.mConversationFragment.reInit(getSelectedConversation());
|
||||||
|
if (nick != null) {
|
||||||
|
if (pm) {
|
||||||
|
Jid jid = getSelectedConversation().getJid();
|
||||||
|
try {
|
||||||
|
Jid next = Jid.fromParts(jid.getLocalpart(), jid.getDomainpart(), nick);
|
||||||
|
this.mConversationFragment.privateMessageWith(next);
|
||||||
|
} catch (final InvalidJidException ignored) {
|
||||||
|
//do nothing
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.mConversationFragment.highlightInConference(nick);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.mConversationFragment.appendText(text);
|
||||||
|
}
|
||||||
|
hideConversationsOverview();
|
||||||
|
mUnprocessedNewIntent = false;
|
||||||
|
openConversation();
|
||||||
|
if (mContentView instanceof SlidingPaneLayout) {
|
||||||
|
updateActionBarTitle(true); //fixes bug where slp isn't properly closed yet
|
||||||
|
}
|
||||||
|
if (downloadUuid != null) {
|
||||||
|
final Message message = mSelectedConversation.findMessageWithFileAndUuid(downloadUuid);
|
||||||
|
if (message != null) {
|
||||||
|
//startDownloadable(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mUnprocessedNewIntent = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean selectConversationByUuid(String uuid) {
|
||||||
|
if (uuid == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (Conversation aConversationList : conversationList) {
|
||||||
|
if (aConversationList.getUuid().equals(uuid)) {
|
||||||
|
setSelectedConversation(aConversationList);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void unregisterListeners() {
|
||||||
|
super.unregisterListeners();
|
||||||
|
xmppConnectionService.getNotificationService().setOpenConversation(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
|
||||||
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
if (resultCode != RESULT_OK) {
|
||||||
|
if (requestCode == REQUEST_BATTERY_OP) {
|
||||||
|
setNeverAskForBatteryOptimizationsAgain();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getBatteryOptimizationPreferenceKey() {
|
||||||
|
@SuppressLint("HardwareIds") String device = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
|
||||||
|
return "show_battery_optimization" + (device == null ? "" : device);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setNeverAskForBatteryOptimizationsAgain() {
|
||||||
|
getPreferences().edit().putBoolean(getBatteryOptimizationPreferenceKey(), false).apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void openBatteryOptimizationDialogIfNeeded() {
|
||||||
|
if (hasAccountWithoutPush()
|
||||||
|
&& isOptimizingBattery()
|
||||||
|
&& getPreferences().getBoolean(getBatteryOptimizationPreferenceKey(), true)) {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
builder.setTitle(R.string.battery_optimizations_enabled);
|
||||||
|
builder.setMessage(R.string.battery_optimizations_enabled_dialog);
|
||||||
|
builder.setPositiveButton(R.string.next, (dialog, which) -> {
|
||||||
|
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
|
||||||
|
Uri uri = Uri.parse("package:" + getPackageName());
|
||||||
|
intent.setData(uri);
|
||||||
|
try {
|
||||||
|
startActivityForResult(intent, REQUEST_BATTERY_OP);
|
||||||
|
} catch (ActivityNotFoundException e) {
|
||||||
|
Toast.makeText(this, R.string.device_does_not_support_battery_op, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
||||||
|
builder.setOnDismissListener(dialog -> setNeverAskForBatteryOptimizationsAgain());
|
||||||
|
}
|
||||||
|
AlertDialog dialog = builder.create();
|
||||||
|
dialog.setCanceledOnTouchOutside(false);
|
||||||
|
dialog.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasAccountWithoutPush() {
|
||||||
|
for (Account account : xmppConnectionService.getAccounts()) {
|
||||||
|
if (account.getStatus() == Account.State.ONLINE && !xmppConnectionService.getPushManagementService().available(account)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateConversationList() {
|
||||||
|
xmppConnectionService.populateWithOrderedConversations(conversationList);
|
||||||
|
if (!conversationList.contains(mSelectedConversation)) {
|
||||||
|
mSelectedConversation = null;
|
||||||
|
}
|
||||||
|
if (swipedConversation != null) {
|
||||||
|
if (swipedConversation.isRead()) {
|
||||||
|
conversationList.remove(swipedConversation);
|
||||||
|
} else {
|
||||||
|
listView.discardUndo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
listAdapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void refreshUiReal() {
|
||||||
|
updateConversationList();
|
||||||
|
if (conversationList.size() > 0) {
|
||||||
|
if (!this.mConversationFragment.isAdded()) {
|
||||||
|
Log.d(Config.LOGTAG, "fragment NOT added to activity. detached=" + Boolean.toString(mConversationFragment.isDetached()));
|
||||||
|
}
|
||||||
|
if (getSelectedConversation() == null) {
|
||||||
|
reInitLatestConversation();
|
||||||
|
} else {
|
||||||
|
ConversationLegacyActivity.this.mConversationFragment.refresh();
|
||||||
|
updateActionBarTitle();
|
||||||
|
invalidateOptionsMenu();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!isStopping() && mRedirected.compareAndSet(false, true)) {
|
||||||
|
redirectToStartConversationActivity(false);
|
||||||
|
}
|
||||||
|
Log.d(Config.LOGTAG, "not updating conversations fragment because conversations list size was 0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAccountUpdate() {
|
||||||
|
this.refreshUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConversationUpdate() {
|
||||||
|
this.refreshUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRosterUpdate() {
|
||||||
|
this.refreshUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void OnUpdateBlocklist(Status status) {
|
||||||
|
this.refreshUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onShowErrorToast(final int resId) {
|
||||||
|
runOnUiThread(() -> Toast.makeText(ConversationLegacyActivity.this, resId, Toast.LENGTH_SHORT).show());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean highlightSelectedConversations() {
|
||||||
|
return !isConversationsOverviewHideable() || this.conversationWasSelectedByKeyboard;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,245 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2018, Daniel Gultsch All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
* are permitted provided that the following conditions are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
|
||||||
* list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
* this list of conditions and the following disclaimer in the documentation and/or
|
|
||||||
* other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* 3. Neither the name of the copyright holder nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software without
|
|
||||||
* specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
||||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package eu.siacs.conversations.ui;
|
|
||||||
|
|
||||||
|
|
||||||
import android.app.Fragment;
|
|
||||||
import android.app.FragmentManager;
|
|
||||||
import android.app.FragmentTransaction;
|
|
||||||
import android.databinding.DataBindingUtil;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.annotation.IdRes;
|
|
||||||
import android.support.v7.app.ActionBar;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import eu.siacs.conversations.Config;
|
|
||||||
import eu.siacs.conversations.R;
|
|
||||||
import eu.siacs.conversations.databinding.ActivityConversationsBinding;
|
|
||||||
import eu.siacs.conversations.entities.Conversation;
|
|
||||||
import eu.siacs.conversations.services.XmppConnectionService;
|
|
||||||
import eu.siacs.conversations.ui.interfaces.OnConversationArchived;
|
|
||||||
import eu.siacs.conversations.ui.interfaces.OnConversationRead;
|
|
||||||
import eu.siacs.conversations.ui.interfaces.OnConversationSelected;
|
|
||||||
import eu.siacs.conversations.ui.interfaces.OnConversationsListItemUpdated;
|
|
||||||
import eu.siacs.conversations.ui.service.EmojiService;
|
|
||||||
import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
|
|
||||||
|
|
||||||
public class ConversationsMainActivity extends XmppActivity implements OnConversationSelected, OnConversationArchived, OnConversationsListItemUpdated, OnConversationRead, XmppConnectionService.OnAccountUpdate, XmppConnectionService.OnConversationUpdate, XmppConnectionService.OnRosterUpdate, OnUpdateBlocklist, XmppConnectionService.OnShowErrorToast {
|
|
||||||
|
|
||||||
|
|
||||||
//secondary fragment (when holding the conversation, must be initialized before refreshing the overview fragment
|
|
||||||
private static final @IdRes int[] FRAGMENT_ID_NOTIFICATION_ORDER = {R.id.secondary_fragment, R.id.main_fragment};
|
|
||||||
|
|
||||||
private ActivityConversationsBinding binding;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void refreshUiReal() {
|
|
||||||
for(@IdRes int id : FRAGMENT_ID_NOTIFICATION_ORDER) {
|
|
||||||
refreshFragment(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
void onBackendConnected() {
|
|
||||||
for(@IdRes int id : FRAGMENT_ID_NOTIFICATION_ORDER) {
|
|
||||||
notifyFragmentOfBackendConnected(id);
|
|
||||||
}
|
|
||||||
invalidateActionBarTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void notifyFragmentOfBackendConnected(@IdRes int id) {
|
|
||||||
final Fragment fragment = getFragmentManager().findFragmentById(id);
|
|
||||||
if (fragment != null && fragment instanceof XmppFragment) {
|
|
||||||
((XmppFragment) fragment).onBackendConnected();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void refreshFragment(@IdRes int id) {
|
|
||||||
final Fragment fragment = getFragmentManager().findFragmentById(id);
|
|
||||||
if (fragment != null && fragment instanceof XmppFragment) {
|
|
||||||
((XmppFragment) fragment).refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(final Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
new EmojiService(this).init();
|
|
||||||
this.binding = DataBindingUtil.setContentView(this, R.layout.activity_conversations);
|
|
||||||
this.getFragmentManager().addOnBackStackChangedListener(this::invalidateActionBarTitle);
|
|
||||||
this.initializeFragments();
|
|
||||||
this.invalidateActionBarTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
getMenuInflater().inflate(R.menu.activity_conversations, menu);
|
|
||||||
return super.onCreateOptionsMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onConversationSelected(Conversation conversation) {
|
|
||||||
Log.d(Config.LOGTAG, "selected " + conversation.getName());
|
|
||||||
ConversationFragment conversationFragment = (ConversationFragment) getFragmentManager().findFragmentById(R.id.secondary_fragment);
|
|
||||||
final boolean mainNeedsRefresh;
|
|
||||||
if (conversationFragment == null) {
|
|
||||||
mainNeedsRefresh = false;
|
|
||||||
conversationFragment = new ConversationFragment();
|
|
||||||
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
|
|
||||||
fragmentTransaction.replace(R.id.main_fragment, conversationFragment);
|
|
||||||
fragmentTransaction.addToBackStack(null);
|
|
||||||
fragmentTransaction.commit();
|
|
||||||
} else {
|
|
||||||
mainNeedsRefresh = true;
|
|
||||||
}
|
|
||||||
conversationFragment.reInit(conversation);
|
|
||||||
if (mainNeedsRefresh) {
|
|
||||||
refreshFragment(R.id.main_fragment);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
switch (item.getItemId()) {
|
|
||||||
case android.R.id.home:
|
|
||||||
FragmentManager fm = getFragmentManager();
|
|
||||||
if (fm.getBackStackEntryCount() > 0) {
|
|
||||||
fm.popBackStack();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeFragments() {
|
|
||||||
FragmentTransaction transaction = getFragmentManager().beginTransaction();
|
|
||||||
Fragment mainFragment = getFragmentManager().findFragmentById(R.id.main_fragment);
|
|
||||||
Fragment secondaryFragment = getFragmentManager().findFragmentById(R.id.secondary_fragment);
|
|
||||||
if (mainFragment != null) {
|
|
||||||
Log.d(Config.LOGTAG,"initializeFragment(). main fragment exists");
|
|
||||||
if (binding.secondaryFragment != null) {
|
|
||||||
if (mainFragment instanceof ConversationFragment) {
|
|
||||||
Log.d(Config.LOGTAG,"gained secondary fragment. moving...");
|
|
||||||
getFragmentManager().popBackStack();
|
|
||||||
transaction.remove(mainFragment);
|
|
||||||
transaction.commit();
|
|
||||||
getFragmentManager().executePendingTransactions();
|
|
||||||
transaction = getFragmentManager().beginTransaction();
|
|
||||||
transaction.replace(R.id.secondary_fragment, mainFragment);
|
|
||||||
transaction.replace(R.id.main_fragment, new ConversationsOverviewFragment());
|
|
||||||
transaction.commit();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (secondaryFragment != null && secondaryFragment instanceof ConversationFragment) {
|
|
||||||
Log.d(Config.LOGTAG,"lost secondary fragment. moving...");
|
|
||||||
transaction.remove(secondaryFragment);
|
|
||||||
transaction.commit();
|
|
||||||
getFragmentManager().executePendingTransactions();
|
|
||||||
transaction = getFragmentManager().beginTransaction();
|
|
||||||
transaction.replace(R.id.main_fragment, secondaryFragment);
|
|
||||||
transaction.addToBackStack(null);
|
|
||||||
transaction.commit();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
transaction.replace(R.id.main_fragment, new ConversationsOverviewFragment());
|
|
||||||
}
|
|
||||||
if (binding.secondaryFragment != null) {
|
|
||||||
transaction.replace(R.id.secondary_fragment, new ConversationFragment());
|
|
||||||
}
|
|
||||||
transaction.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void invalidateActionBarTitle() {
|
|
||||||
final ActionBar actionBar = getSupportActionBar();
|
|
||||||
if (actionBar != null) {
|
|
||||||
Fragment mainFragment = getFragmentManager().findFragmentById(R.id.main_fragment);
|
|
||||||
if (mainFragment != null && mainFragment instanceof ConversationFragment) {
|
|
||||||
final Conversation conversation = ((ConversationFragment) mainFragment).getConversation();
|
|
||||||
if (conversation != null) {
|
|
||||||
actionBar.setTitle(conversation.getName());
|
|
||||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
actionBar.setTitle(R.string.app_name);
|
|
||||||
actionBar.setDisplayHomeAsUpEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onConversationArchived(Conversation conversation) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onConversationsListItemUpdated() {
|
|
||||||
Fragment fragment = getFragmentManager().findFragmentById(R.id.main_fragment);
|
|
||||||
if (fragment != null && fragment instanceof ConversationsOverviewFragment) {
|
|
||||||
((ConversationsOverviewFragment) fragment).refresh();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onConversationRead(Conversation conversation) {
|
|
||||||
Log.d(Config.LOGTAG, "read event for " + conversation.getName() + " received");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAccountUpdate() {
|
|
||||||
this.refreshUi();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onConversationUpdate() {
|
|
||||||
this.refreshUi();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRosterUpdate() {
|
|
||||||
this.refreshUi();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void OnUpdateBlocklist(OnUpdateBlocklist.Status status) {
|
|
||||||
this.refreshUi();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onShowErrorToast(int resId) {
|
|
||||||
runOnUiThread(() -> Toast.makeText(this, resId, Toast.LENGTH_SHORT).show());
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -33,6 +33,7 @@ import eu.siacs.conversations.R;
|
||||||
import eu.siacs.conversations.entities.Account;
|
import eu.siacs.conversations.entities.Account;
|
||||||
import eu.siacs.conversations.services.ExportLogsService;
|
import eu.siacs.conversations.services.ExportLogsService;
|
||||||
import eu.siacs.conversations.services.MemorizingTrustManager;
|
import eu.siacs.conversations.services.MemorizingTrustManager;
|
||||||
|
import eu.siacs.conversations.ui.util.Color;
|
||||||
import eu.siacs.conversations.xmpp.XmppConnection;
|
import eu.siacs.conversations.xmpp.XmppConnection;
|
||||||
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
|
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
|
||||||
import eu.siacs.conversations.xmpp.jid.Jid;
|
import eu.siacs.conversations.xmpp.jid.Jid;
|
||||||
|
@ -67,9 +68,7 @@ public class SettingsActivity extends XmppActivity implements
|
||||||
|
|
||||||
this.mTheme = findTheme();
|
this.mTheme = findTheme();
|
||||||
setTheme(this.mTheme);
|
setTheme(this.mTheme);
|
||||||
|
getWindow().getDecorView().setBackgroundColor(Color.get(this,R.attr.color_background_primary));
|
||||||
int bgcolor = getPrimaryBackgroundColor();
|
|
||||||
getWindow().getDecorView().setBackgroundColor(bgcolor);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,6 @@ import android.support.v7.app.ActionBar;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.text.InputType;
|
import android.text.InputType;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Pair;
|
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
@ -51,11 +50,8 @@ import android.widget.Toast;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.RejectedExecutionException;
|
import java.util.concurrent.RejectedExecutionException;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
|
||||||
import eu.siacs.conversations.Config;
|
import eu.siacs.conversations.Config;
|
||||||
import eu.siacs.conversations.R;
|
import eu.siacs.conversations.R;
|
||||||
|
@ -71,9 +67,7 @@ import eu.siacs.conversations.services.BarcodeProvider;
|
||||||
import eu.siacs.conversations.services.XmppConnectionService;
|
import eu.siacs.conversations.services.XmppConnectionService;
|
||||||
import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder;
|
import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder;
|
||||||
import eu.siacs.conversations.ui.util.PresenceSelector;
|
import eu.siacs.conversations.ui.util.PresenceSelector;
|
||||||
import eu.siacs.conversations.utils.CryptoHelper;
|
|
||||||
import eu.siacs.conversations.utils.ExceptionHelper;
|
import eu.siacs.conversations.utils.ExceptionHelper;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
|
||||||
import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
|
import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
|
||||||
import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
|
import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
|
||||||
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
|
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
|
||||||
|
@ -507,27 +501,25 @@ public abstract class XmppActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void switchToConversation(Conversation conversation, String text, String nick, boolean pm, boolean newTask) {
|
private void switchToConversation(Conversation conversation, String text, String nick, boolean pm, boolean newTask) {
|
||||||
Intent viewConversationIntent = new Intent(this,
|
Intent intent = new Intent(this, ConversationActivity.class);
|
||||||
ConversationActivity.class);
|
intent.setAction(ConversationActivity.ACTION_VIEW_CONVERSATION);
|
||||||
viewConversationIntent.setAction(ConversationActivity.ACTION_VIEW_CONVERSATION);
|
intent.putExtra(ConversationActivity.EXTRA_CONVERSATION, conversation.getUuid());
|
||||||
viewConversationIntent.putExtra(ConversationActivity.CONVERSATION,
|
|
||||||
conversation.getUuid());
|
|
||||||
if (text != null) {
|
if (text != null) {
|
||||||
viewConversationIntent.putExtra(ConversationActivity.TEXT, text);
|
intent.putExtra(ConversationActivity.EXTRA_TEXT, text);
|
||||||
}
|
}
|
||||||
if (nick != null) {
|
if (nick != null) {
|
||||||
viewConversationIntent.putExtra(ConversationActivity.NICK, nick);
|
intent.putExtra(ConversationActivity.EXTRA_NICK, nick);
|
||||||
viewConversationIntent.putExtra(ConversationActivity.PRIVATE_MESSAGE, pm);
|
intent.putExtra(ConversationActivity.EXTRA_IS_PRIVATE_MESSAGE, pm);
|
||||||
}
|
}
|
||||||
if (newTask) {
|
if (newTask) {
|
||||||
viewConversationIntent.setFlags(viewConversationIntent.getFlags()
|
intent.setFlags(intent.getFlags()
|
||||||
| Intent.FLAG_ACTIVITY_NEW_TASK
|
| Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||||
} else {
|
} else {
|
||||||
viewConversationIntent.setFlags(viewConversationIntent.getFlags()
|
intent.setFlags(intent.getFlags()
|
||||||
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
}
|
}
|
||||||
startActivity(viewConversationIntent);
|
startActivity(intent);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -823,14 +815,6 @@ public abstract class XmppActivity extends AppCompatActivity {
|
||||||
return this.mColorGreen;
|
return this.mColorGreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getPrimaryBackgroundColor() {
|
|
||||||
return this.mPrimaryBackgroundColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSecondaryBackgroundColor() {
|
|
||||||
return this.mSecondaryBackgroundColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getPixel(int dp) {
|
public int getPixel(int dp) {
|
||||||
DisplayMetrics metrics = getResources().getDisplayMetrics();
|
DisplayMetrics metrics = getResources().getDisplayMetrics();
|
||||||
return ((int) (dp * metrics.density));
|
return ((int) (dp * metrics.density));
|
||||||
|
|
|
@ -25,9 +25,9 @@ import eu.siacs.conversations.R;
|
||||||
import eu.siacs.conversations.entities.Conversation;
|
import eu.siacs.conversations.entities.Conversation;
|
||||||
import eu.siacs.conversations.entities.Message;
|
import eu.siacs.conversations.entities.Message;
|
||||||
import eu.siacs.conversations.entities.Transferable;
|
import eu.siacs.conversations.entities.Transferable;
|
||||||
import eu.siacs.conversations.ui.ConversationActivity;
|
|
||||||
import eu.siacs.conversations.ui.ConversationFragment;
|
import eu.siacs.conversations.ui.ConversationFragment;
|
||||||
import eu.siacs.conversations.ui.XmppActivity;
|
import eu.siacs.conversations.ui.XmppActivity;
|
||||||
|
import eu.siacs.conversations.ui.util.Color;
|
||||||
import eu.siacs.conversations.ui.widget.UnreadCountCustomView;
|
import eu.siacs.conversations.ui.widget.UnreadCountCustomView;
|
||||||
import eu.siacs.conversations.utils.EmojiWrapper;
|
import eu.siacs.conversations.utils.EmojiWrapper;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
import eu.siacs.conversations.utils.UIHelper;
|
||||||
|
@ -48,13 +48,12 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
|
||||||
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||||
view = inflater.inflate(R.layout.conversation_list_row,parent, false);
|
view = inflater.inflate(R.layout.conversation_list_row,parent, false);
|
||||||
}
|
}
|
||||||
|
ViewHolder viewHolder = ViewHolder.get(view);
|
||||||
Conversation conversation = getItem(position);
|
Conversation conversation = getItem(position);
|
||||||
if (this.activity instanceof XmppActivity) {
|
if (this.activity instanceof XmppActivity) {
|
||||||
View swipeableItem = view.findViewById(R.id.swipeable_item);
|
int c = Color.get(activity, conversation == selectedConversation ? R.attr.color_background_secondary: R.attr.color_background_primary);
|
||||||
int c = conversation == selectedConversation ? this.activity.getSecondaryBackgroundColor() : this.activity.getPrimaryBackgroundColor();
|
viewHolder.swipeableItem.setBackgroundColor(c);
|
||||||
swipeableItem.setBackgroundColor(c);
|
|
||||||
}
|
}
|
||||||
ViewHolder viewHolder = ViewHolder.get(view);
|
|
||||||
if (conversation.getMode() == Conversation.MODE_SINGLE || activity.useSubjectToIdentifyConference()) {
|
if (conversation.getMode() == Conversation.MODE_SINGLE || activity.useSubjectToIdentifyConference()) {
|
||||||
viewHolder.name.setText(EmojiWrapper.transform(conversation.getName()));
|
viewHolder.name.setText(EmojiWrapper.transform(conversation.getName()));
|
||||||
} else {
|
} else {
|
||||||
|
@ -182,6 +181,7 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ViewHolder {
|
public static class ViewHolder {
|
||||||
|
private View swipeableItem;
|
||||||
private TextView name;
|
private TextView name;
|
||||||
private TextView lastMessage;
|
private TextView lastMessage;
|
||||||
private ImageView lastMessageIcon;
|
private ImageView lastMessageIcon;
|
||||||
|
@ -199,6 +199,7 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
|
||||||
ViewHolder viewHolder = (ViewHolder) layout.getTag();
|
ViewHolder viewHolder = (ViewHolder) layout.getTag();
|
||||||
if (viewHolder == null) {
|
if (viewHolder == null) {
|
||||||
viewHolder = new ViewHolder();
|
viewHolder = new ViewHolder();
|
||||||
|
viewHolder.swipeableItem = layout.findViewById(R.id.swipeable_item);
|
||||||
viewHolder.name = layout.findViewById(R.id.conversation_name);
|
viewHolder.name = layout.findViewById(R.id.conversation_name);
|
||||||
viewHolder.lastMessage = layout.findViewById(R.id.conversation_lastmsg);
|
viewHolder.lastMessage = layout.findViewById(R.id.conversation_lastmsg);
|
||||||
viewHolder.lastMessageIcon = layout.findViewById(R.id.conversation_lastmsg_img);
|
viewHolder.lastMessageIcon = layout.findViewById(R.id.conversation_lastmsg_img);
|
||||||
|
|
|
@ -63,8 +63,6 @@ import eu.siacs.conversations.entities.Transferable;
|
||||||
import eu.siacs.conversations.persistance.FileBackend;
|
import eu.siacs.conversations.persistance.FileBackend;
|
||||||
import eu.siacs.conversations.services.MessageArchiveService;
|
import eu.siacs.conversations.services.MessageArchiveService;
|
||||||
import eu.siacs.conversations.services.NotificationService;
|
import eu.siacs.conversations.services.NotificationService;
|
||||||
import eu.siacs.conversations.ui.ConversationActivity;
|
|
||||||
import eu.siacs.conversations.ui.ConversationsMainActivity;
|
|
||||||
import eu.siacs.conversations.ui.XmppActivity;
|
import eu.siacs.conversations.ui.XmppActivity;
|
||||||
import eu.siacs.conversations.ui.service.AudioPlayer;
|
import eu.siacs.conversations.ui.service.AudioPlayer;
|
||||||
import eu.siacs.conversations.ui.text.DividerSpan;
|
import eu.siacs.conversations.ui.text.DividerSpan;
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, Daniel Gultsch All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation and/or
|
||||||
|
* other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software without
|
||||||
|
* specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package eu.siacs.conversations.ui.util;
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.support.annotation.AttrRes;
|
||||||
|
import android.support.annotation.ColorInt;
|
||||||
|
import android.util.TypedValue;
|
||||||
|
|
||||||
|
public class Color {
|
||||||
|
|
||||||
|
public static @ColorInt int get(Context context, @AttrRes int attr) {
|
||||||
|
TypedValue typedValue = new TypedValue();
|
||||||
|
Resources.Theme theme = context.getTheme();
|
||||||
|
theme.resolveAttribute(attr, typedValue, true);
|
||||||
|
return typedValue.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -37,7 +37,6 @@ import android.preference.PreferenceManager;
|
||||||
import eu.siacs.conversations.R;
|
import eu.siacs.conversations.R;
|
||||||
import eu.siacs.conversations.entities.Conversation;
|
import eu.siacs.conversations.entities.Conversation;
|
||||||
import eu.siacs.conversations.entities.Presence;
|
import eu.siacs.conversations.entities.Presence;
|
||||||
import eu.siacs.conversations.ui.ConversationActivity;
|
|
||||||
import eu.siacs.conversations.ui.ConversationFragment;
|
import eu.siacs.conversations.ui.ConversationFragment;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
import eu.siacs.conversations.utils.UIHelper;
|
||||||
|
|
||||||
|
|
|
@ -9,13 +9,13 @@
|
||||||
android:id="@+id/main_fragment"
|
android:id="@+id/main_fragment"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_weight="1"/>
|
android:layout_weight="1000"/>
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/secondary_fragment"
|
android:id="@+id/secondary_fragment"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_weight="2"/>
|
android:layout_weight="1618"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<layout xmlns:android="http://schemas.android.com/apk/res/android">
|
<layout xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
|
android:background="?attr/color_background_primary"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue