/* * Created by Itzik Braun on 12/3/2015. * Copyright (c) 2015 deluge. All rights reserved. * * Last Modification at: 3/12/15 4:27 PM */ package com.braunster.chatsdk.fragments; import android.app.FragmentManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import android.widget.ProgressBar; import com.braunster.chatsdk.R; import com.braunster.chatsdk.Utils.Debug; import com.braunster.chatsdk.Utils.DialogUtils; import com.braunster.chatsdk.adapter.ChatSDKThreadsListAdapter; import com.braunster.chatsdk.dao.BThread; import com.braunster.chatsdk.dao.entities.Entity; import com.braunster.chatsdk.network.BNetworkManager; import com.braunster.chatsdk.network.events.BatchedEvent; import com.braunster.chatsdk.network.events.Event; import com.braunster.chatsdk.object.BError; import com.braunster.chatsdk.object.Batcher; import com.braunster.chatsdk.object.ChatSDKThreadPool; import com.braunster.chatsdk.object.UIUpdater; import org.jdeferred.DoneCallback; import org.jdeferred.FailCallback; import java.util.List; import timber.log.Timber; /** * Created by itzik on 6/17/2014. */ public class ChatSDKThreadsFragment extends ChatSDKBaseFragment { private static final String TAG = ChatSDKThreadsFragment.class.getSimpleName(); private static boolean DEBUG = Debug.ThreadsFragment; public static final String APP_EVENT_TAG= "ChatRoomsFrag"; private ListView listThreads; private ChatSDKThreadsListAdapter adapter; private ProgressBar progressBar; private UIUpdater uiUpdater; public static ChatSDKThreadsFragment newInstance() { return new ChatSDKThreadsFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { init(inflater); loadDataOnBackground(); return mainView; } private void init(LayoutInflater inflater){ mainView = inflater.inflate(R.layout.chat_sdk_activity_threads, null); initViews(); } @Override public void initViews() { listThreads = (ListView) mainView.findViewById(R.id.list_threads); progressBar = (ProgressBar) mainView.findViewById(R.id.chat_sdk_progress_bar); initList(); } private void initList(){ adapter = new ChatSDKThreadsListAdapter(getActivity()); listThreads.setAdapter(adapter); listThreads.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { startChatActivityForID(adapter.getItem(position).getId()); } }); } @Override public void loadData() { super.loadData(); if (mainView == null) return; adapter.setThreadItems(BNetworkManager.sharedManager().getNetworkAdapter().threadItemsWithType(BThread.Type.Public, adapter.getItemMaker())); } @Override public void loadDataOnBackground() { super.loadDataOnBackground(); if (mainView == null) return; final boolean isFirst; if (uiUpdater != null) { isFirst = false; uiUpdater.setKilled(true); ChatSDKThreadPool.getInstance().removeSchedule(uiUpdater); } else { isFirst = true; } final boolean noItems = adapter != null && adapter.getThreadItems().size() == 0; if (isFirst && noItems) { listThreads.setVisibility(View.INVISIBLE); progressBar.setVisibility(View.VISIBLE); } uiUpdater = new UIUpdater() { @Override public void run() { if (isKilled() && !isFirst && noItems) return; Message message = new Message(); message.what = 1; message.obj = BNetworkManager.sharedManager().getNetworkAdapter().threadItemsWithType(BThread.Type.Public, adapter.getItemMaker()); handler.sendMessageAtFrontOfQueue(message); uiUpdater = null; } }; ChatSDKThreadPool.getInstance().scheduleExecute(uiUpdater, noItems && isFirst ? 0 : isFirst ? 1 : 4); } @Override public void refreshForEntity(Entity entity) { super.refreshForEntity(entity); adapter.replaceOrAddItem((BThread) entity); } private Handler handler = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: adapter.setThreadItems((List<ChatSDKThreadsListAdapter.ThreadListItem>) msg.obj); progressBar.setVisibility(View.GONE); listThreads.setVisibility(View.VISIBLE); break; } } }; @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); MenuItem item = menu.add(Menu.NONE, R.id.action_chat_sdk_add, 10, getString(R.string.public_thread_fragment_add_item_text)); item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); item.setIcon(R.drawable.ic_plus); } @Override public boolean onOptionsItemSelected(MenuItem item) { /* Cant use switch in the library*/ int id = item.getItemId(); if (id == R.id.action_chat_sdk_add) { FragmentManager fm = getActivity().getFragmentManager(); final DialogUtils.ChatSDKEditTextDialog dialog = DialogUtils.ChatSDKEditTextDialog.getInstace(); dialog.setTitleAndListen( getString(R.string.add_public_chat_dialog_title), new DialogUtils.ChatSDKEditTextDialog.EditTextDialogInterface() { @Override public void onFinished(final String s) { showProgDialog(getString(R.string.add_public_chat_dialog_progress_message)); BNetworkManager.sharedManager().getNetworkAdapter().createPublicThreadWithName(s) .done(new DoneCallback<BThread>() { @Override public void onDone(final BThread thread) { // Add the current user to the thread. getNetworkAdapter().addUsersToThread(thread, BNetworkManager.sharedManager().getNetworkAdapter().currentUserModel()) .done(new DoneCallback<BThread>() { @Override public void onDone(BThread thread) { dismissProgDialog(); adapter.addRow(thread); showToast( getString(R.string.add_public_chat_dialog_toast_success_before_thread_name) + s + getString(R.string.add_public_chat_dialog_toast_success_after_thread_name) ) ; } }); } }) .fail(new FailCallback<BError>() { @Override public void onFail(BError bError) { showAlertToast(getString(R.string.add_public_chat_dialog_toast_error_before_thread_name) + s); if (DEBUG) Timber.e("Error: %s", bError.message); dismissProgDialog(); } }); } }); dialog.show(fm, "Add Public Chat Dialog"); return true; } return super.onOptionsItemSelected(item); } @Override public void onResume() { super.onResume(); BatchedEvent batchedEvents = new BatchedEvent(APP_EVENT_TAG, "", Event.Type.AppEvent, handler); batchedEvents.setBatchedAction(Event.Type.AppEvent, 3000, new Batcher.BatchedAction<String>() { @Override public void triggered(List<String> list) { loadDataOnBackground(); } }); getNetworkAdapter().getEventManager().removeEventByTag(APP_EVENT_TAG); getNetworkAdapter().getEventManager().addEvent(batchedEvents); } }