From ff27eb8ae3bfb190c709921b0baaef1c0ebaf16b Mon Sep 17 00:00:00 2001 From: Ricky Barrette Date: Tue, 15 May 2012 10:39:00 -0400 Subject: [PATCH 1/2] Initial commit of the passive location listener Signed-off-by: Ricky Barrette --- LocationLib/bin/locationlib.jar | Bin 64059 -> 65379 bytes LocationLib/res/layout/base_map_fragment.xml | 2 +- .../android/SkyHook/SkyHookRegistration.java | 3 +- .../android/SkyHook/SkyHookService.java | 6 +- .../com/TwentyCodes/android/debug/Debug.java | 39 ++---------- .../debug/LocationLibraryConstants.java | 56 ++++++++++++++++++ .../android/location/CompassSensor.java | 5 +- .../android/location/LocationService.java | 5 +- .../PassiveLocationChangedReceiver.java | 40 +++++++++++++ .../location/PassiveLocationListener.java | 35 +++++++++++ 10 files changed, 147 insertions(+), 44 deletions(-) create mode 100644 LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java create mode 100644 LocationLib/src/com/TwentyCodes/android/location/PassiveLocationChangedReceiver.java create mode 100644 LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java diff --git a/LocationLib/bin/locationlib.jar b/LocationLib/bin/locationlib.jar index 53cfd010ee460823054c43a9caebeac774d37fd5..f886d681a68d90da35088b67042b2a2523785952 100644 GIT binary patch delta 22304 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 OKvK-HfU + android:apiKey="0rKmsWMM0D-LWOndcfwrmW-S0OXlnQl2SJCMeTg" /> -1 ? this.mRequiredAccuracy : Debug.MINIMUM_REQUIRED_ACCURACY) || Debug.REPORT_FIRST_LOCATION) + if(accuracy < (this.mRequiredAccuracy > -1 ? this.mRequiredAccuracy : LocationLibraryConstants.MINIMUM_REQUIRED_ACCURACY) || LocationLibraryConstants.REPORT_FIRST_LOCATION) this.stopSelf(this.mStartID); } diff --git a/LocationLib/src/com/TwentyCodes/android/debug/Debug.java b/LocationLib/src/com/TwentyCodes/android/debug/Debug.java index f3a9979..f4582fa 100644 --- a/LocationLib/src/com/TwentyCodes/android/debug/Debug.java +++ b/LocationLib/src/com/TwentyCodes/android/debug/Debug.java @@ -1,52 +1,21 @@ /** * Debug.java - * @date Mar 1, 2011 + * @date May 15, 2012 * @author ricky barrette * @author Twenty Codes, LLC */ package com.TwentyCodes.android.debug; -import android.hardware.SensorManager; - /** * This class will be used to enable and disable debugging features * @author ricky barrette */ -public final class Debug { - +public class Debug { + /** * Sets the logging level for this library * @author ricky barrette */ public static final boolean DEBUG = false; - - /** - * Sets the default SkyHook Registration Behavior used by SkyHookRegistration.getUserName() - * @author ricky barrette - */ - public static final SkyHookRegistrationBehavior DEFAULT_REGISTRATION_BEHAVIOR = SkyHookRegistrationBehavior.NORMAL; - /** - * Sets the default compass sensor update interval - * @author ricky barrette - */ - public static final int COMPASS_UPDATE_INTERVAL = SensorManager.SENSOR_DELAY_NORMAL; - - /** - * The maximum running time for a single shot location service - * @author ricky barrette - */ - public static final long MAX_LOCATION_SERVICE_RUN_TIME = 60000l; - - /** - * Forces single shot location services to return the first location - * @author ricky barrette - */ - public static final boolean REPORT_FIRST_LOCATION = false; - - /** - * Minimum Required accuracy to report - * @author ricky barrette - */ - public static final int MINIMUM_REQUIRED_ACCURACY = 50; -} \ No newline at end of file +} diff --git a/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java b/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java new file mode 100644 index 0000000..3552e2c --- /dev/null +++ b/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java @@ -0,0 +1,56 @@ +/** + * Debug.java + * @date Mar 1, 2011 + * @author ricky barrette + * @author Twenty Codes, LLC + */ +package com.TwentyCodes.android.debug; + +import android.hardware.SensorManager; + +/** + * This class will be used to set the Location Library Constants + * @author ricky barrette + */ +public final class LocationLibraryConstants { + + /** + * Sets the default SkyHook Registration Behavior used by SkyHookRegistration.getUserName() + * @author ricky barrette + */ + public static final SkyHookRegistrationBehavior DEFAULT_REGISTRATION_BEHAVIOR = SkyHookRegistrationBehavior.NORMAL; + + /** + * Sets the default compass sensor update interval + * @author ricky barrette + */ + public static final int COMPASS_UPDATE_INTERVAL = SensorManager.SENSOR_DELAY_NORMAL; + + /** + * The maximum running time for a single shot location service + * @author ricky barrette + */ + public static final long MAX_LOCATION_SERVICE_RUN_TIME = 60000l; + + /** + * Forces single shot location services to return the first location + * @author ricky barrette + */ + public static final boolean REPORT_FIRST_LOCATION = false; + + /** + * Minimum Required accuracy to report + * @author ricky barrette + */ + public static final int MINIMUM_REQUIRED_ACCURACY = 50; + + public static final boolean SUPPORTS_FROYO; + + public static final boolean SUPPORTS_GINGERBREAD; + + static{ + SUPPORTS_FROYO = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO; + + SUPPORTS_GINGERBREAD = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD; + } +} \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/CompassSensor.java b/LocationLib/src/com/TwentyCodes/android/location/CompassSensor.java index 2a8d1ed..8c4fd2c 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/CompassSensor.java +++ b/LocationLib/src/com/TwentyCodes/android/location/CompassSensor.java @@ -21,6 +21,7 @@ import android.view.Surface; import android.view.WindowManager; import com.TwentyCodes.android.debug.Debug; +import com.TwentyCodes.android.debug.LocationLibraryConstants; /** * A simple convince class that accesses the compass sensor on another thread @@ -206,9 +207,9 @@ public class CompassSensor{ @Override public void run() { // Register this class as a listener for the accelerometer sensor - mSensorManager.registerListener(mCallBack, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), Debug.COMPASS_UPDATE_INTERVAL); + mSensorManager.registerListener(mCallBack, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), LocationLibraryConstants.COMPASS_UPDATE_INTERVAL); // ...and the orientation sensor - mSensorManager.registerListener(mCallBack, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), Debug.COMPASS_UPDATE_INTERVAL); + mSensorManager.registerListener(mCallBack, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), LocationLibraryConstants.COMPASS_UPDATE_INTERVAL); } }).start(); } diff --git a/LocationLib/src/com/TwentyCodes/android/location/LocationService.java b/LocationLib/src/com/TwentyCodes/android/location/LocationService.java index 43f4304..3ebb8a6 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/LocationService.java +++ b/LocationLib/src/com/TwentyCodes/android/location/LocationService.java @@ -22,6 +22,7 @@ import android.os.PowerManager.WakeLock; import android.util.Log; import com.TwentyCodes.android.debug.Debug; +import com.TwentyCodes.android.debug.LocationLibraryConstants; /** * This service class will be used broadcast the users location either one time, or periodically. @@ -117,7 +118,7 @@ public class LocationService extends Service implements LocationListener { /* * que the fail safe runnable to kill the report location and kill it self after the MAX_RUN_TIME has been meet */ - new Handler().postDelayed(failSafe, Debug.MAX_LOCATION_SERVICE_RUN_TIME); + new Handler().postDelayed(failSafe, LocationLibraryConstants.MAX_LOCATION_SERVICE_RUN_TIME); super.onCreate(); } @@ -229,7 +230,7 @@ public class LocationService extends Service implements LocationListener { if(Debug.DEBUG) Log.d(TAG, "got location +- "+ location.getAccuracy() +"m"); mLocation = location; - if(location.getAccuracy() <= (mRequiredAccuracy > -1 ? mRequiredAccuracy : Debug.MINIMUM_REQUIRED_ACCURACY) || Debug.REPORT_FIRST_LOCATION){ + if(location.getAccuracy() <= (mRequiredAccuracy > -1 ? mRequiredAccuracy : LocationLibraryConstants.MINIMUM_REQUIRED_ACCURACY) || LocationLibraryConstants.REPORT_FIRST_LOCATION){ stopSelf(mStartId); } } diff --git a/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationChangedReceiver.java b/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationChangedReceiver.java new file mode 100644 index 0000000..19f18cb --- /dev/null +++ b/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationChangedReceiver.java @@ -0,0 +1,40 @@ +/** + * PassiveLocationChangedReceiver.java + * @date May 15, 2012 + * @author ricky barrette + * @author Twenty Codes, LLC + */ +package com.TwentyCodes.android.location; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.location.Location; +import android.location.LocationManager; + +/** + * @author ricky barrette + */ +public abstract class PassiveLocationChangedReceiver extends BroadcastReceiver { + + protected Context mContext; + + /** + * (non-Javadoc) + * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) + */ + @Override + public void onReceive(Context context, Intent intent) { + mContext = context; + final String key = LocationManager.KEY_LOCATION_CHANGED; + if (intent.hasExtra(key)) + onLocationUpdate((Location)intent.getExtras().get(key)); + } + + /** + * called when a location update is received + * @param parcelableExtra + * @author ricky barrette + */ + public abstract void onLocationUpdate(Location location); +} \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java b/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java new file mode 100644 index 0000000..91311f7 --- /dev/null +++ b/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java @@ -0,0 +1,35 @@ +/** + * PassiveLocationListener.java + * @date May 15, 2012 + * @author ricky barrette + * @author Twenty Codes, LLC + */ +package com.TwentyCodes.android.location; + +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.location.LocationManager; + +import com.TwentyCodes.android.debug.LocationLibraryConstants; + +/** + * A convenience class for requesting passive location updates + * @author ricky barrette + */ +public class PassiveLocationListener { + + /** + * A convenience method for requesting passive location updates + * @param context + * @author ricky barrette + */ + public static final void requestPassiveLocationUpdates(final Context context){ + if (LocationLibraryConstants.SUPPORTS_FROYO) { + final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); + final Intent passiveIntent = new Intent(context, PassiveLocationChangedReceiver.class); + final PendingIntent locationListenerPassivePendingIntent = PendingIntent.getBroadcast(context, 0, passiveIntent, PendingIntent.FLAG_UPDATE_CURRENT); + locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, locationListenerPassivePendingIntent); + } + } +} \ No newline at end of file From fa9985aed5131e8916111d1183ef11d411e47111 Mon Sep 17 00:00:00 2001 From: Ricky Barrette Date: Wed, 16 May 2012 10:41:53 -0400 Subject: [PATCH 2/2] Cleaned Up code related to broadcasting and receving locations updates Signed-off-by: Ricky Barrette --- LocationLib/bin/locationlib.jar | Bin 65379 -> 64550 bytes .../android/SkyHook/SkyHookService.java | 11 +++-- .../debug/LocationLibraryConstants.java | 17 ++++--- ...eceiver.java => BaseLocationReceiver.java} | 12 ++--- .../android/location/LocationReceiver.java | 46 ------------------ .../android/location/LocationService.java | 9 ++-- .../location/PassiveLocationListener.java | 6 +-- 7 files changed, 31 insertions(+), 70 deletions(-) rename LocationLib/src/com/TwentyCodes/android/location/{PassiveLocationChangedReceiver.java => BaseLocationReceiver.java} (77%) delete mode 100644 LocationLib/src/com/TwentyCodes/android/location/LocationReceiver.java diff --git a/LocationLib/bin/locationlib.jar b/LocationLib/bin/locationlib.jar index f886d681a68d90da35088b67042b2a2523785952..ca2cbd391af5047bab4a0e17663d297ad6d37810 100644 GIT binary patch delta 10540 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 diff --git a/LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHookService.java b/LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHookService.java index e30d918..a077c77 100644 --- a/LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHookService.java +++ b/LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHookService.java @@ -13,13 +13,14 @@ import android.app.Service; import android.content.Context; import android.content.Intent; import android.location.Location; +import android.location.LocationManager; import android.os.Handler; import android.os.IBinder; import android.util.Log; import com.TwentyCodes.android.debug.LocationLibraryConstants; import com.TwentyCodes.android.location.GeoPointLocationListener; -import com.TwentyCodes.android.location.LocationReceiver; +import com.TwentyCodes.android.location.BaseLocationReceiver; import com.google.android.maps.GeoPoint; import com.skyhookwireless.wps.RegistrationCallback; import com.skyhookwireless.wps.WPSContinuation; @@ -49,8 +50,8 @@ public class SkyHookService extends Service implements GeoPointLocationListener, public static final String INTENT_EXTRA_REQUIRED_ACCURACY = "required_accuracy"; /** - * Used to tell the service the update action to broadcast. If this is not supplied, {@link LocationReceiver.INTENT_EXTRA_ACTION_UPDATE } will be used. - * @see LocationReceiver.INTENT_EXTRA_ACTION_UPDATE + * Used to tell the service the update action to broadcast. If this is not supplied, {@link BaseLocationReceiver.INTENT_EXTRA_ACTION_UPDATE } will be used. + * @see BaseLocationReceiver.INTENT_EXTRA_ACTION_UPDATE */ public static final String INTENT_EXTRA_ACTION_UPDATE = "action_update"; @@ -75,8 +76,8 @@ public class SkyHookService extends Service implements GeoPointLocationListener, if(mIntent.getAction() != null) locationUpdate.setAction(mIntent.getAction()); else - locationUpdate.setAction(LocationReceiver.INTENT_EXTRA_ACTION_UPDATE); - locationUpdate.putExtra(LocationReceiver.INTENT_EXTRA_LOCATION_PARCEL, convertLocation()); + locationUpdate.setAction(LocationLibraryConstants.INTENT_ACTION_UPDATE); + locationUpdate.putExtra(LocationManager.KEY_LOCATION_CHANGED, convertLocation()); sendBroadcast(locationUpdate); } } diff --git a/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java b/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java index 3552e2c..34072af 100644 --- a/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java +++ b/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java @@ -1,5 +1,5 @@ /** - * Debug.java + * LocationLibraryConstants.java * @date Mar 1, 2011 * @author ricky barrette * @author Twenty Codes, LLC @@ -7,6 +7,7 @@ package com.TwentyCodes.android.debug; import android.hardware.SensorManager; +import android.location.LocationManager; /** * This class will be used to set the Location Library Constants @@ -14,6 +15,12 @@ import android.hardware.SensorManager; */ public final class LocationLibraryConstants { + static{ + SUPPORTS_FROYO = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO; + + SUPPORTS_GINGERBREAD = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD; + } + /** * Sets the default SkyHook Registration Behavior used by SkyHookRegistration.getUserName() * @author ricky barrette @@ -47,10 +54,8 @@ public final class LocationLibraryConstants { public static final boolean SUPPORTS_FROYO; public static final boolean SUPPORTS_GINGERBREAD; + + public static final String INTENT_ACTION_UPDATE = "TwentyCodes.intent.action.LocationUpdate"; - static{ - SUPPORTS_FROYO = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO; - - SUPPORTS_GINGERBREAD = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD; - } + public static final String INTENT_EXTRA_LOCATION_CHANGED = LocationManager.KEY_LOCATION_CHANGED; } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationChangedReceiver.java b/LocationLib/src/com/TwentyCodes/android/location/BaseLocationReceiver.java similarity index 77% rename from LocationLib/src/com/TwentyCodes/android/location/PassiveLocationChangedReceiver.java rename to LocationLib/src/com/TwentyCodes/android/location/BaseLocationReceiver.java index 19f18cb..1a618bb 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationChangedReceiver.java +++ b/LocationLib/src/com/TwentyCodes/android/location/BaseLocationReceiver.java @@ -1,8 +1,7 @@ /** - * PassiveLocationChangedReceiver.java - * @date May 15, 2012 - * @author ricky barrette * @author Twenty Codes, LLC + * @author ricky barrette + * @date Oct 18, 2010 */ package com.TwentyCodes.android.location; @@ -13,11 +12,12 @@ import android.location.Location; import android.location.LocationManager; /** + * this abstract class will be used as a for classes wishing to be a receiver of location updates from the location services * @author ricky barrette */ -public abstract class PassiveLocationChangedReceiver extends BroadcastReceiver { - - protected Context mContext; +public abstract class BaseLocationReceiver extends BroadcastReceiver { + + public Context mContext; /** * (non-Javadoc) diff --git a/LocationLib/src/com/TwentyCodes/android/location/LocationReceiver.java b/LocationLib/src/com/TwentyCodes/android/location/LocationReceiver.java deleted file mode 100644 index 79178c3..0000000 --- a/LocationLib/src/com/TwentyCodes/android/location/LocationReceiver.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @author Twenty Codes, LLC - * @author ricky barrette - * @date Oct 18, 2010 - */ -package com.TwentyCodes.android.location; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.location.Location; - -/** - * this abstract class will be used as a for classes wishing to be a receiver of location updates from the location services - * @author ricky barrette - */ -public abstract class LocationReceiver extends BroadcastReceiver { - - public static final String INTENT_EXTRA_ACTION_UPDATE = "TwentyCodes.intent.action.LocationUpdate"; - public static final String INTENT_EXTRA_LOCATION_PARCEL = "location_parcel"; - public Context mContext; - - /** - * (non-Javadoc) - * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) - * @param contextonBind - * @param intent - * @author ricky barrette - */ - @Override - public void onReceive(final Context context, final Intent intent) { - mContext = context; - if(intent.getParcelableExtra(INTENT_EXTRA_LOCATION_PARCEL) != null){ - Location location = intent.getParcelableExtra(INTENT_EXTRA_LOCATION_PARCEL); - onLocationUpdate(location); - } - } - - /** - * called when a location update is received - * @param parcelableExtra - * @author ricky barrette - */ - public abstract void onLocationUpdate(Location location); - -} \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/LocationService.java b/LocationLib/src/com/TwentyCodes/android/location/LocationService.java index 3ebb8a6..f903451 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/LocationService.java +++ b/LocationLib/src/com/TwentyCodes/android/location/LocationService.java @@ -14,6 +14,7 @@ import android.content.Context; import android.content.Intent; import android.location.Location; import android.location.LocationListener; +import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -48,8 +49,8 @@ public class LocationService extends Service implements LocationListener { public static final String INTENT_EXTRA_REQUIRED_ACCURACY = "required_accuracy"; /** - * Used to tell the service the update action to broadcast. If this is not supplied, {@link LocationReceiver.INTENT_EXTRA_ACTION_UPDATE } will be used. - * @see LocationReceiver.INTENT_EXTRA_ACTION_UPDATE + * Used to tell the service the update action to broadcast. If this is not supplied, {@link BaseLocationReceiver.INTENT_EXTRA_ACTION_UPDATE } will be used. + * @see BaseLocationReceiver.INTENT_EXTRA_ACTION_UPDATE */ public static final String INTENT_EXTRA_ACTION_UPDATE = "action_update"; @@ -95,8 +96,8 @@ public class LocationService extends Service implements LocationListener { if(mIntent.getAction() != null) locationUpdate.setAction(mIntent.getAction()); else - locationUpdate.setAction(LocationReceiver.INTENT_EXTRA_ACTION_UPDATE); - locationUpdate.putExtra(LocationReceiver.INTENT_EXTRA_LOCATION_PARCEL, mLocation); + locationUpdate.setAction(LocationLibraryConstants.INTENT_ACTION_UPDATE); + locationUpdate.putExtra(LocationManager.KEY_LOCATION_CHANGED, mLocation); sendBroadcast(locationUpdate); stopSelf(mStartId); } diff --git a/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java b/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java index 91311f7..8f5ff10 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java +++ b/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java @@ -22,13 +22,13 @@ public class PassiveLocationListener { /** * A convenience method for requesting passive location updates * @param context + * @param receiverIntent * @author ricky barrette */ - public static final void requestPassiveLocationUpdates(final Context context){ + public static final void requestPassiveLocationUpdates(final Context context, final Intent receiverIntent){ if (LocationLibraryConstants.SUPPORTS_FROYO) { final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); - final Intent passiveIntent = new Intent(context, PassiveLocationChangedReceiver.class); - final PendingIntent locationListenerPassivePendingIntent = PendingIntent.getBroadcast(context, 0, passiveIntent, PendingIntent.FLAG_UPDATE_CURRENT); + final PendingIntent locationListenerPassivePendingIntent = PendingIntent.getBroadcast(context, 0, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT); locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, locationListenerPassivePendingIntent); } }