diff options
Diffstat (limited to 'libraries/Android-AppMsg/library/src/com/devspark/appmsg/AppMsg.java')
-rw-r--r-- | libraries/Android-AppMsg/library/src/com/devspark/appmsg/AppMsg.java | 587 |
1 files changed, 587 insertions, 0 deletions
diff --git a/libraries/Android-AppMsg/library/src/com/devspark/appmsg/AppMsg.java b/libraries/Android-AppMsg/library/src/com/devspark/appmsg/AppMsg.java new file mode 100644 index 000000000..e86273762 --- /dev/null +++ b/libraries/Android-AppMsg/library/src/com/devspark/appmsg/AppMsg.java @@ -0,0 +1,587 @@ +/* + * Copyright 2012 Evgeny Shishkin + * + * 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 com.devspark.appmsg; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Resources; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.FrameLayout; +import android.widget.TextView; + +/** + * In-layout notifications. Based on {@link android.widget.Toast} notifications + * and article by Cyril Mottier (http://android.cyrilmottier.com/?p=773). + * + * @author e.shishkin + */ +public class AppMsg { + + /** + * Show the view or text notification for a short period of time. This time + * could be user-definable. This is the default. + * + * @see #setDuration + */ + public static final int LENGTH_SHORT = 3000; + + /** + * Show the view or text notification for a long period of time. This time + * could be user-definable. + * + * @see #setDuration + */ + public static final int LENGTH_LONG = 5000; + + /** + * <p>Show the view or text notification for an undefined amount of time + * -Usually until an invocation of {@link #cancel()}, {@link #cancelAll(android.app.Activity)}, + * {@link #cancelAll()} or {@link android.app.Activity#onDestroy()}-, + * stacking on top of any other {@link com.devspark.appmsg.AppMsg} with this duration.</p> + * + * <p><b>Note</b>: You are responsible + * for calling {@link #cancel()} on such {@link com.devspark.appmsg.AppMsg}.</p> + * + * @see #setDuration + */ + public static final int LENGTH_STICKY = -1; + + /** + * Lowest priority, messages with this priority will be showed after all messages with priority + * {@link #PRIORITY_HIGH} and {@link #PRIORITY_NORMAL} have been shown. + * + * @see #setPriority(int) + */ + public static final int PRIORITY_LOW = Integer.MIN_VALUE; + /** + * Normal priority, messages with this priority will be showed after all messages with priority + * {@link #PRIORITY_HIGH} but before {@link #PRIORITY_LOW} have been shown. + * + * @see #setPriority(int) + */ + public static final int PRIORITY_NORMAL = 0; + /** + * Highest priority, messages with this priority will be showed before any other message. + * + * @see #setPriority(int) + */ + public static final int PRIORITY_HIGH = Integer.MAX_VALUE; + + /** + * Show the text notification for a long period of time with a negative style. + */ + public static final Style STYLE_ALERT = new Style(LENGTH_LONG, R.color.alert); + + /** + * Show the text notification for a short period of time with a positive style. + */ + public static final Style STYLE_CONFIRM = new Style(LENGTH_SHORT, R.color.confirm); + + /** + * Show the text notification for a short period of time with a neutral style. + */ + public static final Style STYLE_INFO = new Style(LENGTH_SHORT, R.color.info); + + private final Activity mActivity; + private int mDuration = LENGTH_SHORT; + private View mView; + private ViewGroup mParent; + private LayoutParams mLayoutParams; + private boolean mFloating; + Animation mInAnimation, mOutAnimation; + int mPriority = PRIORITY_NORMAL; + + /** + * Construct an empty AppMsg object. You must call {@link #setView} before + * you can call {@link #show}. + * + * @param activity {@link android.app.Activity} to use. + */ + public AppMsg(Activity activity) { + mActivity = activity; + } + + /** + * Make a {@link AppMsg} that just contains a text view. + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param text The text to show. Can be formatted text. + * @param style The style with a background and a duration. + */ + public static AppMsg makeText(Activity context, CharSequence text, Style style) { + return makeText(context, text, style, R.layout.app_msg); + } + + /** + * @author mengguoqiang 扩展支持设置字体大小 + * Make a {@link AppMsg} that just contains a text view. + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param text The text to show. Can be formatted text. + * @param style The style with a background and a duration. + */ + public static AppMsg makeText(Activity context, CharSequence text, Style style, float textSize) { + return makeText(context, text, style, R.layout.app_msg, textSize); + } + + /** + * Make a {@link AppMsg} with a custom layout. The layout must have a {@link TextView} com id {@link android.R.id.message} + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param text The text to show. Can be formatted text. + * @param style The style with a background and a duration. + */ + public static AppMsg makeText(Activity context, CharSequence text, Style style, int layoutId) { + LayoutInflater inflate = (LayoutInflater) + context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View v = inflate.inflate(layoutId, null); + + return makeText(context, text, style, v, true); + } + + /** + * @author mengguoqiang 扩展支持字体大小 + * Make a {@link AppMsg} with a custom layout. The layout must have a {@link TextView} com id {@link android.R.id.message} + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param text The text to show. Can be formatted text. + * @param style The style with a background and a duration. + */ + public static AppMsg makeText(Activity context, CharSequence text, Style style, int layoutId, float textSize) { + LayoutInflater inflate = (LayoutInflater) + context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View v = inflate.inflate(layoutId, null); + + return makeText(context, text, style, v, true, textSize); + } + + /** + * Make a non-floating {@link AppMsg} with a custom view presented inside the layout. + * It can be used to create non-floating notifications if floating is false. + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param customView + * View to be used. + * @param text The text to show. Can be formatted text. + * @param style The style with a background and a duration. + */ + public static AppMsg makeText(Activity context, CharSequence text, Style style, View customView) { + return makeText(context, text, style, customView, false); + } + + /** + * Make a {@link AppMsg} with a custom view. It can be used to create non-floating notifications if floating is false. + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param view + * View to be used. + * @param text The text to show. Can be formatted text. + * @param style The style with a background and a duration. + * @param floating true if it'll float. + */ + private static AppMsg makeText(Activity context, CharSequence text, Style style, View view, boolean floating) { + return makeText(context, text, style, view, floating, 0); + } + + /** + * + * @author mengguoqiang 扩展支持设置字体大小 + * Make a {@link AppMsg} with a custom view. It can be used to create non-floating notifications if floating is false. + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param view + * View to be used. + * @param text The text to show. Can be formatted text. + * @param style The style with a background and a duration. + * @param floating true if it'll float. + */ + private static AppMsg makeText(Activity context, CharSequence text, Style style, View view, boolean floating, float textSize) { + AppMsg result = new AppMsg(context); + + view.setBackgroundResource(style.background); + + TextView tv = (TextView) view.findViewById(android.R.id.message); + if(textSize > 0) tv.setTextSize(textSize); + tv.setText(text); + + result.mView = view; + result.mDuration = style.duration; + result.mFloating = floating; + + return result; + } + + /** + * Make a {@link AppMsg} with a custom view. It can be used to create non-floating notifications if floating is false. + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param resId The resource id of the string resource to use. Can be + * formatted text. + * @param style The style with a background and a duration. + * @param floating true if it'll float. + */ + public static AppMsg makeText(Activity context, int resId, Style style, View customView, boolean floating) { + return makeText(context, context.getResources().getText(resId), style, customView, floating); + } + + /** + * Make a {@link AppMsg} that just contains a text view with the text from a + * resource. + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param resId The resource id of the string resource to use. Can be + * formatted text. + * @param style The style with a background and a duration. + * @throws Resources.NotFoundException if the resource can't be found. + */ + public static AppMsg makeText(Activity context, int resId, Style style) + throws Resources.NotFoundException { + return makeText(context, context.getResources().getText(resId), style); + } + + /** + * Make a {@link AppMsg} with a custom layout using the text from a + * resource. The layout must have a {@link TextView} com id {@link android.R.id.message} + * + * @param context The context to use. Usually your + * {@link android.app.Activity} object. + * @param resId The resource id of the string resource to use. Can be + * formatted text. + * @param style The style with a background and a duration. + * @throws Resources.NotFoundException if the resource can't be found. + */ + public static AppMsg makeText(Activity context, int resId, Style style, int layoutId) + throws Resources.NotFoundException { + return makeText(context, context.getResources().getText(resId), style, layoutId); + } + + /** + * Show the view for the specified duration. + */ + public void show() { + MsgManager manager = MsgManager.obtain(mActivity); + manager.add(this); + } + + /** + * @return <code>true</code> if the {@link AppMsg} is being displayed, else <code>false</code>. + */ + public boolean isShowing() { + if (mFloating) { + return mView != null && mView.getParent() != null; + } else { + return mView.getVisibility() == View.VISIBLE; + } + } + + /** + * Close the view if it's showing, or don't show it if it isn't showing yet. + * You do not normally have to call this. Normally view will disappear on its own + * after the appropriate duration. + */ + public void cancel() { + MsgManager.obtain(mActivity).clearMsg(this); + + } + + /** + * Cancels all queued {@link AppMsg}s, in all Activities. If there is a {@link AppMsg} + * displayed currently, it will be the last one displayed. + */ + public static void cancelAll() { + MsgManager.clearAll(); + } + + /** + * Cancels all queued {@link AppMsg}s, in given {@link android.app.Activity}. + * If there is a {@link AppMsg} displayed currently, it will be the last one displayed. + * @param activity + */ + public static void cancelAll(Activity activity) { + MsgManager.release(activity); + } + + /** + * Return the activity. + */ + public Activity getActivity() { + return mActivity; + } + + /** + * Set the view to show. + * + * @see #getView + */ + public void setView(View view) { + mView = view; + } + + /** + * Return the view. + * + * @see #setView + */ + public View getView() { + return mView; + } + + /** + * Set how long to show the view for. + * + * @see #LENGTH_SHORT + * @see #LENGTH_LONG + */ + public void setDuration(int duration) { + mDuration = duration; + } + + /** + * Return the duration. + * + * @see #setDuration + */ + public int getDuration() { + return mDuration; + } + + /** + * Update the text in a AppMsg that was previously created using one of the makeText() methods. + * + * @param resId The new text for the AppMsg. + */ + public void setText(int resId) { + setText(mActivity.getText(resId)); + } + + /** + * Update the text in a AppMsg that was previously created using one of the makeText() methods. + * + * @param s The new text for the AppMsg. + */ + public void setText(CharSequence s) { + if (mView == null) { + throw new RuntimeException("This AppMsg was not created with AppMsg.makeText()"); + } + TextView tv = (TextView) mView.findViewById(android.R.id.message); + if (tv == null) { + throw new RuntimeException("This AppMsg was not created with AppMsg.makeText()"); + } + tv.setText(s); + } + + /** + * Gets the crouton's layout parameters, constructing a default if necessary. + * + * @return the layout parameters + */ + public LayoutParams getLayoutParams() { + if (mLayoutParams == null) { + mLayoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + } + return mLayoutParams; + } + + /** + * Sets the layout parameters which will be used to display the crouton. + * + * @param layoutParams The layout parameters to use. + * @return <code>this</code>, for chaining. + */ + public AppMsg setLayoutParams(LayoutParams layoutParams) { + mLayoutParams = layoutParams; + return this; + } + + /** + * Constructs and sets the layout parameters to have some gravity. + * + * @param gravity the gravity of the Crouton + * @return <code>this</code>, for chaining. + * @see android.view.Gravity + */ + public AppMsg setLayoutGravity(int gravity) { + mLayoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, gravity); + return this; + } + + /** + * Return the value of floating. + * + * @see #setFloating(boolean) + */ + public boolean isFloating() { + return mFloating; + } + + /** + * Sets the value of floating. + * + * @param mFloating + */ + public void setFloating(boolean mFloating) { + this.mFloating = mFloating; + } + + /** + * Sets the Animations to be used when displaying/removing the Crouton. + * @param inAnimation the Animation resource ID to be used when displaying. + * @param outAnimation the Animation resource ID to be used when removing. + */ + public AppMsg setAnimation(int inAnimation, int outAnimation) { + return setAnimation(AnimationUtils.loadAnimation(mActivity, inAnimation), + AnimationUtils.loadAnimation(mActivity, outAnimation)); + } + + /** + * Sets the Animations to be used when displaying/removing the Crouton. + * @param inAnimation the Animation to be used when displaying. + * @param outAnimation the Animation to be used when removing. + */ + public AppMsg setAnimation(Animation inAnimation, Animation outAnimation) { + mInAnimation = inAnimation; + mOutAnimation = outAnimation; + return this; + } + + /** + * @return + * Current priority + * + * @see #PRIORITY_HIGH + * @see #PRIORITY_NORMAL + * @see #PRIORITY_LOW + */ + public int getPriority() { + return mPriority; + } + + /** + * <p>Set priority for this message</p> + * <p><b>Note</b>: This only affects the order in which the messages get shown, + * not the stacking order of the views.</p> + * + * <p>Example: In the queue there are 3 messages [A, B, C], + * all of them with priority {@link #PRIORITY_NORMAL}, currently message A is being shown + * so we add a new message D with priority {@link #PRIORITY_HIGH}, after A goes away, given that + * D has a higher priority than B an the reset, D will be shown, then once that D is gone, + * B will be shown, and then finally C.</p> + * + * @param priority + * A value indicating priority, although you can use any integer value, usage of already + * defined is highly encouraged. + * + * @see #PRIORITY_HIGH + * @see #PRIORITY_NORMAL + * @see #PRIORITY_LOW + */ + public void setPriority(int priority) { + mPriority = priority; + } + + /** + * @return + * Provided parent to add {@link #getView()} to using {@link #getLayoutParams()}. + */ + public ViewGroup getParent() { + return mParent; + } + + /** + * Provide a different parent than Activity decor view + * @param parent + * Provided parent to add {@link #getView()} to using {@link #getLayoutParams()}. + * + */ + public void setParent(ViewGroup parent) { + mParent = parent; + } + + /** + * Provide a different parent than Activity decor view + * + * @param parentId + * Provided parent id to add {@link #getView()} to using {@link #getLayoutParams()}. + * + */ + public void setParent(int parentId) { + setParent((ViewGroup) mActivity.findViewById(parentId)); + } + + /** + * The style for a {@link AppMsg}. + * + * @author e.shishkin + */ + public static class Style { + + private final int duration; + private final int background; + + /** + * Construct an {@link AppMsg.Style} object. + * + * @param duration How long to display the message. Either + * {@link #LENGTH_SHORT} or {@link #LENGTH_LONG} + * @param resId resource for AppMsg background + */ + public Style(int duration, int resId) { + this.duration = duration; + this.background = resId; + } + + /** + * Return the duration in milliseconds. + */ + public int getDuration() { + return duration; + } + + /** + * Return the resource id of background. + */ + public int getBackground() { + return background; + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof AppMsg.Style)) { + return false; + } + Style style = (Style) o; + return style.duration == duration + && style.background == background; + } + + } + +} |