From 5d86688f5e0ba11d894dd26d1e8783e0f6964c9c Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Wed, 5 Feb 2014 16:58:55 +0000 Subject: [PATCH] Bug 968179 - Fix crasher when using grid views in dynamic panels (r=margaret) --- mobile/android/base/home/PanelGridView.java | 37 ++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/mobile/android/base/home/PanelGridView.java b/mobile/android/base/home/PanelGridView.java index f40b4d01051..7a430eb6ed7 100644 --- a/mobile/android/base/home/PanelGridView.java +++ b/mobile/android/base/home/PanelGridView.java @@ -6,8 +6,11 @@ package org.mozilla.gecko.home; import org.mozilla.gecko.R; +import org.mozilla.gecko.db.BrowserContract.HomeItems; import org.mozilla.gecko.home.HomeConfig.ViewConfig; +import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; import org.mozilla.gecko.home.PanelLayout.DatasetBacked; +import org.mozilla.gecko.home.PanelLayout.PanelView; import android.content.Context; import android.database.Cursor; @@ -15,18 +18,30 @@ import android.support.v4.widget.CursorAdapter; import android.util.Log; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.GridView; -public class PanelGridView extends GridView implements DatasetBacked { +import java.util.EnumSet; + +public class PanelGridView extends GridView + implements DatasetBacked, PanelView { private static final String LOGTAG = "GeckoPanelGridView"; private final PanelGridViewAdapter mAdapter; + protected OnUrlOpenListener mUrlOpenListener; public PanelGridView(Context context, ViewConfig viewConfig) { super(context, null, R.attr.panelGridViewStyle); mAdapter = new PanelGridViewAdapter(context); setAdapter(mAdapter); setNumColumns(AUTO_FIT); + setOnItemClickListener(new PanelGridItemClickListener()); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mUrlOpenListener = null; } @Override @@ -34,6 +49,11 @@ public class PanelGridView extends GridView implements DatasetBacked { mAdapter.swapCursor(cursor); } + @Override + public void setOnUrlOpenListener(OnUrlOpenListener listener) { + mUrlOpenListener = listener; + } + private class PanelGridViewAdapter extends CursorAdapter { public PanelGridViewAdapter(Context context) { @@ -51,4 +71,19 @@ public class PanelGridView extends GridView implements DatasetBacked { return new PanelGridItemView(context); } } + + private class PanelGridItemClickListener implements AdapterView.OnItemClickListener { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Cursor cursor = mAdapter.getCursor(); + if (cursor == null || !cursor.moveToPosition(position)) { + throw new IllegalStateException("Couldn't move cursor to position " + position); + } + + int urlIndex = cursor.getColumnIndexOrThrow(HomeItems.URL); + final String url = cursor.getString(urlIndex); + + mUrlOpenListener.onUrlOpen(url, EnumSet.of(OnUrlOpenListener.Flags.OPEN_WITH_INTENT)); + } + } }