package mobi.urika.android.widget; import mobi.urika.android.content.LauncherIntent; import android.content.AsyncQueryHandler; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Handler; import android.view.View; import android.view.ViewGroup; /** * * @author Florian Sundermann * */ public class WidgetRemoteViewsListAdapter extends ScrollableBaseAdapter { private BoundRemoteViews mRemoteViews = null; private final Context mContext; private Intent mIntent; private final MyQueryHandler mAsyncQuery; ComponentName mAppWidgetProvider; /** * * @param context * remote context * @param c * cursor for reading data * @param intent * broadcast intent initiated the replacement, don't save it * @param appWidgetId * @param listViewId */ public WidgetRemoteViewsListAdapter(Context context, Intent intent, ComponentName provider, int appWidgetId, int listViewId) throws IllegalArgumentException { super(); mContext = context; mAppWidgetProvider = provider; mIntent = intent; mRemoteViews = (BoundRemoteViews)intent.getParcelableExtra(LauncherIntent.Extra.Scroll.EXTRA_ITEM_LAYOUT_REMOTEVIEWS); mAsyncQuery=new MyQueryHandler(mContext.getContentResolver()); mHandler.post(mQueryDataRunnable); } public void updateFromIntent(Intent intent) { if (intent.hasExtra(LauncherIntent.Extra.Scroll.EXTRA_ITEM_LAYOUT_REMOTEVIEWS)) { if (mRemoteViews != null) { mRemoteViews.dropCache(); } mIntent = intent; mRemoteViews = (BoundRemoteViews)intent.getParcelableExtra(LauncherIntent.Extra.Scroll.EXTRA_ITEM_LAYOUT_REMOTEVIEWS); mHandler.post(mQueryDataRunnable); } } final Handler mHandler = new Handler(); // Create runnable for posting final Runnable mQueryDataRunnable = new Runnable() { public void run() { android.util.Log.d("LAUNCHER","API v2 START QUERY"); mAsyncQuery.startQuery(1, "cookie", Uri.parse(mIntent.getStringExtra(LauncherIntent.Extra.Scroll.EXTRA_DATA_URI)) , mIntent.getStringArrayExtra(LauncherIntent.Extra.Scroll.EXTRA_PROJECTION), mIntent.getStringExtra(LauncherIntent.Extra.Scroll.EXTRA_SELECTION), mIntent.getStringArrayExtra(LauncherIntent.Extra.Scroll.EXTRA_SELECTION_ARGUMENTS), mIntent.getStringExtra(LauncherIntent.Extra.Scroll.EXTRA_SORT_ORDER)); } }; @Override public synchronized void notifyToRegenerate() { mHandler.post(mQueryDataRunnable); } @Override public int getCount() { return mRemoteViews.getCursorCacheSize(); } @Override public Object getItem(int position) { mRemoteViews.moveCursor(position); return mRemoteViews; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { mRemoteViews.moveCursor(position); if (convertView == null) convertView = mRemoteViews.apply(mContext, null); else mRemoteViews.reapplyBinding(convertView); return convertView; } @Override public void dropCache(Context context) { dropCache(); } public void dropCache() { mRemoteViews.dropCache(); } /** * AsyncQueryHandler helper class to do async queries * instead of blocking the UI thread * (yeah, don't know why but the runnable was not avoiding * the UI lock * @author adw * */ private class MyQueryHandler extends AsyncQueryHandler { public MyQueryHandler(ContentResolver cr) { super(cr); } @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { super.onQueryComplete(token, cookie, cursor); android.util.Log.d("LAUNCHER","API v2 QUERY COMPLETE"); mRemoteViews.setBindingCursor(cursor, mContext); cursor.close(); notifyDataSetInvalidated(); } } }