/* * 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.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Looper; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import com.braunster.chatsdk.R; import com.braunster.chatsdk.Utils.helper.ChatSDKUiHelper; import com.braunster.chatsdk.dao.BThread; import com.braunster.chatsdk.dao.BUser; import com.braunster.chatsdk.dao.entities.Entity; import com.braunster.chatsdk.network.AbstractNetworkAdapter; import com.braunster.chatsdk.network.BNetworkManager; import com.braunster.chatsdk.object.BError; import com.github.johnpersano.supertoasts.SuperToast; import org.apache.commons.lang3.StringUtils; import org.jdeferred.DoneCallback; import org.jdeferred.FailCallback; import org.jdeferred.Promise; import java.util.concurrent.Callable; /** * Created by itzik on 6/17/2014. */ public abstract class ChatSDKBaseFragment extends android.app.DialogFragment implements ChatSDKBaseFragmentInterface { private static final String TAG = ChatSDKBaseFragment.class.getSimpleName(); private static final boolean DEBUG = true; private ProgressDialog progressDialog; protected View mainView; protected ChatSDKUiHelper chatSDKUiHelper; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); chatSDKUiHelper = ChatSDKUiHelper.getInstance().get(getActivity()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onResume() { super.onResume(); } @Override public void refresh() { loadData(); } @Override public void refreshOnBackground() { loadDataOnBackground(); } @Override public void refreshForEntity(Entity entity) { } @Override public void loadData() { } @Override public void loadDataOnBackground() { } @Override public void clearData() { } /** Set up the ui so every view and nested view that is not EditText will listen to touch event and dismiss the keyboard if touched.*/ public void setupTouchUIToDismissKeyboard(View view) { ChatSDKUiHelper.setupTouchUIToDismissKeyboard(view, new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { ChatSDKUiHelper.hideSoftKeyboard(getActivity()); return false; } }); } public void setupTouchUIToDismissKeyboard(View view, final Integer... exceptIDs) { ChatSDKUiHelper.setupTouchUIToDismissKeyboard(view, new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { ChatSDKUiHelper.hideSoftKeyboard(getActivity()); return false; } }, exceptIDs); } public void setupTouchUIToDismissKeyboard(View view, View.OnTouchListener onTouchListener, final Integer... exceptIDs) { ChatSDKUiHelper.setupTouchUIToDismissKeyboard(view, onTouchListener, exceptIDs); } @Override public void initViews() { } /** Show a SuperToast with the given text. */ protected void showToast(String text){ if (chatSDKUiHelper==null || StringUtils.isEmpty(text)) return; chatSDKUiHelper.getToast().setText(text); chatSDKUiHelper.getToast().show(); } protected void showAlertToast(String text){ if (chatSDKUiHelper==null || StringUtils.isEmpty(text)) return; chatSDKUiHelper.getAlertToast().setText(text); chatSDKUiHelper.getAlertToast().show(); } /** Start the chat activity for the given thread id. * @param id is the long value of local db id.*/ public void startChatActivityForID(long id){ if (chatSDKUiHelper != null) chatSDKUiHelper.startChatActivityForID(id); } public void startLoginActivity(boolean loggedOut){ if (chatSDKUiHelper != null) chatSDKUiHelper.startLoginActivity(loggedOut); } public void startMainActivity(){ if (chatSDKUiHelper != null) chatSDKUiHelper.startMainActivity(); } public void startSearchActivity() { if (chatSDKUiHelper != null) chatSDKUiHelper.startSearchActivity(); } public void startPickFriendsActivity() { if (chatSDKUiHelper != null) chatSDKUiHelper.startPickFriendsActivity(); } public void startShareWithFriendsActivity() { if (chatSDKUiHelper != null) chatSDKUiHelper.startShareWithFriendsActivity(); } public void startShareLocationActivityActivity() { if (chatSDKUiHelper != null) chatSDKUiHelper.startShareLocationActivityActivity(); } /** Create or fetch chat for users, Opens the chat when done.*/ protected Promise<BThread, BError, Void> createAndOpenThreadWithUsers(String name, BUser...users){ return createThreadWithUsers(name, true, users); } /** Create or fetch chat for users. Opens the chat if wanted.*/ protected Promise<BThread, BError, Void> createThreadWithUsers(String name, final boolean openChatWhenDone, BUser... users) { return getNetworkAdapter().createThreadWithUsers(name, users) .done(new DoneCallback<BThread>() { @Override public void onDone(BThread thread) { if (thread != null) { if (openChatWhenDone) startChatActivityForID(thread.getId()); } } }) .fail(new FailCallback<BError>() { @Override public void onFail(BError error) { if (isOnMainThread()) showAlertToast(getString(R.string.create_thread_with_users_fail_toast)); else getActivity().runOnUiThread(new Runnable() { @Override public void run() { showAlertToast(getString(R.string.create_thread_with_users_fail_toast)); } }); } }); } protected void showProgDialog(String message){ if (progressDialog == null) progressDialog = new ProgressDialog(getActivity()); if (!progressDialog.isShowing()) { progressDialog = new ProgressDialog(getActivity()); progressDialog.setMessage(message); progressDialog.show(); } } protected void showOrUpdateProgDialog(String message){ if (progressDialog == null) progressDialog = new ProgressDialog(getActivity()); if (!progressDialog.isShowing()) { progressDialog = new ProgressDialog(getActivity()); progressDialog.setMessage(message); progressDialog.show(); } else progressDialog.setMessage(message); } protected void dismissProgDialog(){ try { if (progressDialog != null && progressDialog.isShowing()) progressDialog.dismiss(); } catch (Exception e) { // For handling orientation changed. e.printStackTrace(); } } protected boolean isOnMainThread() { if (Looper.myLooper() != Looper.getMainLooper()) { return false; } return true; } protected void showAlertDialog(String title, String alert, String p, String n, final Callable neg, final Callable pos){ final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity()); // set title if not null if (StringUtils.isNotBlank(title)) alertDialogBuilder.setTitle(title); // set dialog message alertDialogBuilder .setMessage(alert) .setCancelable(false) .setPositiveButton(p, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { if (pos != null) try { pos.call(); } catch (Exception e) { e.printStackTrace(); } dialog.dismiss(); } }) .setNegativeButton(n, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // if this button is clicked, just close // the dialog box and do nothing if (neg != null) try { neg.call(); } catch (Exception e) { e.printStackTrace(); } dialog.cancel(); } }); // create alert dialog AlertDialog alertDialog = alertDialogBuilder.create(); // show it alertDialog.show(); } protected class DeleteThread implements Callable{ private String threadID; public DeleteThread(String threadID){ this.threadID = threadID; } @Override public Object call() throws Exception { getNetworkAdapter().deleteThreadWithEntityID(threadID) .done(new DoneCallback<Void>() { @Override public void onDone(Void aVoid) { showToast( getString(R.string.delete_thread_success_toast) ); refreshOnBackground(); } }) .fail(new FailCallback<BError>() { @Override public void onFail(BError error) { showAlertToast( getString(R.string.delete_thread_fail_toast) ); } }); return null; } } @Override public AbstractNetworkAdapter getNetworkAdapter() { return BNetworkManager.sharedManager().getNetworkAdapter(); } /** Authenticates the current user.*/ public Promise<BUser, BError, Void> authenticate(){ return getNetworkAdapter().checkUserAuthenticated(); } public void setChatSDKUiHelper(ChatSDKUiHelper chatSDKUiHelper) { this.chatSDKUiHelper = chatSDKUiHelper; } public void setToast(SuperToast toast) { chatSDKUiHelper.setToast(toast); } public SuperToast getToast() { return chatSDKUiHelper.getToast(); } public SuperToast getAlertToast() { return chatSDKUiHelper.getAlertToast(); } } interface ChatSDKBaseFragmentInterface extends ChatSDKUiHelper.ChatSDKUiHelperInterface{ public void refresh(); public void refreshOnBackground(); public void loadData(); public void loadDataOnBackground(); public void initViews(); public void clearData(); public void refreshForEntity(Entity entity); public AbstractNetworkAdapter getNetworkAdapter(); }