Index: chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java |
index fd9b72793e92be73ada4abba1b5e312403f35658..04c717a3dabccea2e552339519830ea81fa48c85 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ItemChooserDialog.java |
@@ -4,6 +4,7 @@ |
package org.chromium.chrome.browser; |
+import android.app.Activity; |
import android.app.Dialog; |
import android.content.Context; |
import android.content.DialogInterface; |
@@ -11,14 +12,12 @@ import android.graphics.Color; |
import android.graphics.drawable.ColorDrawable; |
import android.text.SpannableString; |
import android.text.method.LinkMovementMethod; |
-import android.util.DisplayMetrics; |
import android.view.Gravity; |
import android.view.LayoutInflater; |
import android.view.View; |
import android.view.ViewGroup; |
import android.view.ViewGroup.LayoutParams; |
import android.view.Window; |
-import android.view.WindowManager; |
import android.widget.AdapterView; |
import android.widget.ArrayAdapter; |
import android.widget.Button; |
@@ -30,6 +29,7 @@ import android.widget.TextView; |
import org.chromium.base.ApiCompatibilityUtils; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.chrome.R; |
+import org.chromium.chrome.browser.util.MathUtils; |
import org.chromium.ui.base.DeviceFormFactor; |
import org.chromium.ui.widget.TextViewWithClickableSpans; |
@@ -231,7 +231,7 @@ public class ItemChooserDialog { |
} |
} |
- private Context mContext; |
+ private Activity mActivity; |
// The dialog this class encapsulates. |
private Dialog mDialog; |
@@ -254,27 +254,29 @@ public class ItemChooserDialog { |
private ItemAdapter mItemAdapter; |
// How much of the height of the screen should be taken up by the listview. |
- private static final double LISTVIEW_HEIGHT_PERCENT = 0.30; |
+ private static final float LISTVIEW_HEIGHT_PERCENT = 0.30f; |
+ // The height of a row of the listview in dp. |
+ private static final int LIST_ROW_HEIGHT_DP = 48; |
// The minimum height of the listview in the dialog (in dp). |
- private static final int MIN_HEIGHT_DP = 56; |
+ private static final int MIN_HEIGHT_DP = (int) (LIST_ROW_HEIGHT_DP * 1.5); |
// The maximum height of the listview in the dialog (in dp). |
- private static final int MAX_HEIGHT_DP = 400; |
+ private static final int MAX_HEIGHT_DP = (int) (LIST_ROW_HEIGHT_DP * 8.5); |
/** |
* Creates the ItemChooserPopup and displays it (and starts waiting for data). |
* |
- * @param context Context which is used for launching a dialog. |
+ * @param activity Activity which is used for launching a dialog. |
* @param callback The callback used to communicate back what was selected. |
* @param labels The labels to show in the dialog. |
*/ |
public ItemChooserDialog( |
- Context context, ItemSelectedCallback callback, ItemChooserLabels labels) { |
- mContext = context; |
+ Activity activity, ItemSelectedCallback callback, ItemChooserLabels labels) { |
+ mActivity = activity; |
mItemSelectedCallback = callback; |
mLabels = labels; |
- LinearLayout dialogContainer = (LinearLayout) LayoutInflater.from( |
- mContext).inflate(R.layout.item_chooser_dialog, null); |
+ LinearLayout dialogContainer = (LinearLayout) LayoutInflater.from(mActivity).inflate( |
+ R.layout.item_chooser_dialog, null); |
mListView = (ListView) dialogContainer.findViewById(R.id.items); |
mProgressBar = (ProgressBar) dialogContainer.findViewById(R.id.progress); |
@@ -302,7 +304,7 @@ public class ItemChooserDialog { |
} |
}); |
- mItemAdapter = new ItemAdapter(mContext, R.layout.item_chooser_dialog_row); |
+ mItemAdapter = new ItemAdapter(mActivity, R.layout.item_chooser_dialog_row); |
mListView.setAdapter(mItemAdapter); |
mListView.setEmptyView(mEmptyMessage); |
mListView.setOnItemClickListener(mItemAdapter); |
@@ -310,26 +312,29 @@ public class ItemChooserDialog { |
setState(State.STARTING); |
// The list is the main element in the dialog and it should grow and |
- // shrink according to the size of the screen available (clamped to a |
- // min and a max). |
+ // shrink according to the size of the screen available. |
View listViewContainer = dialogContainer.findViewById(R.id.container); |
- DisplayMetrics metrics = new DisplayMetrics(); |
- WindowManager manager = (WindowManager) mContext.getSystemService( |
- Context.WINDOW_SERVICE); |
- manager.getDefaultDisplay().getMetrics(metrics); |
- |
- float density = context.getResources().getDisplayMetrics().density; |
- int height = (int) (metrics.heightPixels * LISTVIEW_HEIGHT_PERCENT); |
- height = Math.min(height, Math.round(MAX_HEIGHT_DP * density)); |
- height = Math.max(height, Math.round(MIN_HEIGHT_DP * density)); |
- listViewContainer.setLayoutParams( |
- new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, height)); |
+ listViewContainer.setLayoutParams(new LinearLayout.LayoutParams( |
+ LayoutParams.MATCH_PARENT, |
+ getListHeight(mActivity.getWindow().getDecorView().getHeight(), |
+ mActivity.getResources().getDisplayMetrics().density))); |
showDialogForView(dialogContainer); |
} |
+ // Computes the height of the device list, bound to half-multiples of the |
+ // row height so that it's obvious if there are more elements to scroll to. |
+ @VisibleForTesting |
+ static int getListHeight(int decorHeight, float density) { |
+ float heightDp = decorHeight / density * LISTVIEW_HEIGHT_PERCENT; |
+ // Round to (an integer + 0.5) times LIST_ROW_HEIGHT. |
+ heightDp = (Math.round(heightDp / LIST_ROW_HEIGHT_DP - 0.5f) + 0.5f) * LIST_ROW_HEIGHT_DP; |
+ heightDp = MathUtils.clamp(heightDp, MIN_HEIGHT_DP, MAX_HEIGHT_DP); |
+ return (int) Math.round(heightDp * density); |
+ } |
+ |
private void showDialogForView(View view) { |
- mDialog = new Dialog(mContext); |
+ mDialog = new Dialog(mActivity); |
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); |
mDialog.addContentView(view, |
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, |
@@ -342,7 +347,7 @@ public class ItemChooserDialog { |
}); |
Window window = mDialog.getWindow(); |
- if (!DeviceFormFactor.isTablet(mContext)) { |
+ if (!DeviceFormFactor.isTablet(mActivity)) { |
// On smaller screens, make the dialog fill the width of the screen, |
// and appear at the top. |
window.setBackgroundDrawable(new ColorDrawable(Color.WHITE)); |