1/*
2 * Copyright (C) 2017 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
17package com.googlecode.android_scripting.facade;
18
19import android.media.AudioManager;
20import android.media.ToneGenerator;
21
22import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
23import com.googlecode.android_scripting.rpc.Rpc;
24import com.googlecode.android_scripting.rpc.RpcDefault;
25import com.googlecode.android_scripting.rpc.RpcParameter;
26
27/**
28 * Generate DTMF tones.
29 *
30 */
31public class ToneGeneratorFacade extends RpcReceiver {
32
33  private final ToneGenerator mToneGenerator;
34
35  public ToneGeneratorFacade(FacadeManager manager) {
36    super(manager);
37    mToneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, 100);
38  }
39
40  @Rpc(description = "Generate DTMF tones for the given phone number.")
41  public void generateDtmfTones(
42      @RpcParameter(name = "phoneNumber") String phoneNumber,
43      @RpcParameter(name = "toneDuration", description = "duration of each tone in milliseconds") @RpcDefault("100") Integer toneDuration)
44      throws InterruptedException {
45    try {
46      for (int i = 0; i < phoneNumber.length(); i++) {
47        switch (phoneNumber.charAt(i)) {
48        case '0':
49          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_0);
50          Thread.sleep(toneDuration);
51          break;
52        case '1':
53          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_1);
54          Thread.sleep(toneDuration);
55          break;
56        case '2':
57          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_2);
58          Thread.sleep(toneDuration);
59          break;
60        case '3':
61          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_3);
62          Thread.sleep(toneDuration);
63          break;
64        case '4':
65          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_4);
66          Thread.sleep(toneDuration);
67          break;
68        case '5':
69          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_5);
70          Thread.sleep(toneDuration);
71          break;
72        case '6':
73          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_6);
74          Thread.sleep(toneDuration);
75          break;
76        case '7':
77          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_7);
78          Thread.sleep(toneDuration);
79          break;
80        case '8':
81          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_8);
82          Thread.sleep(toneDuration);
83          break;
84        case '9':
85          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_9);
86          Thread.sleep(toneDuration);
87          break;
88        case '*':
89          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_S);
90          Thread.sleep(toneDuration);
91          break;
92        case '#':
93          mToneGenerator.startTone(ToneGenerator.TONE_DTMF_P);
94          Thread.sleep(toneDuration);
95          break;
96        default:
97          throw new RuntimeException("Cannot generate tone for '" + phoneNumber.charAt(i) + "'");
98        }
99      }
100    } finally {
101      mToneGenerator.stopTone();
102    }
103  }
104
105  @Override
106  public void shutdown() {
107  }
108}
109