/talkback_preics/src/com/google/android/marvin/talkback/BasePackageMonitor.java

http://eyes-free.googlecode.com/ · Java · 108 lines · 50 code · 13 blank · 45 comment · 10 complexity · d7c61e32b335c8e481e95bc1ed314b9c MD5 · raw file

  1. /*
  2. * Copyright (C) 2010 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. package com.google.android.marvin.talkback;
  17. import android.content.BroadcastReceiver;
  18. import android.content.Context;
  19. import android.content.Intent;
  20. import android.content.IntentFilter;
  21. import android.net.Uri;
  22. /**
  23. * Helper class for monitoring packages on the system.
  24. */
  25. public class BasePackageMonitor extends BroadcastReceiver {
  26. /**
  27. * The intent filter to match package modifications.
  28. */
  29. final IntentFilter mPackageFilter = new IntentFilter();
  30. /**
  31. * The context in which this monitor is registered.
  32. */
  33. private Context mRegisteredContext;
  34. /**
  35. * Creates a new instance.
  36. */
  37. public BasePackageMonitor() {
  38. mPackageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
  39. mPackageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
  40. mPackageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
  41. mPackageFilter.addDataScheme("package");
  42. }
  43. /**
  44. * Register this monitor via the given <code>context</code>.
  45. */
  46. public void register(Context context) {
  47. if (mRegisteredContext != null) {
  48. throw new IllegalStateException("Already registered");
  49. }
  50. mRegisteredContext = context;
  51. context.registerReceiver(this, mPackageFilter);
  52. }
  53. /**
  54. * Unregister this monitor.
  55. */
  56. public void unregister() {
  57. if (mRegisteredContext == null) {
  58. throw new IllegalStateException("Not registered");
  59. }
  60. mRegisteredContext.unregisterReceiver(this);
  61. mRegisteredContext = null;
  62. }
  63. @Override
  64. public void onReceive(Context context, Intent intent) {
  65. String packageName = getPackageName(intent);
  66. String action = intent.getAction();
  67. if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
  68. onPackageAdded(packageName);
  69. } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
  70. onPackageRemoved(packageName);
  71. } else if (Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
  72. onPackageChanged(packageName);
  73. }
  74. }
  75. /**
  76. * @return The name of the package from an <code>intent</code>.
  77. */
  78. private String getPackageName(Intent intent) {
  79. Uri uri = intent.getData();
  80. String packageName = uri != null ? uri.getSchemeSpecificPart() : null;
  81. return packageName;
  82. }
  83. /**
  84. * Called when a <code>packageName</code> is added.
  85. */
  86. protected void onPackageAdded(String packageName) {}
  87. /**
  88. * Called when a <code>packageName</code> is removed.
  89. */
  90. protected void onPackageRemoved(String packageName) {}
  91. /**
  92. * Called when a <code>packageName</code> is changes.
  93. */
  94. protected void onPackageChanged(String packageName) {}
  95. }