/*
* Copyright (C) 2014 barter.li
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the
* License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package li.barter.fragments;
import android.app.Activity;
import android.content.ActivityNotFoundException;
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.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.ActionBarActivity;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import com.google.android.gms.analytics.HitBuilders;
import com.squareup.picasso.Picasso;
import li.barter.BarterLiApplication;
import li.barter.R;
import li.barter.activities.AboutUsActivity;
import li.barter.activities.AuthActivity;
import li.barter.activities.ChatsActivity;
import li.barter.activities.HomeActivity;
import li.barter.activities.SendFeedbackActivity;
import li.barter.activities.SettingsActivity;
import li.barter.activities.UserProfileActivity;
import li.barter.adapters.NavDrawerAdapter;
import li.barter.analytics.AnalyticsConstants;
import li.barter.analytics.GoogleAnalyticsManager;
import li.barter.http.IBlRequestContract;
import li.barter.http.ResponseInfo;
import li.barter.utils.AppConstants;
import li.barter.utils.AvatarBitmapTransformation;
import li.barter.utils.Utils;
import li.barter.widgets.RoundedCornerImageView;
/**
* Fragment to load in the Navigation Drawer Created by vinaysshenoy on 29/6/14.
*/
public class NavDrawerFragment extends AbstractBarterLiFragment implements AdapterView
.OnItemClickListener {
private static final String TAG = "NavDrawerFragment";
/**
* Intent filter for receiving updates whenever the User Info changes
*/
private static final IntentFilter INTENT_FILTER = new IntentFilter(
AppConstants.ACTION_USER_INFO_UPDATED);
/**
* BroadcastReceiver implementation that receives broadcasts when the user info is updated from
* server
*/
private final BroadcastReceiver mUserInfoUpdatedBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() != null && intent.getAction()
.equals(AppConstants
.ACTION_USER_INFO_UPDATED)) {
updateLoggedInStatus();
}
}
};
/**
* ListView to provide Nav drawer content
*/
private ListView mListView;
/**
* Drawer Adapter to provide the list view options
*/
private NavDrawerAdapter mDrawerAdapter;
/**
* Callback will be triggered whenever the Nav drawer takes an action. Use to close the drawer
* layout
*/
private INavDrawerActionCallback mNavDrawerActionCallback;
/**
* Callback for delaying the running of nav drawer actions. This is so that the drawer can be
* closed without jank
*/
private Handler mHandler;
/**
* Header which shows either the user profile or the Sign In message
*/
private ViewGroup mProfileHeader;
/**
* Bitmap transformation for loading images from picasso
*/
private AvatarBitmapTransformation mAvatarBitmapTransformation;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mHandler = new Handler();
mAvatarBitmapTransformation = new AvatarBitmapTransformation(AvatarBitmapTransformation.AvatarSize.SMALL);
mListView = (ListView) inflater.inflate(R.layout.fragment_nav_drawer, container, false);
mDrawerAdapter = new NavDrawerAdapter(getActivity(), R.array.nav_drawer_primary,
R.array.nav_drawer_secondary);
mProfileHeader = (ViewGroup) inflater
.inflate(R.layout.layout_nav_drawer_header, mListView, false);
initProfileHeaderViews();
mListView.addHeaderView(mProfileHeader, null, true);
mListView.setAdapter(mDrawerAdapter);
mListView.setOnItemClickListener(this);
return mListView;
}
/**
* Initialize the profile header views. Reads the references to the child views and stores them
* as tags
*/
private void initProfileHeaderViews() {
//Get references to the two primary containers
final ViewGroup profileContainer = (ViewGroup) mProfileHeader
.findViewById(R.id.container_profile_info);
mProfileHeader.setTag(R.id.container_profile_info, profileContainer);
final ViewGroup signInContainer = (ViewGroup) mProfileHeader
.findViewById(R.id.container_sign_in_message);
mProfileHeader.setTag(R.id.container_sign_in_message, signInContainer);
//Get references to the individual container children and set tags
profileContainer
.setTag(R.id.text_user_name, profileContainer.findViewById(R.id.text_user_name));
profileContainer.setTag(R.id.image_user, profileContainer.findViewById(R.id.image_user));
TextView textView = (TextView) signInContainer.findViewById(R.id.text_nav_item_title);
textView.setText(R.string.text_sign_in);
signInContainer.setTag(R.id.text_nav_item_title, textView);
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(BarterLiApplication.getStaticContext())
.unregisterReceiver(mUserInfoUpdatedBroadcastReceiver);
}
@Override
public void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(BarterLiApplication.getStaticContext())
.registerReceiver(mUserInfoUpdatedBroadcastReceiver, INTENT_FILTER);
updateLoggedInStatus();
}
/**
* Checks whether the user is logged in or not and updates the status accordingly
*/
private void updateLoggedInStatus() {
final View profileInfoContainer = (View) mProfileHeader.getTag(R.id.container_profile_info);
final View signInMessageContainer = (View) mProfileHeader
.getTag(R.id.container_sign_in_message);
final TextView userNameTextView = ((TextView) profileInfoContainer
.getTag(R.id.text_user_name));
final RoundedCornerImageView profileImageView = (RoundedCornerImageView) profileInfoContainer
.getTag(R.id.image_user);
if (isLoggedIn()) {
profileInfoContainer.setVisibility(View.VISIBLE);
signInMessageContainer.setVisibility(View.GONE);
userNameTextView.setText(Utils.makeUserFullName(
AppConstants.UserInfo.INSTANCE.getFirstName(),
AppConstants.UserInfo.INSTANCE.getLastName()));
final String userImageUrl = AppConstants.UserInfo.INSTANCE.getProfilePicture();
if (!TextUtils.isEmpty(userImageUrl)) {
Picasso.with(getActivity())
.load(userImageUrl)
.transform(mAvatarBitmapTransformation)
.error(R.drawable.pic_avatar)
.into(profileImageView.getTarget());
} else {
Picasso.with(getActivity())
.load(R.drawable.pic_avatar)
.transform(mAvatarBitmapTransformation)
.into(profileImageView.getTarget());
}
} else {
profileInfoContainer.setVisibility(View.GONE);
signInMessageContainer.setVisibility(View.VISIBLE);
userNameTextView.setText(null);
profileImageView.setImageResource(0);
}
}
@Override
protected String getAnalyticsScreenName() {
//We don't want this fragment tracked
return null;
}
@Override
protected Object getTaskTag() {
return hashCode();
}
@Override
public void onSuccess(int requestId, IBlRequestContract request, ResponseInfo response) {
}
@Override
public void onBadRequestError(int requestId, IBlRequestContract request, int errorCode,
String errorMessage, Bundle errorResponseBundle) {
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (parent == mListView) {
final Runnable launchRunnable = makeRunnableForNavDrawerClick(position);
if (launchRunnable != null) {
//Give time for drawer to close before performing the action
mHandler.postDelayed(launchRunnable, 250);
}
if (mNavDrawerActionCallback != null) {
mNavDrawerActionCallback.onActionTaken();
}
}
}
/**
* Creates a {@link Runnable} for positing to the Handler for launching the Navigation Drawer
* click
*
* @param position The nav drawer item that was clicked
* @return a {@link Runnable} to be posted to the Handler thread
*/
private Runnable makeRunnableForNavDrawerClick(final int position) {
Runnable runnable;
final Activity activity = getActivity();
switch (position) {
//My Profile
case 0: {
GoogleAnalyticsManager
.getInstance()
.sendEvent(new HitBuilders.EventBuilder(AnalyticsConstants.Categories.USAGE,
AnalyticsConstants.Actions
.NAVIGATION_OPTION
)
.set(AnalyticsConstants.ParamKeys.TYPE,
AnalyticsConstants.ParamValues.PROFILE));
/*
* If the current Activity is the User profile Activity and the user id loaded is
* the current user, don't load it again
*/
if (activity instanceof UserProfileActivity && ((UserProfileActivity) activity)
.getUserId().equals(
AppConstants.UserInfo.INSTANCE.getId())) {
return null;
}
runnable = new Runnable() {
@Override
public void run() {
if (isLoggedIn()) {
launchCurrentUserProfile();
} else {
final Intent loginIntent = new Intent(getActivity(),
AuthActivity.class);
startActivityForResult(loginIntent, AppConstants.RequestCodes.LOGIN);
}
}
};
break;
}
//Find Books
case 1: {
if (getActivity() instanceof HomeActivity) {
return null;
}
runnable = new Runnable() {
@Override
public void run() {
final Intent homeActivity = new Intent(getActivity(), HomeActivity.class);
homeActivity.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeActivity);
}
};
break;
}
//My Chats
case 2: {
GoogleAnalyticsManager
.getInstance()
.sendEvent(new HitBuilders.EventBuilder(AnalyticsConstants.Categories.USAGE,
AnalyticsConstants.Actions
.NAVIGATION_OPTION
)
.set(AnalyticsConstants.ParamKeys.TYPE,
AnalyticsConstants.ParamValues.CHATS));
if (activity instanceof ChatsActivity) {
return null;
}
//TODO Check for login
runnable = new Runnable() {
@Override
public void run() {
final Intent chatsListIntent = new Intent(getActivity(),
ChatsActivity.class);
chatsListIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(chatsListIntent);
}
};
break;
}
//Settings
case 3: {
runnable = new Runnable() {
@Override
public void run() {
final Intent intent = new Intent(getActivity(), SettingsActivity.class);
startActivity(intent);
}
};
break;
}
//Share
case 4: {
GoogleAnalyticsManager
.getInstance()
.sendEvent(new HitBuilders.EventBuilder(AnalyticsConstants.Categories.USAGE,
AnalyticsConstants.Actions
.NAVIGATION_OPTION
)
.set(AnalyticsConstants.ParamKeys.TYPE,
AnalyticsConstants.ParamValues.SHARE));
runnable = new Runnable() {
@Override
public void run() {
Intent shareIntent = Utils
.createAppShareIntent(getActivity());
try {
startActivity(Intent
.createChooser(shareIntent,
getString(R.string.share_via)));
} catch (ActivityNotFoundException e) {
//Shouldn't happen
}
}
};
break;
}
//Rate Us
case 5: {
GoogleAnalyticsManager
.getInstance()
.sendEvent(new HitBuilders.EventBuilder(AnalyticsConstants.Categories.USAGE,
AnalyticsConstants.Actions
.NAVIGATION_OPTION
)
.set(AnalyticsConstants.ParamKeys.TYPE,
AnalyticsConstants.ParamValues.RATE_US));
runnable = new Runnable() {
@Override
public void run() {
Uri marketUri = Uri
.parse(AppConstants.PLAY_STORE_MARKET_LINK);
Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
startActivity(marketIntent);
}
};
break;
}
//Send feedback
case 6: {
GoogleAnalyticsManager
.getInstance()
.sendEvent(new HitBuilders.EventBuilder(AnalyticsConstants.Categories.USAGE,
AnalyticsConstants.Actions
.NAVIGATION_OPTION
)
.set(AnalyticsConstants.ParamKeys.TYPE,
AnalyticsConstants.ParamValues.REPORT_BUG));
if (activity instanceof SendFeedbackActivity) {
return null;
}
runnable = new Runnable() {
@Override
public void run() {
startActivity(new Intent(getActivity(), SendFeedbackActivity.class));
}
};
break;
}
//About Us
case 7: {
GoogleAnalyticsManager
.getInstance()
.sendEvent(new HitBuilders.EventBuilder(AnalyticsConstants.Categories.USAGE,
AnalyticsConstants.Actions
.NAVIGATION_OPTION
)
.set(AnalyticsConstants.ParamKeys.TYPE,
AnalyticsConstants.ParamValues.ABOUT_US));
if (getActivity() instanceof AboutUsActivity) {
return null;
}
runnable = new Runnable() {
@Override
public void run() {
final Intent aboutUsIntent = new Intent(getActivity(),
AboutUsActivity.class);
aboutUsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(aboutUsIntent);
}
};
break;
}
default: {
runnable = null;
}
}
return runnable;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (!(activity instanceof INavDrawerActionCallback)) {
throw new IllegalArgumentException(
"Activity " + activity.toString() + " must implement INavDrawerActionCallback");
}
mNavDrawerActionCallback = (INavDrawerActionCallback) activity;
}
/**
* Interface that is called when the Navigation Drawer performs an Action
*/
public static interface INavDrawerActionCallback {
public void onActionTaken();
}
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
if (requestCode == AppConstants.RequestCodes.LOGIN || requestCode == AppConstants
.RequestCodes.ONWARD) {
if (resultCode == ActionBarActivity.RESULT_OK) {
boolean defaultFlow = true;
if (data != null) {
final Intent onwardIntent = data.getParcelableExtra(
AppConstants.Keys.ONWARD_INTENT);
if (onwardIntent != null) {
defaultFlow = false;
startActivityForResult(onwardIntent, AppConstants.RequestCodes.ONWARD);
}
}
if (defaultFlow) {
launchCurrentUserProfile();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
/**
* Launches the current user's profile in the Activity
*/
private void launchCurrentUserProfile() {
final Intent userProfileIntent = new Intent(getActivity(),
UserProfileActivity.class);
userProfileIntent.putExtra(AppConstants.Keys.USER_ID,
AppConstants.UserInfo.INSTANCE.getId());
userProfileIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(userProfileIntent);
}
}