Home | History | Annotate | Download | only in incallui
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.incallui;
     18 
     19 import android.content.Context;
     20 import android.os.Handler;
     21 import android.os.Message;
     22 import android.telecom.VideoProfile;
     23 import android.util.AttributeSet;
     24 import android.view.View;
     25 
     26 import com.android.incallui.widget.multiwaveview.GlowPadView;
     27 
     28 /**
     29  *
     30  */
     31 public class GlowPadWrapper extends GlowPadView implements GlowPadView.OnTriggerListener {
     32 
     33     // Parameters for the GlowPadView "ping" animation; see triggerPing().
     34     private static final int PING_MESSAGE_WHAT = 101;
     35     private static final boolean ENABLE_PING_AUTO_REPEAT = true;
     36     private static final long PING_REPEAT_DELAY_MS = 1200;
     37 
     38     private final Handler mPingHandler = new Handler() {
     39         @Override
     40         public void handleMessage(Message msg) {
     41             switch (msg.what) {
     42                 case PING_MESSAGE_WHAT:
     43                     triggerPing();
     44                     break;
     45             }
     46         }
     47     };
     48 
     49     private AnswerListener mAnswerListener;
     50     private boolean mPingEnabled = true;
     51     private boolean mTargetTriggered = false;
     52 
     53     public GlowPadWrapper(Context context) {
     54         super(context);
     55         Log.d(this, "class created " + this + " ");
     56     }
     57 
     58     public GlowPadWrapper(Context context, AttributeSet attrs) {
     59         super(context, attrs);
     60         Log.d(this, "class created " + this);
     61     }
     62 
     63     @Override
     64     protected void onFinishInflate() {
     65         Log.d(this, "onFinishInflate()");
     66         super.onFinishInflate();
     67         setOnTriggerListener(this);
     68     }
     69 
     70     public void startPing() {
     71         Log.d(this, "startPing");
     72         mPingEnabled = true;
     73         triggerPing();
     74     }
     75 
     76     public void stopPing() {
     77         Log.d(this, "stopPing");
     78         mPingEnabled = false;
     79         mPingHandler.removeMessages(PING_MESSAGE_WHAT);
     80     }
     81 
     82     private void triggerPing() {
     83         Log.d(this, "triggerPing(): " + mPingEnabled + " " + this);
     84         if (mPingEnabled && !mPingHandler.hasMessages(PING_MESSAGE_WHAT)) {
     85             ping();
     86 
     87             if (ENABLE_PING_AUTO_REPEAT) {
     88                 mPingHandler.sendEmptyMessageDelayed(PING_MESSAGE_WHAT, PING_REPEAT_DELAY_MS);
     89             }
     90         }
     91     }
     92 
     93     @Override
     94     public void onGrabbed(View v, int handle) {
     95         Log.d(this, "onGrabbed()");
     96         stopPing();
     97     }
     98 
     99     @Override
    100     public void onReleased(View v, int handle) {
    101         Log.d(this, "onReleased()");
    102         if (mTargetTriggered) {
    103             mTargetTriggered = false;
    104         } else {
    105             startPing();
    106         }
    107     }
    108 
    109     @Override
    110     public void onTrigger(View v, int target) {
    111         Log.d(this, "onTrigger()");
    112         final int resId = getResourceIdForTarget(target);
    113         switch (resId) {
    114             case R.drawable.ic_lockscreen_answer:
    115                 mAnswerListener.onAnswer(VideoProfile.VideoState.AUDIO_ONLY, getContext());
    116                 mTargetTriggered = true;
    117                 break;
    118             case R.drawable.ic_lockscreen_decline:
    119                 mAnswerListener.onDecline();
    120                 mTargetTriggered = true;
    121                 break;
    122             case R.drawable.ic_lockscreen_text:
    123                 mAnswerListener.onText();
    124                 mTargetTriggered = true;
    125                 break;
    126             case R.drawable.ic_videocam:
    127                 mAnswerListener.onAnswer(VideoProfile.VideoState.BIDIRECTIONAL, getContext());
    128                 mTargetTriggered = true;
    129                 break;
    130             case R.drawable.ic_toolbar_video_off:
    131                 InCallPresenter.getInstance().declineUpgradeRequest(getContext());
    132                 mTargetTriggered = true;
    133                 break;
    134             default:
    135                 // Code should never reach here.
    136                 Log.e(this, "Trigger detected on unhandled resource. Skipping.");
    137         }
    138     }
    139 
    140     @Override
    141     public void onGrabbedStateChange(View v, int handle) {
    142 
    143     }
    144 
    145     @Override
    146     public void onFinishFinalAnimation() {
    147 
    148     }
    149 
    150     public void setAnswerListener(AnswerListener listener) {
    151         mAnswerListener = listener;
    152     }
    153 
    154     public interface AnswerListener {
    155         void onAnswer(int videoState, Context context);
    156         void onDecline();
    157         void onText();
    158     }
    159 }
    160