Closed GoogleCodeExporter closed 9 years ago
Original comment by eligeler...@gmail.com
on 1 Jun 2010 at 6:25
Should be displayed on the Settings Activity that will be forthcoming. If you
implement this on the main activity until the Settings Activity is done, that's
fine.
Original comment by case.and...@gmail.com
on 8 Jun 2010 at 11:03
I want to do this by disabling the BCReciever. However, since the Reciever is
created throught the Manifest file I believe it can't be disabled. Can I change
how it is created (not in the Manifest file, but upon startup).
Original comment by eligeler...@gmail.com
on 18 Jun 2010 at 9:18
That would be fine if you want to enable/disable BCReceiver dynamically. Just
make sure funcations properly on boot. Alternatively you could still have
BCReceiver running, but have a condition statement in the onReceive() function
that checks the SharedPreferences and exits if Omnidroid is disabled.
Original comment by case.and...@gmail.com
on 19 Jun 2010 at 12:11
I also think it is plausible since the Context API provided us with
registerReceiver() and unregisterReceiver(), and the existing Starter class
already has a start a service on boot functionality. I just also want to let
you know about an issue I am working on - Issue 84, where it looks like Starter
does not always receive android.intent.action.BOOT_COMPLETED, I am still not
sure if this is also true on the actual device, but it happens quite often on
my emulator (or does it has something to do with my ancient laptop?)
Original comment by renc...@gmail.com
on 19 Jun 2010 at 4:19
By the way, you also mentioned in the class about saving batteries, so I think
stopping the EventMonitoringService is also a good idea, especially since it is
listening for the system TIME_TICK event, which will arrive every minute.
Original comment by renc...@gmail.com
on 19 Jun 2010 at 4:21
Original comment by case.and...@gmail.com
on 22 Jun 2010 at 8:37
I just submitted a code review for Issue #19, and then I'd like to take a look
at Issue #73 which happens to be blocked by this issue. What's the status of
this issue? Thanks!
Original comment by case.and...@gmail.com
on 28 Jun 2010 at 4:42
Having trouble starting the BCreceiver locally. I have this code
BCReceiver localReceiver = new BCReceiver();
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
context.registerReceiver(localReceiver, filter);
and it is not working.
Also I need to add multiple intent filters. Do I need to register each one
separately?
Original comment by eligeler...@gmail.com
on 29 Jun 2010 at 11:54
Before the major code overhaul (see r340 for where I grabbed this code) we had
this working. This will need to be re-written a little with better
documentation, but in the AndroidManifest.xml we had these entries:
<!-- Service/receiver that runs to catch events -->
<service android:name=".bkgservice.BRService" />
<receiver android:name=".bkgservice.BCReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<!-- Service/receiver that runs to catch events -->
<service android:name=".bkgservice.BRService" />
<receiver android:name=".bkgservice.BCReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<!-- We need to start our service on bootup -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".bkgservice.Starter">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
<intent-filter>
<action android:name="OmniRestart"/>
</intent-filter>
</receiver>
The corresponding classes were:
/*Broadcast Receiver to detect system bootup*/
public class Starter extends BroadcastReceiver {
private ComponentName comp = null;
private ComponentName service = null;
public void onReceive(Context context, Intent intent) {
// If we're booting up, start our service
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction()) ||
"OmniStart".equals(intent.getAction())) {
comp = new ComponentName(context.getPackageName(), BRService.class
.getName());
service = context.startService(new Intent().setComponent(comp));
if (null == service) {
Toast.makeText(context, "Failed to start OmniDroid Service", 5)
.show();
Log.i("Starter", "Could not start service " + comp.toString());
OmLogger.write(context, "Starter could not start Service");
}
} else if ("OmniRestart".equals(intent.getAction())) {
comp = new ComponentName(context.getPackageName(), BRService.class
.getName());
context.stopService(new Intent().setComponent(comp));
service = context.startService(new Intent().setComponent(comp));
if (null == service) {
Toast.makeText(context, "Failed to start OmniDroid Service", 5)
.show();
Log.i("Starter", "Could not start service " + comp.toString());
OmLogger.write(context, "Starter could not start Service");
}
}
}
}
// TODO (pradeep): Document this class
public class BRService extends Service {
/*
* (non-Javadoc)
*
* @see android.app.Service#onBind(android.content.Intent)
*/
IntentFilter Ifilter = new IntentFilter();
BroadcastReceiver BR = new BCReceiver();
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
/** Called when the activity is first created. */
@Override
public void onCreate() {
try {
// Initializing the UGParser. To be deleted from this Code after Andrews Module
UGParser ug = new UGParser(getApplicationContext());
/* Check the User Config to start OmniDroid */
//String Enabled = ug.readLine("Enabled");
//if (Enabled.equalsIgnoreCase("True")) {
Toast.makeText(getBaseContext(), "Starting OmniDroid", 5).show();
// Get the User Instances in an Arraylist from the User Config
ArrayList<HashMap<String, String>> UCRecords = ug.readRecords();
Iterator<HashMap<String, String>> i = UCRecords.iterator();
while (i.hasNext()) {
HashMap<String, String> HM1 = i.next();
// Configure the Intent Filter with the Events if Instance in enabled
if (HM1.get("EnableInstance").equalsIgnoreCase("True"))
{
Ifilter.addAction(HM1.get("EventName"));
Toast.makeText(getBaseContext(), "REGISTERING: "+HM1.get("EventName"), 5).show();
}
}
registerReceiver(BR, Ifilter);
//} else {
//Toast.makeText(getBaseContext(), "Stopping OmniDroid", 5).show();
//unregisterReceiver(BR);
//}
} catch (Exception e) {
Log.i("BRService", e.getLocalizedMessage());
Log.i("BRService", e.toString());
OmLogger.write(getApplicationContext(), "Not able to Enable/Diable Omnidroid");
// Logger.write("Unable to start BroadcastReceiver");
}
}
@Override
public boolean stopService(Intent name) {
Toast.makeText(getBaseContext(), "Stopping OmniDroid", 5).show();
return super.stopService(name);
}
/*
* (non-Javadoc)
*
* @see android.app.Service#onDestroy()
*/
@Override
public void onDestroy() {
Toast.makeText(getBaseContext(), "Stopping OmniDroid", 5).show();
super.onDestroy();
}
}
public class BCReceiver extends BroadcastReceiver {
//Context context;
@Override
public void onReceive(Context context, Intent intent)
{
//this.context = context;
//Toast.makeText(context,"Caught by Broadcast Receiver",Toast.LENGTH_LONG).show();
try
{
intent.setClass(context, edu.nyu.cs.omnidroid.core.DummyActivity.class);
intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
String intentaction = intent.getAction();
//Toast.makeText(context,getLastCallLogEntry(context),Toast.LENGTH_LONG).show();
context.startActivity(intent);
Log.i("Received Intent", intent.getAction());
}catch(Exception e)
{
Log.i("Exception in Intent",e.getLocalizedMessage());
OmLogger.write(context,"Unable to execute required action");
}
}
public void readSMS(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
Toast.makeText(context, intent.getAction() , Toast.LENGTH_SHORT).show();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null) {
Object[] pdus = (Object[])bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
}
private String getLastCallLogEntry( Context context ) {
String[] projection = new String[] {
BaseColumns._ID,
CallLog.Calls.NUMBER,
CallLog.Calls.TYPE
};
ContentResolver resolver = context.getContentResolver();
Cursor cur = resolver.query(
CallLog.Calls.CONTENT_URI,
projection,
null,
null,
CallLog.Calls.DEFAULT_SORT_ORDER );
int numberColumn = cur.getColumnIndex( CallLog.Calls.NUMBER );
int typeColumn = cur.getColumnIndex( CallLog.Calls.TYPE );
if( !cur.moveToNext()) {
cur.close();
return "";
}
String number = cur.getString( numberColumn );
String type = cur.getString( typeColumn );
String dir = null;
try {
int dircode = Integer.parseInt( type );
switch( dircode ) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
}
} catch( NumberFormatException ex ) {}
if( dir == null )
dir = "Unknown, code: "+type;
cur.close();
return dir+","+number;
}
}
As for your question about filters, I believe the answer is yes, did you look
at the AndroidManifest.xml to see how we're doing it now? BCReceiver already
has a bunch of filters registered to it.
Original comment by case.and...@gmail.com
on 30 Jun 2010 at 5:04
Link for browsing the old revision I mentioned:
http://code.google.com/p/omnidroid/source/browse/?r=340#svn/trunk/src
Original comment by case.and...@gmail.com
on 30 Jun 2010 at 5:07
Original comment by case.and...@gmail.com
on 1 Jul 2010 at 11:15
I am still having trouble understanding what this old code helps me for this
issue. How will this help me turn off the BCReceiver?
Original comment by eligeler...@gmail.com
on 5 Jul 2010 at 10:18
Looks to me like these two lines do it (yes/no?):
comp = new ComponentName(context.getPackageName(), BRService.class.getName())
context.stopService(new Intent().setComponent(comp));
Original comment by case.and...@gmail.com
on 6 Jul 2010 at 1:32
eli,
are you still working on it? if not do you mind if I take over? this seems to
be blocking i73.
Original comment by sv767%ny...@gtempaccount.com
on 12 Jul 2010 at 5:12
You can take over.
Original comment by eligeler...@gmail.com
on 12 Jul 2010 at 8:18
Please review this at http://codereview.appspot.com/1775044/show
Original comment by sv767%ny...@gtempaccount.com
on 12 Jul 2010 at 9:01
committed r805
Original comment by sv767%ny...@gtempaccount.com
on 13 Jul 2010 at 3:14
Original issue reported on code.google.com by
case.and...@gmail.com
on 20 May 2010 at 5:09