package com.abewy.android.apps.klyph.messenger.app;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.widget.SlidingPaneLayout;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import com.abewy.android.apps.klyph.core.KlyphDevice;
import com.abewy.android.apps.klyph.core.KlyphFlags;
import com.abewy.android.apps.klyph.core.KlyphSession;
import com.abewy.android.apps.klyph.core.fql.Friend;
import com.abewy.android.apps.klyph.core.fql.MessageThread;
import com.abewy.android.apps.klyph.core.fql.User;
import com.abewy.android.apps.klyph.core.util.AlertUtil;
import com.abewy.android.apps.klyph.core.util.AttrUtil;
import com.abewy.android.apps.klyph.core.util.FacebookUtil;
import com.abewy.android.apps.klyph.core.util.HierachyViewUtil;
import com.abewy.android.apps.klyph.messenger.MessengerApplication;
import com.abewy.android.apps.klyph.messenger.MessengerBundleExtras;
import com.abewy.android.apps.klyph.messenger.MessengerPreferences;
import com.abewy.android.apps.klyph.messenger.R;
import com.abewy.android.apps.klyph.messenger.fragment.ConversationFragment;
import com.abewy.android.apps.klyph.messenger.fragment.ConversationFragment.ConversationCallback;
import com.abewy.android.apps.klyph.messenger.fragment.ConversationListFragment;
import com.abewy.android.apps.klyph.messenger.fragment.ConversationListFragment.ConversationListCallback;
import com.abewy.android.apps.klyph.messenger.fragment.LoginFragment;
import com.abewy.android.apps.klyph.messenger.fragment.LoginFragment.LoginFragmentCallBack;
import com.abewy.android.apps.klyph.messenger.fragment.SelectionFragment;
import com.abewy.android.apps.klyph.messenger.fragment.SelectionFragment.SelectionCallback;
import com.abewy.android.apps.klyph.messenger.iab.IabHelper;
import com.abewy.android.apps.klyph.messenger.iab.IabResult;
import com.abewy.android.apps.klyph.messenger.iab.Inventory;
import com.abewy.android.apps.klyph.messenger.iab.Purchase;
import com.abewy.android.apps.klyph.messenger.service.MessengerService;
import com.facebook.Session;
import com.facebook.SessionState;
public class MainActivity extends TitledFragmentActivity implements LoginFragmentCallBack, ConversationCallback, ConversationListCallback,
SelectionCallback
{
private static final String TAG = "MainActivity";
private SlidingPaneLayout slidingPane;
private LinearLayout leftContainer;
private LinearLayout rightContainer;
private LoginFragment loginFragment;
private ConversationListFragment conversationListFragment;
private ConversationFragment conversationFragment;
private SelectionFragment selectionFragment;
private Fragment rightFragment;
private int leftContainerWidth;
private int rightContainerWidth;
private int leftContainerLandscapeWidth;
private int rightContainerLandscapeWidth;
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
String id = intent.getStringExtra(MessengerBundleExtras.SHOW_FRIEND_CONVERSATION);
if (id != null)
{
getFragmentManager().beginTransaction().hide(selectionFragment).show(conversationFragment).commit();
conversationFragment.loadFriendConversation(id);
conversationListFragment.setSelectedConversation(id);
slidingPane.closePane();
}
else
{
slidingPane.openPane();
}
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.d("MainActivity", "onCreate: ");
Log.d("MainActivity", "onCreate: " + loggedIn);
displayBackArrow(false);
String base64EncodedPublicKey = "[KEY]";
// compute your public key and store it in base64EncodedPublicKey
mHelper = new IabHelper(this, base64EncodedPublicKey);
// enable debug logging (for a production application, you should set this to false).
mHelper.enableDebugLogging(true);
slidingPane = (SlidingPaneLayout) findViewById(R.id.sliding_pane);
leftContainer = (LinearLayout) findViewById(R.id.left_container);
rightContainer = (LinearLayout) findViewById(R.id.right_container);
conversationListFragment = (ConversationListFragment) getFragmentManager().findFragmentById(R.id.conversation_list_fragment);
conversationFragment = (ConversationFragment) getFragmentManager().findFragmentById(R.id.conversation_fragment);
selectionFragment = (SelectionFragment) getFragmentManager().findFragmentById(R.id.selection_fragment);
// slidingPane.setParallaxDistance(getResources().getDimensionPixelSize(R.dimen.parallax_distance));
slidingPane.setSliderFadeColor(AttrUtil.getColor(this, R.attr.slidingPaneFadeColor));
// slidingPane.setSliderFadeColor(0xFF000000);
// slidingPane.setCoveredFadeColor(0xFFFFFFFF);
leftContainerWidth = getResources().getDimensionPixelSize(R.dimen.left_container_width);
rightContainerWidth = getResources().getDimensionPixelSize(R.dimen.right_container_width);
leftContainerLandscapeWidth = getResources().getDimensionPixelSize(R.dimen.left_container_landscape_width);
rightContainerLandscapeWidth = getResources().getDimensionPixelSize(R.dimen.right_container_landscape_width);
slidingPane.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
if (slidingPane.isOpen())
slidingPane.openPane();
}
});
slidingPane.setPanelSlideListener(new SlidingPaneLayout.PanelSlideListener() {
@Override
public void onPanelSlide(View panel, float slideOffset)
{
}
@Override
public void onPanelOpened(View panel)
{
displayBackArrow(false);
supportInvalidateOptionsMenu();
setTitle(R.string.app_name);
}
@Override
public void onPanelClosed(View panel)
{
displayBackArrow(true);
supportInvalidateOptionsMenu();
if (rightFragment == selectionFragment)
setTitle(R.string.app_name);
}
});
if (KlyphFlags.IS_PRO_VERSION == true)
setTitle(R.string.app_pro_name);
else
setTitle(R.string.app_name);
rightFragment = selectionFragment;
adContainer = (ViewGroup) findViewById(R.id.ad);
refreshContainersLayout();
final NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancelAll();
Log.d("MainActivity", "onCreate: ");
Log.d("MainActivity", "onCreate: " + loggedIn);
if (loggedIn == false)
{
Log.d("MainActivity", "show login");
loginFragment = new LoginFragment();
getFragmentManager().beginTransaction().replace(R.id.login_container, loginFragment).commit();
findViewById(R.id.login_container).setVisibility(View.VISIBLE);
}
else
{
Log.d("MainActivity", "don't show login");
slidingPane.setVisibility(View.VISIBLE);
endInit();
}
// Facebook HashKey
if (KlyphFlags.LOG_FACEBOOK_HASH)
FacebookUtil.logHash(this);
// Hierarchy View Connector
if (KlyphFlags.ENABLE_HIERACHY_VIEW_CONNECTOR)
HierachyViewUtil.connectHierarchyView(this);
}
private void refreshContainersLayout()
{
if (KlyphDevice.isPortraitMode())
setPortraitMode();
else
setLandscapeMode();
}
private void setPortraitMode()
{
SlidingPaneLayout.LayoutParams params = (SlidingPaneLayout.LayoutParams) rightContainer.getLayoutParams();
params.width = KlyphDevice.getDeviceWidth();// rightContainerWidth;
// params.leftMargin = paddingLeft;
params.rightMargin = 0;
rightContainer.setLayoutParams(params);
params = (SlidingPaneLayout.LayoutParams) leftContainer.getLayoutParams();
params.width = leftContainerWidth;
params.leftMargin = 0;
params.rightMargin = 0;
leftContainer.setLayoutParams(params);
slidingPane.requestLayout();
}
private void setLandscapeMode()
{
int rightWidth = KlyphDevice.getDeviceWidth();
float screenWidthDpi = KlyphDevice.getDeviceWidth() / KlyphDevice.getDeviceDensity();
if (screenWidthDpi >= 720)
rightWidth = Math.max(rightContainerLandscapeWidth, KlyphDevice.getDeviceWidth() - leftContainerLandscapeWidth);
LayoutParams params = rightContainer.getLayoutParams();
params.width = rightWidth;
rightContainer.setLayoutParams(params);
params = leftContainer.getLayoutParams();
params.width = leftContainerLandscapeWidth;
leftContainer.setLayoutParams(params);
}
@Override
protected int getLayout()
{
return R.layout.activity_main;
}
@Override
public void onConfigurationChanged(Configuration newConfig)
{
Log.d("MainActivity", "onConfigurationChanged");
super.onConfigurationChanged(newConfig);
refreshContainersLayout();
supportInvalidateOptionsMenu();
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
Log.d("MainActivity", "onCreateOptionsMenu: ");
if (loggedIn)
{
boolean shouldAddMenuItem = false;
if (KlyphDevice.isPortraitMode())
shouldAddMenuItem = slidingPane.isOpen();
else
shouldAddMenuItem = selectionFragment != null && !selectionFragment.isVisible();
if (shouldAddMenuItem)
{
MenuItem item = menu.add(Menu.NONE, R.id.menu_add, Menu.NONE, R.string.menu_new_conversation);
item.setIcon(AttrUtil.getResourceId(this, R.attr.addIcon));
item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
if (menu.findItem(R.id.menu_faq) == null)
{
menu.add(Menu.NONE, R.id.menu_faq, Menu.NONE, R.string.menu_faq).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
}
if (menu.findItem(R.id.menu_buy_pro) == null && MessengerApplication.PRO_VERSION_CHECKED && !MessengerApplication.IS_PRO_VERSION)
{
menu.add(Menu.NONE, R.id.menu_buy_pro, Menu.NONE, R.string.menu_buy_pro).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
}
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
if (item.getItemId() == android.R.id.home)
{
if (!slidingPane.isOpen())
slidingPane.openPane();
return true;
}
else if (item.getItemId() == R.id.menu_add)
{
rightFragment = selectionFragment;
conversationListFragment.deselect();
getFragmentManager().beginTransaction().hide(conversationFragment).show(selectionFragment).commit();
slidingPane.closePane();
return true;
}
else if (item.getItemId() == R.id.menu_logout)
{
logout();
return true;
}
else if (item.getItemId() == R.id.menu_faq)
{
startActivity(new Intent(this, FaqActivity.class));
}
else if (item.getItemId() == R.id.menu_buy_pro)
{
String payload = "my_great_payload";
mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST, mPurchaseFinishedListener, payload);
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed()
{
if (!slidingPane.isOpen())
{
slidingPane.openPane();
}
else
{
super.onBackPressed();
}
}
private void logout()
{
Log.d("MainActivity", "logout");
conversationFragment.disconnectFromService();
selectionFragment.disconnectFromService();
conversationListFragment.disconnectFromService();
loggedIn = false;
KlyphSession.logout();
stopService(new Intent(this, MessengerService.class));
MessengerPreferences.setFriends(null);
MessengerPreferences.setLastConversations(null);
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);
}
// ___ Facebook login management ___________________________________________
ViewGroup adContainer;
private boolean sessionInitalized = false;
private static boolean loggedIn = false;
@Override
protected void onSessionStateChange(Session session, SessionState state, Exception exception)
{
Log.d("MainActivity", "onSessionStateChange");
super.onSessionStateChange(session, state, exception);
updateView();
}
@Override
public void onUserInfoFetched(User user)
{
KlyphSession.setSessionUser(user);
loggedIn = true;
if (!sessionInitalized)
{
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result)
{
Log.d(TAG, "Setup finished.");
if (!result.isSuccess())
{
// Oh noes, there was a problem.
Log.d("MainActivity.onCreate(...).new OnIabSetupFinishedListener() {...}",
"onIabSetupFinished: Problem setting up in-app billing: " + result);
return;
}
// Have we been disposed of in the meantime? If so, quit.
if (mHelper == null)
return;
// IAB is fully set up. Now, let's get an inventory of stuff we own.
Log.d(TAG, "Setup successful. Querying inventory.");
mHelper.queryInventoryAsync(mGotInventoryListener);
}
});
}
loggedIn = true;
}
private void updateView()
{
Session session = Session.getActiveSession();
if (session.isOpened())
{
if (sessionInitalized == false && KlyphSession.getSessionUserId() != null && MessengerApplication.PRO_VERSION_CHECKED)
{
endInit();
}
}
}
private void endInit()
{
Log.d("MainActivity", "endInit");
loggedIn = true;
if (sessionInitalized == false)
{
Log.d("MainActivity", "endInit");
if (KlyphFlags.LOG_ACCESS_TOKEN)
Log.d("MainActivity", Session.getActiveSession().getAccessToken());
// If just logged in and notifications enabled, then start the
// service
if (!MessengerService.isRunning())
{
Intent intent = new Intent(this, MessengerService.class);
startService(intent);
}
slidingPane.setVisibility(View.VISIBLE);
if (loginFragment != null)
getFragmentManager().beginTransaction().remove(loginFragment).hide(conversationFragment).show(selectionFragment)
.commitAllowingStateLoss();
else
getFragmentManager().beginTransaction().hide(conversationFragment).show(selectionFragment).commitAllowingStateLoss();
findViewById(R.id.login_container).setVisibility(View.GONE);
loginFragment = null;
rightFragment = selectionFragment;
conversationListFragment.load();
conversationFragment.connectToService();
selectionFragment.load();
slidingPane.setParallaxDistance(getResources().getDimensionPixelSize(R.dimen.parallax_distance));
slidingPane.openPane();
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
sessionInitalized = true;
if (getIntent().getStringExtra(MessengerBundleExtras.SHOW_FRIEND_CONVERSATION) != null)
{
getFragmentManager().beginTransaction().hide(selectionFragment).show(conversationFragment).commitAllowingStateLoss();
conversationFragment.loadFriendConversation(getIntent().getStringExtra(MessengerBundleExtras.SHOW_FRIEND_CONVERSATION));
slidingPane.closePane();
}
// Licensing
if (KlyphFlags.BANNER_ADS_ENABLED && !MessengerApplication.IS_PRO_VERSION)
{
adContainer.setVisibility(View.VISIBLE);
manageAdView(adContainer, true);
}
}
}
public static class RightFrameLayout extends FrameLayout
{
public RightFrameLayout(Context paramContext)
{
super(paramContext);
}
public RightFrameLayout(Context paramContext, AttributeSet paramAttributeSet)
{
super(paramContext, paramAttributeSet);
}
public RightFrameLayout(Context paramContext, AttributeSet paramAttributeSet, int paramInt)
{
super(paramContext, paramAttributeSet, paramInt);
}
public boolean onTouchEvent(MotionEvent paramMotionEvent)
{
return true;
}
}
@Override
public void onConversationSelected(MessageThread thread)
{
rightFragment = conversationFragment;
conversationFragment.loadThreadConversation(thread);
getFragmentManager().beginTransaction().hide(selectionFragment).show(conversationFragment).commit();
slidingPane.closePane();
}
@Override
public void onFriendSelected(Friend friend)
{
rightFragment = conversationFragment;
conversationListFragment.setSelectedConversation(friend.getUid());
conversationFragment.loadFriendConversation(friend.getUid());
getFragmentManager().beginTransaction().hide(selectionFragment).show(conversationFragment).commit();
slidingPane.closePane();
}
@Override
public void onMessageSent(String threadId, String message)
{
conversationListFragment.userSentMessage(threadId, message);
}
@Override
protected void onResume()
{
Log.d("MainActivity", "onResume");
super.onResume();
if (sessionInitalized)
{
conversationFragment.connectToService();
conversationListFragment.connectToService();
selectionFragment.connectToService();
}
}
@Override
public void onPause()
{
Log.d("MainActivity", "onPause");
super.onPause();
// If on login view, don't disconnect fragments when going to Fb login dialog
if (sessionInitalized)
{
conversationFragment.disconnectFromService();
conversationListFragment.disconnectFromService();
selectionFragment.disconnectFromService();
}
}
@Override
public void onDestroy()
{
super.onDestroy();
if (mHelper != null)
{
mHelper.dispose();
mHelper = null;
}
}
// ___ InApp Billing
private IabHelper mHelper;
private static final String SKU_PREMIUM = "com.abewy.android.apps.klyph.messenger.premium";
// private static final String SKU_PREMIUM = "android.test.purchased";
// (arbitrary) request code for the purchase flow
private static final int RC_REQUEST = 10001;
// Listener that's called when we finish querying the items and subscriptions we own
IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory)
{
Log.d(TAG, "Query inventory finished.");
MessengerApplication.PRO_VERSION_CHECKED = true;
// Have we been disposed of in the meantime? If so, quit.
if (mHelper == null)
return;
// Is it a failure?
if (result.isFailure())
{
Log.d(TAG, "Failed to query inventory: " + result);
// Fail to check, so we don't display ads
// to avoid pro users to see ads
MessengerApplication.IS_PRO_VERSION = true;
return;
}
Log.d(TAG, "Query inventory was successful.");
/*
* Check for items we own. Notice that for each purchase, we check
* the developer payload to see if it's correct! See
* verifyDeveloperPayload().
*/
// Do we have the premium upgrade?
Purchase premiumPurchase = inventory.getPurchase(SKU_PREMIUM);
MessengerApplication.IS_PRO_VERSION = premiumPurchase != null;
if (premiumPurchase != null)
{
Log
.d("IABKM",
"onQueryInventoryFinished: " + premiumPurchase.getPurchaseState());
}
Log.d(TAG, "User is "
+ (MessengerApplication.IS_PRO_VERSION ? "PREMIUM"
: "NOT PREMIUM"));
endInit();
Log.d(TAG, "Initial inventory query finished; enabling main UI.");
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + "," + data);
if (mHelper == null)
return;
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data))
{
// not handled, so handle it ourselves (here's where you'd
// perform any handling of activity results not related to in-app
// billing...
super.onActivityResult(requestCode, resultCode, data);
}
else
{
Log.d(TAG, "onActivityResult handled by IABUtil.");
}
}
// Callback for when a purchase is finished
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase)
{
Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase);
// if we were disposed of in the meantime, quit.
if (mHelper == null)
return;
if (result.isFailure())
{
Log.d(TAG, "Error purchasing: " + result);
return;
}
Log.d(TAG, "Purchase successful.");
if (purchase.getSku().equals(SKU_PREMIUM))
{
// bought the premium upgrade!
Log.d(TAG, "Purchase is premium upgrade. Congratulating user.");
MessengerApplication.PRO_VERSION_CHECKED = true;
MessengerApplication.IS_PRO_VERSION = true;
hideAds();
invalidateOptionsMenu();
AlertUtil.showAlert(MainActivity.this, R.string.thank_you,
R.string.thank_you_purchase, R.string.ok);
}
}
};
private void hideAds()
{
if (adContainer != null)
manageAdView(adContainer, false);
}
}