package com.hiddenservices.onionservices.dataManager; import android.content.Context; import android.view.textservice.SentenceSuggestionsInfo; import android.view.textservice.SpellCheckerSession; import android.view.textservice.SuggestionsInfo; import com.hiddenservices.onionservices.dataManager.models.bookmarkRowModel; import com.hiddenservices.onionservices.dataManager.models.historyRowModel; import com.hiddenservices.onionservices.constants.status; import com.hiddenservices.onionservices.constants.strings; import com.hiddenservices.onionservices.helperManager.helperMethod; import java.util.ArrayList; import java.util.List; public class suggestionDataModel implements SpellCheckerSession.SpellCheckerSessionListener { /*Private Variables*/ private ArrayList mHintListLocalCache; private ArrayList mCurrentList = new ArrayList<>(); /*Initializations*/ public suggestionDataModel(Context mContext) { mHintListLocalCache = initSuggestions(); } /*Helper Methods*/ private ArrayList getDefaultSuggestionsOnStart(String pQuery) { if (pQuery.equals(strings.GENERIC_EMPTY_STR) || pQuery.trim().isEmpty()) { pQuery = "hidden web"; } mCurrentList.clear(); if (!pQuery.equals(strings.GENERIC_EMPTY_STR) && !pQuery.equals("about:blank") && !pQuery.contains("?") && !pQuery.contains("/") && !pQuery.contains(" ") && !pQuery.contains(" ") && !pQuery.contains("\n")) { mCurrentList.size(); int sepPos = pQuery.indexOf("."); if (sepPos == -1) { mCurrentList.add(0, new historyRowModel(pQuery + ".com", strings.GENERIC_EMPTY_STR, -1)); if (status.sTorBrowsing) { mCurrentList.add(0, new historyRowModel(pQuery + ".onion", strings.GENERIC_EMPTY_STR, -1)); } } else { if (!pQuery.equals(pQuery.substring(0, sepPos) + ".com")) { mCurrentList.add(0, new historyRowModel(pQuery.substring(0, sepPos) + ".com", strings.GENERIC_EMPTY_STR, -1)); } if (!pQuery.equals(pQuery.substring(0, sepPos) + ".onion")) { if (status.sTorBrowsing) { mCurrentList.add(0, new historyRowModel(pQuery.substring(0, sepPos) + ".onion", strings.GENERIC_EMPTY_STR, -1)); } } } } mCurrentList.add(0, new historyRowModel(pQuery, strings.GENERIC_EMPTY_STR, -1)); return mCurrentList; } private ArrayList getDefaultSuggestions(String pQuery, int mSize, ArrayList mDuplicationHandler, boolean pDefaultHostChaned) { if (pQuery.trim().isEmpty()) { pQuery = ""; } for (int count = 0; count <= mHintListLocalCache.size() - 1 && mHintListLocalCache.size() < 500; count++) { if (mHintListLocalCache.get(count).getHeader().toLowerCase().contains(pQuery)) { if (mHintListLocalCache.get(count).getHeader().toLowerCase().startsWith(pQuery)) { if (mDuplicationHandler != null && !mDuplicationHandler.contains(mHintListLocalCache.get(count).getDescriptionParsed())) { if (pDefaultHostChaned) { mCurrentList.add(1, new historyRowModel(mHintListLocalCache.get(count).getHeader(), mHintListLocalCache.get(count).getDescriptionParsed(), -1)); } else { mCurrentList.add(0, new historyRowModel(mHintListLocalCache.get(count).getHeader(), mHintListLocalCache.get(count).getDescriptionParsed(), -1)); } } if (mCurrentList.size() + mSize > 6) { break; } } else { if (mCurrentList.size() + mSize <= 6) { mCurrentList.add(new historyRowModel(mHintListLocalCache.get(count).getHeader(), mHintListLocalCache.get(count).getDescriptionParsed(), -1)); } } } else if (mHintListLocalCache.get(count).getDescriptionParsed().toLowerCase().contains(pQuery)) { if (mHintListLocalCache.get(count).getHeader().toLowerCase().startsWith(pQuery)) { if (mDuplicationHandler != null && !mDuplicationHandler.contains(mHintListLocalCache.get(count).getDescriptionParsed())) { if (pDefaultHostChaned) { mCurrentList.add(1, new historyRowModel(mHintListLocalCache.get(count).getHeader(), mHintListLocalCache.get(count).getDescriptionParsed(), -1)); } else { mCurrentList.add(0, new historyRowModel(mHintListLocalCache.get(count).getHeader(), mHintListLocalCache.get(count).getDescriptionParsed(), -1)); } } if (mCurrentList.size() + mSize > 6) { break; } } else { if (mCurrentList.size() + mSize <= 6) { mCurrentList.add(new historyRowModel(mHintListLocalCache.get(count).getHeader(), mHintListLocalCache.get(count).getDescriptionParsed(), -1)); } } } } if (mCurrentList.size() <= 0) { if (status.sTorBrowsing) { mCurrentList.add(mSize, new historyRowModel("Orion Search", "orion.onion", -1)); } } return mCurrentList; } private ArrayList getSuggestions(String pQuery, ArrayList pHistory, ArrayList pBookmarks) { if (pQuery.trim().isEmpty()) { pQuery = ""; } mCurrentList = new ArrayList<>(); String mQueryOriginal = pQuery; pQuery = pQuery.replace("+", "%").replace(" ", "+"); ArrayList mHistory = pHistory; ArrayList mBookmarks = pBookmarks; pQuery = pQuery.toLowerCase(); ArrayList mDuplicationHandler = new ArrayList<>(); if (status.sSettingSearchHistory) { pQuery = pQuery.toLowerCase(); for (int count = 0; count <= mHistory.size() - 1 && mHistory.size() < 500; count++) { historyRowModel mTempModel; if (!mDuplicationHandler.contains(mHistory.get(count).getDescription())) { if (mHistory.get(count).getHeader().toLowerCase().contains(pQuery)) { mTempModel = new historyRowModel(mHistory.get(count).getHeader(), mHistory.get(count).getDescription(), -1); if (!mCurrentList.contains(mTempModel)) { mDuplicationHandler.add(mTempModel.getDescription()); mCurrentList.add(mTempModel); } } else if (mHistory.get(count).getDescription().toLowerCase().contains(pQuery)) { mTempModel = new historyRowModel(mHistory.get(count).getHeader(), mHistory.get(count).getDescription(), -1); if (!mCurrentList.contains(mTempModel)) { mDuplicationHandler.add(mTempModel.getDescription()); mCurrentList.add(mTempModel); } } if (mCurrentList.size() > 6) { break; } } } } if (status.sSettingSearchHistory && mCurrentList.size() > 4) { for (int count = 0; count <= mBookmarks.size() - 1 && mBookmarks.size() < 500; count++) { if (!mDuplicationHandler.contains(mBookmarks.get(count).getDescription())) { if (mBookmarks.get(count).getHeader().toLowerCase().contains(pQuery)) { mDuplicationHandler.add(mBookmarks.get(count).getDescription()); mCurrentList.add(mCurrentList.size() - 1, new historyRowModel(mBookmarks.get(count).getHeader(), mBookmarks.get(count).getDescription(), -1)); } else if (mCurrentList.size() > 0 && mBookmarks.get(count).getDescription().toLowerCase().contains(pQuery)) { mDuplicationHandler.add(mBookmarks.get(count).getDescription()); mCurrentList.add(mCurrentList.size() - 1, new historyRowModel(mBookmarks.get(count).getHeader(), mBookmarks.get(count).getDescription(), -1)); } if (mCurrentList.size() > 6) { break; } } } } boolean mDefaultHostChaned = false; if (mCurrentList.size() > 3) { String mHost1 = helperMethod.getHost(helperMethod.completeURL(mCurrentList.get(0).getDescription())); String mHost2 = helperMethod.getHost(helperMethod.completeURL(mCurrentList.get(1).getDescription())); String mHost3 = helperMethod.getHost(helperMethod.completeURL(mCurrentList.get(2).getDescription())); String mHostReal = mHost1.replace("www.", ""); if (mHost1.equals(mHost2) && mHost1.equals(mHost3) && !mDuplicationHandler.contains(mHostReal)) { mCurrentList.add(0, new historyRowModel(mHostReal, strings.GENERIC_EMPTY_STR, -1)); mDuplicationHandler.add(mHostReal); } mDefaultHostChaned = true; } getDefaultSuggestions(pQuery, mCurrentList.size(), mDuplicationHandler, mDefaultHostChaned); boolean mHostAppend = false; if (mCurrentList.size() > 1 && helperMethod.getHost(helperMethod.completeURL(mCurrentList.get(0).getDescription())).equals(helperMethod.completeURL(mCurrentList.get(1).getDescription()))) { mHostAppend = true; } int mSize = mCurrentList.size(); if (mCurrentList.size() < 3) { if (!mQueryOriginal.equals(strings.GENERIC_EMPTY_STR) && !mQueryOriginal.equals("about:blank") && !mQueryOriginal.contains("?") && !mQueryOriginal.contains("/") && !mQueryOriginal.contains(" ") && !mQueryOriginal.contains(" ") && !mQueryOriginal.contains("\n")) { mCurrentList.size(); int sepPos = pQuery.indexOf("."); if (sepPos == -1) { mCurrentList.add(mSize, new historyRowModel(mQueryOriginal + ".com", strings.GENERIC_EMPTY_STR, -1)); if (status.sTorBrowsing) { mCurrentList.add(mSize, new historyRowModel(mQueryOriginal + ".onion", strings.GENERIC_EMPTY_STR, -1)); } } else { if (!pQuery.equals(pQuery.substring(0, sepPos) + ".com")) { mCurrentList.add(mSize, new historyRowModel(pQuery.substring(0, sepPos) + ".com", strings.GENERIC_EMPTY_STR, -1)); } if (!pQuery.equals(pQuery.substring(0, sepPos) + ".onion")) { if (status.sTorBrowsing) { mCurrentList.add(mSize, new historyRowModel(pQuery.substring(0, sepPos) + ".onion", strings.GENERIC_EMPTY_STR, -1)); } } } } } if (mHostAppend) { if (mCurrentList.get(0).getDescription().startsWith(pQuery)) { mCurrentList.add(mSize, new historyRowModel(mCurrentList.get(0).getHeader(), mCurrentList.get(0).getDescription(), -1)); } } if (pQuery.length() > 0) { if (!pQuery.equals("about:blank")) { mCurrentList.add(0, new historyRowModel(pQuery, strings.GENERIC_EMPTY_STR, -1)); } } if (mCurrentList.size() <= 0) { if (status.sTorBrowsing) { mCurrentList.add(mSize, new historyRowModel("Orion Search", "orion.onion", -1)); } } return mCurrentList; } private ArrayList initSuggestions() { mHintListLocalCache = new ArrayList<>(); mHintListLocalCache.add(new historyRowModel("Duckduckgo", "https://duckduckgo.com", -1)); mHintListLocalCache.add(new historyRowModel("BBC", "https://bbc.com", -1)); mHintListLocalCache.add(new historyRowModel("Youtube", "https://youtube.com", -1)); mHintListLocalCache.add(new historyRowModel("Facebook", "https://facebook.com", -1)); mHintListLocalCache.add(new historyRowModel("Twitter", "https://twitter.com", -1)); mHintListLocalCache.add(new historyRowModel("Amazon", "https://amazon.com", -1)); mHintListLocalCache.add(new historyRowModel("IMDB", "https://imdb.com", -1)); mHintListLocalCache.add(new historyRowModel("Reddit", "https://reddit.com", -1)); mHintListLocalCache.add(new historyRowModel("Pinterest", "https://pinterest.com", -1)); mHintListLocalCache.add(new historyRowModel("EBay", "https://ebay.com", -1)); mHintListLocalCache.add(new historyRowModel("Trip Advisor", "https://tripadvisor.com", -1)); mHintListLocalCache.add(new historyRowModel("Craigslist", "https://craigslist.com", -1)); mHintListLocalCache.add(new historyRowModel("Walmart", "https://walmart.com", -1)); mHintListLocalCache.add(new historyRowModel("Instagram", "https://instagram.com", -1)); mHintListLocalCache.add(new historyRowModel("Google", "https://google.com", -1)); mHintListLocalCache.add(new historyRowModel("NY Times", "https://nytimes.com", -1)); mHintListLocalCache.add(new historyRowModel("Apple", "https://apple.com", -1)); mHintListLocalCache.add(new historyRowModel("Linkedin", "https://linkedin.com", -1)); mHintListLocalCache.add(new historyRowModel("Play.Google", "https://play.google.com", -1)); mHintListLocalCache.add(new historyRowModel("ESPN", "https://espn.com", -1)); mHintListLocalCache.add(new historyRowModel("Webmd", "https://webmd.com", -1)); mHintListLocalCache.add(new historyRowModel("CNN", "https://cnn.com", -1)); mHintListLocalCache.add(new historyRowModel("Homedepot", "https://homedepot.com", -1)); mHintListLocalCache.add(new historyRowModel("ETSY", "https://etsy.com", -1)); mHintListLocalCache.add(new historyRowModel("Netflix", "https://netflix.com", -1)); mHintListLocalCache.add(new historyRowModel("Quora", "https://quora.com", -1)); mHintListLocalCache.add(new historyRowModel("Microsoft", "https://microsoft.com", -1)); mHintListLocalCache.add(new historyRowModel("Target", "https://target.com", -1)); mHintListLocalCache.add(new historyRowModel("Merriam Webster", "https://merriam-webster.com", -1)); mHintListLocalCache.add(new historyRowModel("Forbes", "https://forbes.com", -1)); mHintListLocalCache.add(new historyRowModel("Mapquest", "https://mapquest.com", -1)); mHintListLocalCache.add(new historyRowModel("NIH", "https://nih.gov", -1)); mHintListLocalCache.add(new historyRowModel("Gamepedia", "https://gamepedia.com", -1)); mHintListLocalCache.add(new historyRowModel("Yahoo", "https://yahoo.com", -1)); mHintListLocalCache.add(new historyRowModel("Healthline", "https://healthline.com", -1)); mHintListLocalCache.add(new historyRowModel("Foxnews", "https://foxnews.com", -1)); mHintListLocalCache.add(new historyRowModel("All Recipes", "https://allrecipes.com", -1)); mHintListLocalCache.add(new historyRowModel("Quizlet", "https://quizlet.com", -1)); mHintListLocalCache.add(new historyRowModel("Weather", "https://weather.com", -1)); mHintListLocalCache.add(new historyRowModel("Bestbuy", "https://bestbuy.com", -1)); mHintListLocalCache.add(new historyRowModel("Urbandictionary", "https://urbandictionary.com", -1)); mHintListLocalCache.add(new historyRowModel("Mayoclinic", "https://mayoclinic.org", -1)); mHintListLocalCache.add(new historyRowModel("AOL", "https://aol.com", -1)); mHintListLocalCache.add(new historyRowModel("Genius", "https://genius.com", -1)); mHintListLocalCache.add(new historyRowModel("Zillow", "https://zillow.com", -1)); mHintListLocalCache.add(new historyRowModel("Usatoday", "https://usatoday.com", -1)); mHintListLocalCache.add(new historyRowModel("Glassdoor", "https://glassdoor.com", -1)); mHintListLocalCache.add(new historyRowModel("MSN", "https://msn.com", -1)); mHintListLocalCache.add(new historyRowModel("Rotten Tomatoes", "https://rottentomatoes.com", -1)); mHintListLocalCache.add(new historyRowModel("Lowes", "https://lowes.com", -1)); mHintListLocalCache.add(new historyRowModel("Dictionary", "https://dictionary.com", -1)); mHintListLocalCache.add(new historyRowModel("Business Insider", "https://businessinsider.com", -1)); mHintListLocalCache.add(new historyRowModel("US News", "https://usnews.com", -1)); mHintListLocalCache.add(new historyRowModel("Medical News Today", "https://medicalnewstoday.com", -1)); mHintListLocalCache.add(new historyRowModel("Britannica", "https://britannica.com", -1)); mHintListLocalCache.add(new historyRowModel("Washington Post", "https://washingtonpost.com", -1)); mHintListLocalCache.add(new historyRowModel("USPS", "https://usps.com", -1)); mHintListLocalCache.add(new historyRowModel("Finance Yahoo", "https://finance.yahoo.com", -1)); mHintListLocalCache.add(new historyRowModel("IRS", "https://finance.irs.gov", -1)); mHintListLocalCache.add(new historyRowModel("Yellow Pages", "https://yellowpages.com", -1)); mHintListLocalCache.add(new historyRowModel("Chase", "https://chase.com", -1)); mHintListLocalCache.add(new historyRowModel("Retail Menot", "https://retailmenot.com", -1)); mHintListLocalCache.add(new historyRowModel("Accuweather", "https://accuweather.com", -1)); mHintListLocalCache.add(new historyRowModel("Way Fair", "https://wayfair.com", -1)); mHintListLocalCache.add(new historyRowModel("GO", "https://go.com", -1)); mHintListLocalCache.add(new historyRowModel("Live", "https://live.com", -1)); mHintListLocalCache.add(new historyRowModel("Login Yahoo", "https://login.yahoo.com", -1)); mHintListLocalCache.add(new historyRowModel("Steam Community", "https://steamcommunity.com", -1)); mHintListLocalCache.add(new historyRowModel("XFinity", "https://xfinity.com", -1)); mHintListLocalCache.add(new historyRowModel("CNET", "https://cnet.com", -1)); mHintListLocalCache.add(new historyRowModel("IGN", "https://ign.com", -1)); mHintListLocalCache.add(new historyRowModel("Steam Powered", "https://steampowered.com", -1)); mHintListLocalCache.add(new historyRowModel("Macys", "https://macys.com", -1)); mHintListLocalCache.add(new historyRowModel("Wikihow", "https://wikihow.com", -1)); mHintListLocalCache.add(new historyRowModel("Wikipedia", "https://en.wikipedia.org/", -1)); mHintListLocalCache.add(new historyRowModel("Mail Yahoo", "https://mail.yahoo.com", -1)); mHintListLocalCache.add(new historyRowModel("Wiktionary", "https://wiktionary.com", -1)); mHintListLocalCache.add(new historyRowModel("Cbssports", "https://cbssports.com", -1)); mHintListLocalCache.add(new historyRowModel("CNBC", "https://cnbc.com", -1)); mHintListLocalCache.add(new historyRowModel("Bank Of America", "https://bankofamerica.com", -1)); mHintListLocalCache.add(new historyRowModel("Expedia", "https://expedia.com", -1)); mHintListLocalCache.add(new historyRowModel("Wellsfargo", "https://wellsfargo.com", -1)); mHintListLocalCache.add(new historyRowModel("Groupon", "https://groupon.com", -1)); mHintListLocalCache.add(new historyRowModel("Twitch", "https://twitch.com", -1)); mHintListLocalCache.add(new historyRowModel("Khan Academy", "https://khanacademy.com", -1)); mHintListLocalCache.add(new historyRowModel("The Guardian", "https://theguardian.com", -1)); mHintListLocalCache.add(new historyRowModel("Paypal", "https://paypal.com", -1)); mHintListLocalCache.add(new historyRowModel("Spotify", "https://spotify.com", -1)); mHintListLocalCache.add(new historyRowModel("ATT", "https://att.com", -1)); mHintListLocalCache.add(new historyRowModel("NFL", "https://nfl.com", -1)); mHintListLocalCache.add(new historyRowModel("Realtor", "https://realtor.com", -1)); mHintListLocalCache.add(new historyRowModel("CA Gov", "https://ca.gov", -1)); mHintListLocalCache.add(new historyRowModel("Good Reads", "https://goodreads.com", -1)); mHintListLocalCache.add(new historyRowModel("Office", "https://office.com", -1)); mHintListLocalCache.add(new historyRowModel("UFL", "https://ufl.com", -1)); mHintListLocalCache.add(new historyRowModel("MLB", "https://mlb.com", -1)); mHintListLocalCache.add(new historyRowModel("Food Network", "https://foodnetwork.com", -1)); mHintListLocalCache.add(new historyRowModel("Apartments", "https://apartments.com", -1)); mHintListLocalCache.add(new historyRowModel("NPR", "https://npr.com", -1)); mHintListLocalCache.add(new historyRowModel("Wow Head", "https://wowhead.com", -1)); mHintListLocalCache.add(new historyRowModel("Bing", "https://bing.com", -1)); mHintListLocalCache.add(new historyRowModel("Google", "https://google.com", -1)); if (status.sTorBrowsing) { mHintListLocalCache.add(new historyRowModel("Orion Search", "https://orion.onion", -1)); } return mHintListLocalCache; } /*External Redirections*/ public Object onTrigger(dataEnums.eSuggestionCommands pCommands, List pData) { if (pCommands == dataEnums.eSuggestionCommands.M_GET_SUGGESTIONS) { return getSuggestions((String) pData.get(0), (ArrayList) pData.get(1), (ArrayList) pData.get(2)); } else if (pCommands == dataEnums.eSuggestionCommands.M_GET_DEFAULT_SUGGESTION) { return getDefaultSuggestionsOnStart((String) pData.get(0)); } return null; } /*Local Overrides*/ @Override public void onGetSuggestions(SuggestionsInfo[] results) { } @Override public void onGetSentenceSuggestions(SentenceSuggestionsInfo[] results) { } }