Please, I'm a bit stuck here. I'm updating my Widgets with a background service( as opposed to using "onUpdate" method) using an AlarmManager for interval repeat . Everything seems to works fine, the ListView populates data, but for some reason items on the ListView aren't starting the Activity set on the PendingIntent when clicked.
UPDATE:
Think the code works fine. Tested it in other devices and it works fine(A Motorola and HTC). But for some reason, it doesn't work on my Samsung Galaxy S5
Here is the code below
WidgetService.java
public class WidgetService extends Service implements LocationListener, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks {
private LocationManager locationManager;
private LocationRequest locationRequest;
private GoogleApiClient googleApiClient;
@Override
public void onCreate() {
super.onCreate();
//Initialize Google API client build and connect
buildGoogleApiClient();
//Initialize Android Location Service
locationManager = (LocationManager) this.getSystemService(this.LOCATION_SERVICE);
//Check if Location is Enabled
if (LocationHelper.checkLocationEnabled(null, locationManager)) {
//TODO: Check Google Play Services Availability
googleApiClient.connect();
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int[] widget_ids = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
if (widget_ids != null) {
buildUpdate(widget_ids);
}
return super.onStartCommand(intent, flags, startId);
}
private void buildUpdate(int... appwidget_ids) {
for (int appwidget_id : appwidget_ids) {
RemoteViews views = new RemoteViews(getPackageName(), R.layout.closest_banks_appwidget);
if (ClosestBanksWidget.LAST_LOCATION != null) {
Intent intent = new Intent(this, WidgetRemoteViewsService.class);
// Add the app widget ID to the intent extras.
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appwidget_id);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
/*
Intent start_activity_intent = new Intent(this, BankFinderBroadcastReceiver.class);
intent.setAction(ClosestBanksWidget.WIDGET_CLICK_INTENT_ACTION);
PendingIntent start_activity_PI = PendingIntent.getBroadcast(this, 0,
start_activity_intent, 0);
*/
Intent start_activity_intent = new Intent(this, LocationDetailActivity.class);
PendingIntent start_activity_PI = PendingIntent.getActivity(this, 0,
start_activity_intent, PendingIntent.FLAG_UPDATE_CURRENT);
String[] params = {"search", String.valueOf(ClosestBanksWidget.LAST_LOCATION.getLatitude()), String.valueOf(ClosestBanksWidget.LAST_LOCATION.getLongitude()), "", ""};
intent.putExtra("query_params", params);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
views.setRemoteAdapter(R.id.widget_location_list_view, intent);
else
views.setRemoteAdapter(appwidget_id, R.id.widget_location_list_view, intent);
views.setPendingIntentTemplate(R.id.widget_location_list_view, start_activity_PI);
}
// Push update for this widget to the home screen
//ComponentName thisWidget = new ComponentName(this, ClosestBanksWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.notifyAppWidgetViewDataChanged(appwidget_id, R.id.widget_location_list_view);
manager.updateAppWidget(appwidget_id, views);
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
protected synchronized void buildGoogleApiClient() {
googleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
protected void startLocationUpdates() {
createLocationRequest();
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this);
}
protected void createLocationRequest() {
locationRequest = new LocationRequest();
locationRequest.setInterval(victorikoro.com.bankfinder.objects.Constants.LOCATION_UPDATE_FAST_INTERVAL * 2);
locationRequest.setFastestInterval(victorikoro.com.bankfinder.objects.Constants.LOCATION_UPDATE_FAST_INTERVAL);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
//locationRequest.setSmallestDisplacement(Constants.MINIMUM_LOCATION_DISPLACEMENT);
}
@Override
public void onConnected(Bundle bundle) {
//Get Last Location
ClosestBanksWidget.LAST_LOCATION = LocationServices.FusedLocationApi.getLastLocation(
googleApiClient);
//Start getting periodic location updates
startLocationUpdates();
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onLocationChanged(Location location) {
ClosestBanksWidget.LAST_LOCATION = location;
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
}
ClosestBankWidget.java
public class ClosestBanksWidget extends AppWidgetProvider {
protected Context mContext;
public static Location LAST_LOCATION;
public static String WIDGET_CLICK_INTENT_ACTION = "victorikoro.com.bankfinder.WIDGET_START_ACTIVITY";
private PendingIntent service;
public ClosestBanksWidget() {
super();
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
mContext = context;
Intent intent = new Intent(context, WidgetService.class);
context.startService(intent);
}
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
int N = appWidgetIds.length;
int[] widget_ids = new int[N];
int[] widget_ids_clone = new int[N];
final AlarmManager m = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
for (int i = 0; i < appWidgetIds.length; i++) {
widget_ids[i] = appWidgetIds[i];
}
final Calendar TIME = Calendar.getInstance();
TIME.set(Calendar.MINUTE, 0);
TIME.set(Calendar.SECOND, 0);
TIME.set(Calendar.MILLISECOND, 0);
final Intent i = new Intent(context, WidgetService.class);
i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widget_ids);
if (service == null) {
service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
}
m.setRepeating(AlarmManager.RTC, TIME.getTime().getTime(), Constants.WIDGET_UPDATE_INTERVAL, service);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
}
WidgetRemoteViewService.java
public class WidgetRemoteViewsService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new WidgetRemoteViewsFactory(this.getApplicationContext(), intent);
}
class WidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private static final int mCount = 10;
protected List<ATMLocation> locations = new ArrayList<ATMLocation>();
private Context mContext;
private int mAppWidgetId;
private Intent intent;
protected jsqlite.Database db;
public WidgetRemoteViewsFactory(Context applicationContext, Intent intent) {
this.mContext = applicationContext;
this.intent = intent;
//Initialize DB
db = DBHelper.getDBInstance(mContext);
if (db != null) {
String[] params = intent.getStringArrayExtra("query_params");
this.locations = LocationHelper.getATMLocations(db, params).subList(0, mCount);
}
}
@Override
public void onCreate() {
}
public void onDestroy() {
if (db != null) {
try {
db.close();
} catch (jsqlite.Exception e) {
e.printStackTrace();
}
}
}
@Override
public int getCount() {
return locations.size();
}
public RemoteViews getViewAt(int position) {
ATMLocation location = locations.get(position);
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.list_item_widget);
String bank_name = LocationHelper.getFormattedBankName(location.bank, mContext);
if (location.branch.equalsIgnoreCase("true")) {
bank_name += ("(Branch)");
}
rv.setTextViewText(R.id.widget_bank_name, bank_name);
rv.setTextViewText(R.id.widget_bank_address, location.address);
rv.setTextViewText(R.id.widget_distance, LocationHelper.getFormattedDistance(location.distance));
rv.setImageViewResource(R.id.widget_bank_logo_small, LocationHelper.getBankLogoResourceID(location.bank, mContext));
// Return the remote views object.
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("latitude", location.latitude);
bundle.putString("longitude", location.longitude);
bundle.putString("id", location.id);
bundle.putString("given_id", location.given_id);
bundle.putString("bank", location.bank);
bundle.putString("email", location.email);
bundle.putString("address", location.address);
bundle.putString("tel", location.tel);
bundle.putString("tel2", location.tel2);
bundle.putString("branch", location.branch);
bundle.putString("distance", location.distance);
bundle.putString("other", location.other);
bundle.putString("machines", location.machines);
intent.putExtras(bundle);
rv.setOnClickFillInIntent(R.id.widget_list_item, intent);
return rv;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
public long getItemId(int position) {
return position;
}
public boolean hasStableIds() {
return true;
}
public void onDataSetChanged() {
if (db != null) {
locations = LocationHelper.getATMLocations(db, intent.getStringArrayExtra("query_params"));
}
}
}
}
closest_bank_appwidget.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cardview_light_background">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:backgroundTint="@color/colorPrimaryDark"
android:backgroundTintMode="screen">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_margin="10dp"
android:textSize="18sp"
android:text="@string/widget_title"
android:textColor="@android:color/white"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:textSize="15sp"
android:text="--"
android:textStyle="italic"
android:textColor="@android:color/white"
android:layout_centerInParent="true"
android:layout_marginRight="5dp" />
</RelativeLayout>
<ListView
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:id="@+id/widget_location_list_view"
android:divider="@android:drawable/divider_horizontal_textfield"
android:dividerHeight="1dp"
android:layout_margin="10dp"
android:drawSelectorOnTop="true">
</ListView>
</LinearLayout>
list_item_widget.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:elevation="2dp"
android:orientation="vertical"
android:padding="10dp">
<ImageView
android:id="@+id/widget_bank_logo_small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginRight="12dp"
android:focusable="false"
android:src="@drawable/wema_logo" />
<TextView
android:id="@+id/widget_bank_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/widget_bank_logo_small"
android:focusable="false"
android:text="@string/wema"
android:textColor="@color/colorPrimary"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/widget_bank_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/widget_bank_name"
android:layout_marginBottom="4dp"
android:layout_marginTop="4dp"
android:layout_toEndOf="@+id/widget_bank_logo_small"
android:layout_toRightOf="@+id/widget_bank_logo_small"
android:focusable="false"
android:text="@string/wema_loc"
android:textColor="#565656"
android:textSize="14sp" />
<TextView
android:id="@+id/widget_distance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_below="@+id/widget_bank_logo_small"
android:layout_marginTop="10dp"
android:focusable="false"
android:text="--"
android:textColor="@color/colorPrimary"
android:textSize="13sp"
android:textStyle="bold" />
</RelativeLayout>