/* * Zirco Browser for Android * * Copyright (C) 2010 J. Devauchelle and contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 3 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ package org.shadowsocks.zirco.model.items; /** * Store a suggestion item. */ public class UrlSuggestionItem { private static final float TITLE_COEFFICIENT = 2; private static final float URL_COEFFICIENT = 1; private static final float BOOKMARK_COEFFICIENT = 3; private static final float WEAVE_COEFFICIENT = 1; private static final float HISTORY_COEFFICIENT = 1; private String mPattern; private String mTitle; private String mUrl; private int mType; private float mNote; private boolean mNoteComputed = false; /** * Constructor. * * @param pattern * The parent pattern. * @param title * The item's title. * @param url * The item's url. * @param type * The item's type (1 -> history, 2 -> bookmark). */ public UrlSuggestionItem(String pattern, String title, String url, int type) { mPattern = pattern; mTitle = title; mUrl = url; mType = type; } /** * Compute the note of the current item. The principle is to count the * number of occurence of the pattern in the title and in the url, and to do * a weighted sum. A match in title weight more than a match in url, and a * match in bookmark weight more than a match in history. */ private void computeNote() { String pattern = mPattern.toLowerCase(); // Count the number of match in a string, did not find a cleaner way. int titleMatchCount; String title = mTitle.toLowerCase(); if (title.equals(pattern)) { titleMatchCount = 1; } else { titleMatchCount = title.split(pattern).length - 1; } String url = mUrl.toLowerCase(); int urlMatchCount = url.split("\\Q" + pattern + "\\E").length - 1; mNote = (titleMatchCount * TITLE_COEFFICIENT) + (urlMatchCount * URL_COEFFICIENT); switch (mType) { case 1: mNote = mNote * HISTORY_COEFFICIENT; break; case 2: mNote = mNote * BOOKMARK_COEFFICIENT; break; case 3: mNote = mNote * WEAVE_COEFFICIENT; break; default: break; } } /** * Get the note of this item. Compute it if not already done. * * @return The note. */ public float getNote() { if (!mNoteComputed) { computeNote(); mNoteComputed = true; } return mNote; } /** * Get the item's title. * * @return The title. */ public String getTitle() { return mTitle; } /** * Get the item's type. * * @return The type. */ public int getType() { return mType; } /** * Get the item's url. * * @return The url. */ public String getUrl() { return mUrl; } }