/*
* Copyright (C) 2014 AChep@xda <artemchep@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package com.achep.acdisplay.ui.widgets.notification;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.achep.acdisplay.R;
import com.achep.acdisplay.interfaces.INotificatiable;
import com.achep.acdisplay.notifications.NotificationUiHelper;
import com.achep.acdisplay.notifications.OpenNotification;
/**
* Simple notification widget that shows the title of notification,
* its message, icon, actions and more.
*
* @author Artem Chepurnoy
*/
public class NotificationWidget extends LinearLayout implements
INotificatiable, NotificationUiHelper.OnNotificationContentChanged {
private NotificationUiHelper mHelper;
// Views
private ViewGroup mContent;
private ImageView mLargeIcon;
private TextView mWhenTextView;
private TextView mTitleTextView;
private TextView mSubtitleTextView;
private NotificationMessages mMessageContainer;
private NotificationActions mActionsContainer;
private Callback mCallback;
public interface Callback extends NotificationActions.Callback {
/**
* Called on content view click.
*
* @param v clicked view
* @see NotificationWidget#getNotification()
*/
void onContentClick(@NonNull NotificationWidget widget, @NonNull View v);
}
public NotificationWidget(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public NotificationWidget(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mHelper = new NotificationUiHelper(context, this);
mHelper.setBig(true);
}
/**
* Register a callback to be invoked when notification views are clicked.
*/
public void setCallback(@Nullable Callback callback) {
mCallback = callback;
// Set the callback
mActionsContainer.setCallback(callback);
mContent.setOnClickListener(callback == null
? null
: new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCallback != null) {
NotificationWidget widget = NotificationWidget.this;
mCallback.onContentClick(widget, v);
}
}
});
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mContent = (ViewGroup) findViewById(R.id.content);
mLargeIcon = (ImageView) findViewById(R.id.icon);
mWhenTextView = (TextView) findViewById(R.id.when);
mTitleTextView = (TextView) findViewById(R.id.title);
mSubtitleTextView = (TextView) findViewById(R.id.subtext);
mMessageContainer = (NotificationMessages) findViewById(R.id.message_container);
mActionsContainer = (NotificationActions) findViewById(R.id.actions);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
mHelper.resume();
}
@Override
protected void onDetachedFromWindow() {
mHelper.pause();
super.onDetachedFromWindow();
}
/**
* {@inheritDoc}
*/
@Override
public void onNotificationContentChanged(@NonNull NotificationUiHelper helper, int event) {
switch (event) {
case NotificationUiHelper.EVENT_LARGE_ICON_CHANGED:
mLargeIcon.setImageBitmap(helper.getLargeIcon());
break;
case NotificationUiHelper.EVENT_TIMESTAMP_CHANGED:
mWhenTextView.setText(helper.getTimestamp());
break;
case NotificationUiHelper.EVENT_TITLE_CHANGED:
mTitleTextView.setText(helper.getTitle());
break;
case NotificationUiHelper.EVENT_SUBTITLE_CHANGED:
mSubtitleTextView.setText(helper.getSubtitle());
break;
case NotificationUiHelper.EVENT_MESSAGE_CHANGED:
mMessageContainer.setMessages(helper.getMessages());
break;
case NotificationUiHelper.EVENT_ACTIONS_CHANGED:
mActionsContainer.setActions(helper.getNotification(), helper.getActions());
break;
}
}
/**
* {@inheritDoc}
*/
@Override
public OpenNotification getNotification() {
return mHelper.getNotification();
}
/**
* {@inheritDoc}
*/
@Override
public void setNotification(OpenNotification n) {
mHelper.setNotification(n);
}
}