/**
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
*
* You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
* copy, modify, and distribute this software in source code or binary form for use
* in connection with the web services and APIs provided by Facebook.
*
* As with any software that integrates with the Facebook platform, your use of
* this software is subject to the Facebook Developer Principles and Policies
* [http://developers.facebook.com/policy/]. This copyright notice shall be
* included in all copies or substantial portions of the software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.facebook.login.widget;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.TextView;
import com.facebook.R;
import java.lang.ref.WeakReference;
/**
* This displays a popup tool tip for a specified view.
*/
public class ToolTipPopup {
/**
* The values here describe the styles available for the tool tip class.
*/
public static enum Style {
/**
* The tool tip will be shown with a blue style; including a blue background and blue
* arrows.
*/
BLUE,
/**
* The tool tip will be shown with a black style; including a black background and black
* arrows.
*/
BLACK
}
/**
* The default time that the tool tip will be displayed
*/
public static final long DEFAULT_POPUP_DISPLAY_TIME = 6000;
private final String mText;
private final WeakReference<View> mAnchorViewRef;
private final Context mContext;
private PopupContentView mPopupContent;
private PopupWindow mPopupWindow;
private Style mStyle = Style.BLUE;
private long mNuxDisplayTime = DEFAULT_POPUP_DISPLAY_TIME;
private final ViewTreeObserver.OnScrollChangedListener mScrollListener =
new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if (mAnchorViewRef.get() != null &&
mPopupWindow != null &&
mPopupWindow.isShowing()) {
if (mPopupWindow.isAboveAnchor()) {
mPopupContent.showBottomArrow();
} else {
mPopupContent.showTopArrow();
}
}
}
};
/**
* Create a new ToolTipPopup
* @param text The text to be displayed in the tool tip
* @param anchor The view to anchor this tool tip to.
*/
public ToolTipPopup(String text, View anchor) {
mText = text;
mAnchorViewRef = new WeakReference<View>(anchor);
mContext = anchor.getContext();
}
/**
* Sets the {@link Style} of this tool tip.
* @param mStyle the style for the tool tip
*/
public void setStyle(Style mStyle) {
this.mStyle = mStyle;
}
/**
* Display this tool tip to the user
*/
public void show() {
if (mAnchorViewRef.get() != null) {
mPopupContent = new PopupContentView(mContext);
TextView body = (TextView) mPopupContent.findViewById(
R.id.com_facebook_tooltip_bubble_view_text_body);
body.setText(mText);
if (mStyle == Style.BLUE) {
mPopupContent.bodyFrame.setBackgroundResource(
R.drawable.com_facebook_tooltip_blue_background);
mPopupContent.bottomArrow.setImageResource(
R.drawable.com_facebook_tooltip_blue_bottomnub);
mPopupContent.topArrow.setImageResource(
R.drawable.com_facebook_tooltip_blue_topnub);
mPopupContent.xOut.setImageResource(R.drawable.com_facebook_tooltip_blue_xout);
} else {
mPopupContent.bodyFrame.setBackgroundResource(
R.drawable.com_facebook_tooltip_black_background);
mPopupContent.bottomArrow.setImageResource(
R.drawable.com_facebook_tooltip_black_bottomnub);
mPopupContent.topArrow.setImageResource(
R.drawable.com_facebook_tooltip_black_topnub);
mPopupContent.xOut.setImageResource(R.drawable.com_facebook_tooltip_black_xout);
}
final Window window = ((Activity) mContext).getWindow();
final View decorView = window.getDecorView();
final int decorWidth = decorView.getWidth();
final int decorHeight = decorView.getHeight();
registerObserver();
mPopupContent.measure(
View.MeasureSpec.makeMeasureSpec(decorWidth, View.MeasureSpec.AT_MOST),
View.MeasureSpec.makeMeasureSpec(decorHeight, View.MeasureSpec.AT_MOST));
mPopupWindow = new PopupWindow(
mPopupContent,
mPopupContent.getMeasuredWidth(),
mPopupContent.getMeasuredHeight());
mPopupWindow.showAsDropDown(mAnchorViewRef.get());
updateArrows();
if (mNuxDisplayTime > 0) {
mPopupContent.postDelayed(new Runnable() {
@Override
public void run() {
dismiss();
}
}, mNuxDisplayTime);
}
mPopupWindow.setTouchable(true);
mPopupContent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
}
/**
* Set the time (in milliseconds) the tool tip will be displayed. Any number less than or equal
* to 0 will cause the tool tip to be displayed indefinitely
* @param displayTime The amount of time (in milliseconds) to display the tool tip
*/
public void setNuxDisplayTime(long displayTime) {
this.mNuxDisplayTime = displayTime;
}
private void updateArrows() {
if (mPopupWindow != null && mPopupWindow.isShowing()) {
if (mPopupWindow.isAboveAnchor()) {
mPopupContent.showBottomArrow();
} else {
mPopupContent.showTopArrow();
}
}
}
/**
* Dismiss the tool tip
*/
public void dismiss() {
unregisterObserver();
if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
private void registerObserver() {
unregisterObserver();
if (mAnchorViewRef.get() != null) {
mAnchorViewRef.get().getViewTreeObserver().addOnScrollChangedListener(mScrollListener);
}
}
private void unregisterObserver() {
if (mAnchorViewRef.get() != null) {
mAnchorViewRef.get().getViewTreeObserver().removeOnScrollChangedListener(
mScrollListener);
}
}
private class PopupContentView extends FrameLayout {
private ImageView topArrow;
private ImageView bottomArrow;
private View bodyFrame;
private ImageView xOut;
public PopupContentView(Context context) {
super(context);
init();
}
private void init() {
LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.com_facebook_tooltip_bubble, this);
topArrow = (ImageView) findViewById(R.id.com_facebook_tooltip_bubble_view_top_pointer);
bottomArrow = (ImageView) findViewById(
R.id.com_facebook_tooltip_bubble_view_bottom_pointer);
bodyFrame = findViewById(R.id.com_facebook_body_frame);
xOut = (ImageView) findViewById(R.id.com_facebook_button_xout);
}
public void showTopArrow() {
topArrow.setVisibility(View.VISIBLE);
bottomArrow.setVisibility(View.INVISIBLE);
}
public void showBottomArrow() {
topArrow.setVisibility(View.INVISIBLE);
bottomArrow.setVisibility(View.VISIBLE);
}
}
}