/* * Copyright (C) 2013 The Android Open Source Project * * 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.android.incallui; import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.View; import com.android.incallui.widget.multiwaveview.GlowPadView; /** * */ public class GlowPadWrapper extends GlowPadView implements GlowPadView.OnTriggerListener { // Parameters for the GlowPadView "ping" animation; see triggerPing(). private static final int PING_MESSAGE_WHAT = 101; private static final boolean ENABLE_PING_AUTO_REPEAT = true; private static final long PING_REPEAT_DELAY_MS = 1200; private final Handler mPingHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case PING_MESSAGE_WHAT: triggerPing(); break; } } }; private AnswerListener mAnswerListener; private boolean mPingEnabled = true; private boolean mTargetTriggered = false; public GlowPadWrapper(Context context) { super(context); Log.d(this, "class created " + this + " "); } public GlowPadWrapper(Context context, AttributeSet attrs) { super(context, attrs); Log.d(this, "class created " + this); } @Override protected void onFinishInflate() { Log.d(this, "onFinishInflate()"); super.onFinishInflate(); setOnTriggerListener(this); } public void startPing() { Log.d(this, "startPing"); mPingEnabled = true; triggerPing(); } public void stopPing() { Log.d(this, "stopPing"); mPingEnabled = false; mPingHandler.removeMessages(PING_MESSAGE_WHAT); } private void triggerPing() { Log.d(this, "triggerPing(): " + mPingEnabled + " " + this); if (mPingEnabled && !mPingHandler.hasMessages(PING_MESSAGE_WHAT)) { ping(); if (ENABLE_PING_AUTO_REPEAT) { mPingHandler.sendEmptyMessageDelayed(PING_MESSAGE_WHAT, PING_REPEAT_DELAY_MS); } } } @Override public void onGrabbed(View v, int handle) { Log.d(this, "onGrabbed()"); stopPing(); } @Override public void onReleased(View v, int handle) { Log.d(this, "onReleased()"); if (mTargetTriggered) { mTargetTriggered = false; } else { startPing(); } } @Override public void onTrigger(View v, int target) { Log.d(this, "onTrigger()"); final int resId = getResourceIdForTarget(target); switch (resId) { case R.drawable.ic_lockscreen_answer: mAnswerListener.onAnswer(); mTargetTriggered = true; break; case R.drawable.ic_lockscreen_decline: mAnswerListener.onDecline(); mTargetTriggered = true; break; case R.drawable.ic_lockscreen_text: mAnswerListener.onText(); mTargetTriggered = true; break; default: // Code should never reach here. Log.e(this, "Trigger detected on unhandled resource. Skipping."); } } @Override public void onGrabbedStateChange(View v, int handle) { } @Override public void onFinishFinalAnimation() { } public void setAnswerListener(AnswerListener listener) { mAnswerListener = listener; } public interface AnswerListener { void onAnswer(); void onDecline(); void onText(); } }