/* * 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.activities; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.preference.PreferenceManager; import android.support.v4.view.ViewPager; import android.view.Menu; import android.view.MenuItem; import com.astuetz.pagersslidingtabstrip.PagerSlidingTabStrip; import com.braunster.chatsdk.R; import com.braunster.chatsdk.Utils.Debug; import com.braunster.chatsdk.Utils.ExitHelper; import com.braunster.chatsdk.Utils.NotificationUtils; import com.braunster.chatsdk.Utils.Utils; import com.braunster.chatsdk.Utils.helper.OpenFromPushChecker; import com.braunster.chatsdk.activities.abstracted.ChatSDKAbstractChatActivity; import com.braunster.chatsdk.adapter.AbstractChatSDKTabsAdapter; import com.braunster.chatsdk.adapter.PagerAdapterTabs; import com.braunster.chatsdk.dao.BMessage; import com.braunster.chatsdk.dao.BThread; import com.braunster.chatsdk.fragments.ChatSDKBaseFragment; import com.braunster.chatsdk.network.BDefines; import com.braunster.chatsdk.network.BNetworkManager; import com.braunster.chatsdk.network.events.AppEventListener; import com.braunster.chatsdk.object.ChatSDKThreadPool; import com.braunster.chatsdk.object.UIUpdater; import org.apache.commons.lang3.StringUtils; import timber.log.Timber; public class ChatSDKMainActivity extends ChatSDKBaseActivity { private static boolean DEBUG = Debug.MainActivity; private ExitHelper exitHelper; private PagerSlidingTabStrip tabs; private ViewPager pager; protected AbstractChatSDKTabsAdapter adapter; private static final String FIRST_TIME_IN_APP = "First_Time_In_App"; public static final String PAGE_ADAPTER_POS = "page_adapter_pos"; public static final String Action_Contacts_Added = "com.braunster.androidchatsdk.action.contact_added"; public static final String Action_clear_data = "com.braunster.androidchatsdk.action.logged_out"; public static final String Action_Refresh_Fragment = "com.braunster.androidchatsdk.action.refresh_fragment"; private int pageAdapterPos = -1; private OpenFromPushChecker mOpenFromPushChecker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); exitHelper = new ExitHelper(this); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { // Activity was brought to front and not created, // Thus finishing this will get us to the last viewed activity finish(); return; } setContentView(R.layout.chat_sdk_activity_view_pager); firstTimeInApp(); initViews(); enableCheckOnlineOnResumed(true); if (!fromLoginActivity && savedInstanceState != null) { pager.setCurrentItem(savedInstanceState.getInt(PAGE_ADAPTER_POS)); } mOpenFromPushChecker = new OpenFromPushChecker(); if(mOpenFromPushChecker.checkOnCreate(getIntent(), savedInstanceState)) { startChatActivityForID(getIntent().getExtras().getLong(ChatSDKAbstractChatActivity.THREAD_ID)); return; } } @Override protected void onResume() { super.onResume(); ChatSDKThreadPool.getInstance().execute(new Runnable() { @Override public void run() { getNetworkAdapter().getEventManager().removeEventByTag(appEventListener.getTag()); getNetworkAdapter().getEventManager().addEvent(appEventListener); tabs.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { private int lastPage = 0; private int refreshContactsInterval = 4000; private long lastContactsRefresh = 0; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // if (DEBUG) Log.v(TAG, "onPageScrolled"); } @Override public void onPageSelected(int position) { if (DEBUG) Timber.v("onPageSelected, Pos: %s, Last: %s", position, lastPage); pageAdapterPos = position; lastPage = position; } @Override public void onPageScrollStateChanged(int state) { // if (DEBUG) Log.v(TAG, "onPageScrollStateChanged"); } }); IntentFilter intentFilter = new IntentFilter(Action_Contacts_Added); intentFilter.addAction(Action_clear_data); intentFilter.addAction(Action_Refresh_Fragment); registerReceiver(mainReceiver, intentFilter); } }); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); if (mOpenFromPushChecker == null) mOpenFromPushChecker = new OpenFromPushChecker(); if (mOpenFromPushChecker.checkOnNewIntent(intent)) { startChatActivityForID(intent.getExtras().getLong(ChatSDKAbstractChatActivity.THREAD_ID)); return; } if (adapter != null) { ChatSDKBaseFragment pro = getFragment(AbstractChatSDKTabsAdapter.Profile), conv = getFragment(PagerAdapterTabs.Conversations); if (conv!=null) conv.refreshOnBackground(); if (pro != null) pro.refresh(); } } private AppEventListener appEventListener = new AppEventListener("MainActivity") { private final int messageDelay = 3000; private UIUpdater uiUpdaterMessages; @Override public boolean onMessageReceived(final BMessage message) { // Only notify for private threads. if (message.getThread().getTypeSafely() == BThread.Type.Public) { return false; } // Make sure the message that incoming is not the user message. if (message.getBUserSender().getEntityID().equals( BNetworkManager.sharedManager().getNetworkAdapter().currentUserModel().getEntityID())) return false; if (uiUpdaterMessages != null) uiUpdaterMessages.setKilled(true); handler.removeCallbacks(uiUpdaterMessages); uiUpdaterMessages = new UIUpdater(){ @Override public void run() { if (!isKilled()) { // We check to see that the ChatActivity is not listening to this messages so we wont alert twice. if (!getNetworkAdapter().getEventManager().isEventTagExist(ChatSDKChatActivity.MessageListenerTAG + message.getThread())) { // Checking if the message has a sender with a name, Also if the message was read. if (message.getBUserSender().getMetaName() != null && !message.wasRead()) { NotificationUtils.createMessageNotification(ChatSDKMainActivity.this, message); } } } } }; handler.postDelayed(uiUpdaterMessages, messageDelay); return false; } }; static final Handler handler = new Handler(Looper.getMainLooper()); @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(PAGE_ADAPTER_POS, pageAdapterPos); mOpenFromPushChecker.onSaveInstanceState(outState); } private void initViews(){ pager = (ViewPager) findViewById(R.id.pager); tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs); // Only creates the adapter if it wasn't initiated already if (adapter == null) adapter = new PagerAdapterTabs(getFragmentManager()); pager.setAdapter(adapter); tabs.setViewPager(pager); pager.setOffscreenPageLimit(3); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_chat_sdk, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.android_settings) { // FIXME Clearing the cache, Just for debug. /*final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); VolleyUtils.getBitmapCache().resize(1); VolleyUtils.getBitmapCache().resize(maxMemory / 8);*/ return true; } else if (item.getItemId() == R.id.contact_developer) { if(StringUtils.isNotEmpty(BDefines.ContactDeveloper_Email)) { Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts( "mailto", BDefines.ContactDeveloper_Email, null)); emailIntent.putExtra(Intent.EXTRA_SUBJECT, BDefines.ContactDeveloper_Subject); startActivity(Intent.createChooser(emailIntent, BDefines.ContactDeveloper_DialogTitle)); } return true; } return super.onOptionsItemSelected(item); } @Override protected void onDestroy() { super.onDestroy(); // If the register did not had a chance to register due to orientation change. try{ unregisterReceiver(mainReceiver); }catch (IllegalArgumentException e){ // No need to handle the exception. } } private void firstTimeInApp(){ if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(FIRST_TIME_IN_APP, true)) { // Creating the images directory if not exist. Utils.ImageSaver.getAlbumStorageDir(this, BDefines.ImageDirName); PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean(FIRST_TIME_IN_APP, false).apply(); } } /** Refresh the contacts fragment when a contact added action is received. * Clear Fragments data when logged out. * Refresh Fragment when wanted.*/ private BroadcastReceiver mainReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Action_Contacts_Added)) { ChatSDKBaseFragment contacts = getFragment(AbstractChatSDKTabsAdapter.Contacts); if (contacts != null) contacts.refreshOnBackground(); if (intent.getExtras().containsKey(ChatSDKSearchActivity.USER_IDS_LIST)) { String[] ids = intent.getStringArrayExtra(ChatSDKSearchActivity.USER_IDS_LIST); for (String id : ids) getNetworkAdapter().getEventManager().userMetaOn(id, null); } } else if (intent.getAction().equals(Action_clear_data)) { clearData(); } else if (intent.getAction().equals(Action_Refresh_Fragment)) { if (intent.getExtras() == null) return; if (!intent.getExtras().containsKey(PAGE_ADAPTER_POS)) return; int fragment = intent.getExtras().getInt(PAGE_ADAPTER_POS); ChatSDKBaseFragment frag = getFragment(fragment); if (frag!= null) frag.refresh(); } else if (intent.getAction().equals(ChatSDKAbstractChatActivity.ACTION_CHAT_CLOSED)) { getFragment(AbstractChatSDKTabsAdapter.Conversations).loadDataOnBackground(); } } }; private void clearData(){ ChatSDKBaseFragment contacts = getFragment(AbstractChatSDKTabsAdapter.Contacts); if (contacts != null) contacts.clearData(); ChatSDKBaseFragment conv = getFragment(AbstractChatSDKTabsAdapter.Conversations); if (conv != null) conv.clearData(); ChatSDKBaseFragment pro = getFragment(AbstractChatSDKTabsAdapter.Profile); if (pro != null) pro.clearData(); } /* Exit Stuff*/ @Override public void onBackPressed() { exitHelper.triggerExit(); } /** After screen orientation chage the getItem from the fragment page adapter is no null but it is not visible to the user * so we have to use this workaround so when we call any method on the wanted fragment the fragment will respond. * http://stackoverflow.com/a/7393477/2568492*/ private ChatSDKBaseFragment getFragment(int index){ return ((ChatSDKBaseFragment) getFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + index)); } }