/actionslib/src/com/google/android/marvin/commands/impls/SavingPhoneStateListener.java

http://eyes-free.googlecode.com/ · Java · 162 lines · 119 code · 21 blank · 22 comment · 62 complexity · 26ee5d345c503189fa29b0ace7150091 MD5 · raw file

  1. // Copyright 2011 Google Inc. All Rights Reserved.
  2. package com.google.android.marvin.commands.impls;
  3. import android.content.Context;
  4. import android.telephony.PhoneStateListener;
  5. import android.telephony.ServiceState;
  6. import android.telephony.SignalStrength;
  7. import android.telephony.TelephonyManager;
  8. /**
  9. * A phone state listener that saves the latest value to shared preferences.
  10. *
  11. * @author clsimon@google.com (Cheryl Simon)
  12. */
  13. public class SavingPhoneStateListener extends PhoneStateListener {
  14. /** The shared signal strength in bars. */
  15. private static int sVoiceLevel = -1;
  16. private final TelephonyManager mTelephonyManager;
  17. /** Whether the phone has service. */
  18. private boolean mInService = true;
  19. public SavingPhoneStateListener(Context context) {
  20. mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
  21. }
  22. /**
  23. * @return the most recently set signal strength in bars
  24. */
  25. public static int getVoiceLevel() {
  26. return sVoiceLevel;
  27. }
  28. /**
  29. * Sets the signal strength in bars.
  30. *
  31. * @param level The signal strength in bars.
  32. */
  33. private static void setVoiceLevel(int level) {
  34. sVoiceLevel = level;
  35. }
  36. @Override
  37. public void onServiceStateChanged(ServiceState service) {
  38. if (service.getState() != ServiceState.STATE_IN_SERVICE) {
  39. mInService = false;
  40. } else {
  41. mInService = true;
  42. }
  43. }
  44. @Override
  45. public void onSignalStrengthsChanged(SignalStrength signalStrength) {
  46. final int voiceSignalStrength = signalStrengthToBars(signalStrength);
  47. setVoiceLevel(voiceSignalStrength);
  48. }
  49. /**
  50. * Computes a signal strength in bars from a {@link SignalStrength} object.
  51. *
  52. * @param signalStrength The detected signal strength.
  53. * @return the signal strength in bars
  54. */
  55. private int signalStrengthToBars(SignalStrength signalStrength) {
  56. if (signalStrength.isGsm()) {
  57. return gsmSignalStrengthToBars(signalStrength.getGsmSignalStrength());
  58. } else if (mTelephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_CDMA) {
  59. return cdmaStrengthToBars(signalStrength.getCdmaDbm(), signalStrength.getCdmaEcio());
  60. } else {
  61. return evdoStrengthToBars(signalStrength.getEvdoDbm(), signalStrength.getEvdoSnr());
  62. }
  63. }
  64. private int gsmSignalStrengthToBars(int strength) {
  65. if ((strength == -1) || !mInService) {
  66. return -1;
  67. } else if (strength <= 0 || strength == 99) {
  68. return 0;
  69. } else if (strength >= 16) {
  70. return 4;
  71. } else if (strength >= 8) {
  72. return 3;
  73. } else if (strength >= 4) {
  74. return 2;
  75. } else {
  76. return 1;
  77. }
  78. }
  79. private int cdmaStrengthToBars(int dbm, int ecio) {
  80. int dbmLevel;
  81. if (!mInService) {
  82. dbmLevel = -1;
  83. } else if (dbm >= -75) {
  84. dbmLevel = 4;
  85. } else if (dbm >= -85) {
  86. dbmLevel = 3;
  87. } else if (dbm >= -95) {
  88. dbmLevel = 2;
  89. } else if (dbm >= -100) {
  90. dbmLevel = 1;
  91. } else {
  92. dbmLevel = -1;
  93. }
  94. int ecioLevel;
  95. if (!mInService) {
  96. ecioLevel = -1;
  97. } else if (ecio >= -90) {
  98. ecioLevel = 4;
  99. } else if (ecio >= -110) {
  100. ecioLevel = 3;
  101. } else if (ecio >= -130) {
  102. ecioLevel = 2;
  103. } else if (ecio >= -150) {
  104. ecioLevel = 1;
  105. } else {
  106. ecioLevel = -1;
  107. }
  108. return dbmLevel < ecioLevel ? dbmLevel : ecioLevel;
  109. }
  110. private int evdoStrengthToBars(int dbm, int snr) {
  111. int dbmLevel;
  112. if (!mInService) {
  113. dbmLevel = -1;
  114. } else if (dbm >= -65) {
  115. dbmLevel = 4;
  116. } else if (dbm >= -75) {
  117. dbmLevel = 3;
  118. } else if (dbm >= -90) {
  119. dbmLevel = 2;
  120. } else if (dbm >= -105) {
  121. dbmLevel = 1;
  122. } else {
  123. dbmLevel = -1;
  124. }
  125. int snrLevel;
  126. if (!mInService) {
  127. snrLevel = -1;
  128. } else if (snr >= 7) {
  129. snrLevel = 4;
  130. } else if (snr >= 5) {
  131. snrLevel = 3;
  132. } else if (snr >= 3) {
  133. snrLevel = 2;
  134. } else if (snr >= 1) {
  135. snrLevel = 1;
  136. } else {
  137. snrLevel = -1;
  138. }
  139. return dbmLevel < snrLevel ? dbmLevel : snrLevel;
  140. }
  141. }