508 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			508 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package androidx.appcompat.widget;
 | |
| 
 | |
| import android.app.SearchableInfo;
 | |
| import android.content.ComponentName;
 | |
| import android.content.Context;
 | |
| import android.content.pm.ActivityInfo;
 | |
| import android.content.pm.PackageManager;
 | |
| import android.content.res.ColorStateList;
 | |
| import android.content.res.Resources;
 | |
| import android.database.Cursor;
 | |
| import android.graphics.drawable.Drawable;
 | |
| import android.net.Uri;
 | |
| import android.os.Bundle;
 | |
| import android.text.SpannableString;
 | |
| import android.text.TextUtils;
 | |
| import android.text.style.TextAppearanceSpan;
 | |
| import android.util.Log;
 | |
| import android.util.TypedValue;
 | |
| import android.view.View;
 | |
| import android.view.ViewGroup;
 | |
| import android.widget.ImageView;
 | |
| import android.widget.TextView;
 | |
| import androidx.appcompat.R;
 | |
| import androidx.core.content.ContextCompat;
 | |
| import androidx.cursoradapter.widget.ResourceCursorAdapter;
 | |
| import java.io.FileNotFoundException;
 | |
| import java.io.IOException;
 | |
| import java.io.InputStream;
 | |
| import java.util.List;
 | |
| import java.util.WeakHashMap;
 | |
| 
 | |
| /* loaded from: classes.dex */
 | |
| class SuggestionsAdapter extends ResourceCursorAdapter implements View.OnClickListener {
 | |
|     private static final boolean DBG = false;
 | |
|     static final int INVALID_INDEX = -1;
 | |
|     private static final String LOG_TAG = "SuggestionsAdapter";
 | |
|     private static final int QUERY_LIMIT = 50;
 | |
|     static final int REFINE_ALL = 2;
 | |
|     static final int REFINE_BY_ENTRY = 1;
 | |
|     static final int REFINE_NONE = 0;
 | |
|     private boolean mClosed;
 | |
|     private final int mCommitIconResId;
 | |
|     private int mFlagsCol;
 | |
|     private int mIconName1Col;
 | |
|     private int mIconName2Col;
 | |
|     private final WeakHashMap<String, Drawable.ConstantState> mOutsideDrawablesCache;
 | |
|     private final Context mProviderContext;
 | |
|     private int mQueryRefinement;
 | |
|     private final SearchView mSearchView;
 | |
|     private final SearchableInfo mSearchable;
 | |
|     private int mText1Col;
 | |
|     private int mText2Col;
 | |
|     private int mText2UrlCol;
 | |
|     private ColorStateList mUrlColor;
 | |
| 
 | |
|     public int getQueryRefinement() {
 | |
|         return this.mQueryRefinement;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.cursoradapter.widget.CursorAdapter, android.widget.BaseAdapter, android.widget.Adapter
 | |
|     public boolean hasStableIds() {
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     public void setQueryRefinement(int i) {
 | |
|         this.mQueryRefinement = i;
 | |
|     }
 | |
| 
 | |
|     public SuggestionsAdapter(Context context, SearchView searchView, SearchableInfo searchableInfo, WeakHashMap<String, Drawable.ConstantState> weakHashMap) {
 | |
|         super(context, searchView.getSuggestionRowLayout(), (Cursor) null, true);
 | |
|         this.mClosed = false;
 | |
|         this.mQueryRefinement = 1;
 | |
|         this.mText1Col = -1;
 | |
|         this.mText2Col = -1;
 | |
|         this.mText2UrlCol = -1;
 | |
|         this.mIconName1Col = -1;
 | |
|         this.mIconName2Col = -1;
 | |
|         this.mFlagsCol = -1;
 | |
|         this.mSearchView = searchView;
 | |
|         this.mSearchable = searchableInfo;
 | |
|         this.mCommitIconResId = searchView.getSuggestionCommitIconResId();
 | |
|         this.mProviderContext = context;
 | |
|         this.mOutsideDrawablesCache = weakHashMap;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.cursoradapter.widget.CursorAdapter, androidx.cursoradapter.widget.CursorFilter.CursorFilterClient
 | |
|     public Cursor runQueryOnBackgroundThread(CharSequence charSequence) {
 | |
|         String charSequence2 = charSequence == null ? "" : charSequence.toString();
 | |
|         if (this.mSearchView.getVisibility() == 0 && this.mSearchView.getWindowVisibility() == 0) {
 | |
|             try {
 | |
|                 Cursor searchManagerSuggestions = getSearchManagerSuggestions(this.mSearchable, charSequence2, 50);
 | |
|                 if (searchManagerSuggestions != null) {
 | |
|                     searchManagerSuggestions.getCount();
 | |
|                     return searchManagerSuggestions;
 | |
|                 }
 | |
|             } catch (RuntimeException e) {
 | |
|                 Log.w(LOG_TAG, "Search suggestions query threw an exception.", e);
 | |
|             }
 | |
|         }
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     public void close() {
 | |
|         changeCursor(null);
 | |
|         this.mClosed = true;
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.BaseAdapter
 | |
|     public void notifyDataSetChanged() {
 | |
|         super.notifyDataSetChanged();
 | |
|         updateSpinnerState(getCursor());
 | |
|     }
 | |
| 
 | |
|     @Override // android.widget.BaseAdapter
 | |
|     public void notifyDataSetInvalidated() {
 | |
|         super.notifyDataSetInvalidated();
 | |
|         updateSpinnerState(getCursor());
 | |
|     }
 | |
| 
 | |
|     private void updateSpinnerState(Cursor cursor) {
 | |
|         Bundle extras = cursor != null ? cursor.getExtras() : null;
 | |
|         if (extras != null) {
 | |
|             extras.getBoolean("in_progress");
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.cursoradapter.widget.CursorAdapter, androidx.cursoradapter.widget.CursorFilter.CursorFilterClient
 | |
|     public void changeCursor(Cursor cursor) {
 | |
|         if (this.mClosed) {
 | |
|             Log.w(LOG_TAG, "Tried to change cursor after adapter was closed.");
 | |
|             if (cursor != null) {
 | |
|                 cursor.close();
 | |
|                 return;
 | |
|             }
 | |
|             return;
 | |
|         }
 | |
|         try {
 | |
|             super.changeCursor(cursor);
 | |
|             if (cursor != null) {
 | |
|                 this.mText1Col = cursor.getColumnIndex("suggest_text_1");
 | |
|                 this.mText2Col = cursor.getColumnIndex("suggest_text_2");
 | |
|                 this.mText2UrlCol = cursor.getColumnIndex("suggest_text_2_url");
 | |
|                 this.mIconName1Col = cursor.getColumnIndex("suggest_icon_1");
 | |
|                 this.mIconName2Col = cursor.getColumnIndex("suggest_icon_2");
 | |
|                 this.mFlagsCol = cursor.getColumnIndex("suggest_flags");
 | |
|             }
 | |
|         } catch (Exception e) {
 | |
|             Log.e(LOG_TAG, "error changing cursor and caching columns", e);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.cursoradapter.widget.ResourceCursorAdapter, androidx.cursoradapter.widget.CursorAdapter
 | |
|     public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
 | |
|         View newView = super.newView(context, cursor, viewGroup);
 | |
|         newView.setTag(new ChildViewCache(newView));
 | |
|         ((ImageView) newView.findViewById(R.id.edit_query)).setImageResource(this.mCommitIconResId);
 | |
|         return newView;
 | |
|     }
 | |
| 
 | |
|     private static final class ChildViewCache {
 | |
|         public final ImageView mIcon1;
 | |
|         public final ImageView mIcon2;
 | |
|         public final ImageView mIconRefine;
 | |
|         public final TextView mText1;
 | |
|         public final TextView mText2;
 | |
| 
 | |
|         public ChildViewCache(View view) {
 | |
|             this.mText1 = (TextView) view.findViewById(android.R.id.text1);
 | |
|             this.mText2 = (TextView) view.findViewById(android.R.id.text2);
 | |
|             this.mIcon1 = (ImageView) view.findViewById(android.R.id.icon1);
 | |
|             this.mIcon2 = (ImageView) view.findViewById(android.R.id.icon2);
 | |
|             this.mIconRefine = (ImageView) view.findViewById(R.id.edit_query);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.cursoradapter.widget.CursorAdapter
 | |
|     public void bindView(View view, Context context, Cursor cursor) {
 | |
|         CharSequence stringOrNull;
 | |
|         ChildViewCache childViewCache = (ChildViewCache) view.getTag();
 | |
|         int i = this.mFlagsCol;
 | |
|         int i2 = i != -1 ? cursor.getInt(i) : 0;
 | |
|         if (childViewCache.mText1 != null) {
 | |
|             setViewText(childViewCache.mText1, getStringOrNull(cursor, this.mText1Col));
 | |
|         }
 | |
|         if (childViewCache.mText2 != null) {
 | |
|             String stringOrNull2 = getStringOrNull(cursor, this.mText2UrlCol);
 | |
|             if (stringOrNull2 != null) {
 | |
|                 stringOrNull = formatUrl(stringOrNull2);
 | |
|             } else {
 | |
|                 stringOrNull = getStringOrNull(cursor, this.mText2Col);
 | |
|             }
 | |
|             if (TextUtils.isEmpty(stringOrNull)) {
 | |
|                 if (childViewCache.mText1 != null) {
 | |
|                     childViewCache.mText1.setSingleLine(false);
 | |
|                     childViewCache.mText1.setMaxLines(2);
 | |
|                 }
 | |
|             } else if (childViewCache.mText1 != null) {
 | |
|                 childViewCache.mText1.setSingleLine(true);
 | |
|                 childViewCache.mText1.setMaxLines(1);
 | |
|             }
 | |
|             setViewText(childViewCache.mText2, stringOrNull);
 | |
|         }
 | |
|         if (childViewCache.mIcon1 != null) {
 | |
|             setViewDrawable(childViewCache.mIcon1, getIcon1(cursor), 4);
 | |
|         }
 | |
|         if (childViewCache.mIcon2 != null) {
 | |
|             setViewDrawable(childViewCache.mIcon2, getIcon2(cursor), 8);
 | |
|         }
 | |
|         int i3 = this.mQueryRefinement;
 | |
|         if (i3 == 2 || (i3 == 1 && (i2 & 1) != 0)) {
 | |
|             childViewCache.mIconRefine.setVisibility(0);
 | |
|             childViewCache.mIconRefine.setTag(childViewCache.mText1.getText());
 | |
|             childViewCache.mIconRefine.setOnClickListener(this);
 | |
|             return;
 | |
|         }
 | |
|         childViewCache.mIconRefine.setVisibility(8);
 | |
|     }
 | |
| 
 | |
|     @Override // android.view.View.OnClickListener
 | |
|     public void onClick(View view) {
 | |
|         Object tag = view.getTag();
 | |
|         if (tag instanceof CharSequence) {
 | |
|             this.mSearchView.onQueryRefine((CharSequence) tag);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private CharSequence formatUrl(CharSequence charSequence) {
 | |
|         if (this.mUrlColor == null) {
 | |
|             TypedValue typedValue = new TypedValue();
 | |
|             this.mProviderContext.getTheme().resolveAttribute(R.attr.textColorSearchUrl, typedValue, true);
 | |
|             this.mUrlColor = this.mProviderContext.getResources().getColorStateList(typedValue.resourceId);
 | |
|         }
 | |
|         SpannableString spannableString = new SpannableString(charSequence);
 | |
|         spannableString.setSpan(new TextAppearanceSpan(null, 0, 0, this.mUrlColor, null), 0, charSequence.length(), 33);
 | |
|         return spannableString;
 | |
|     }
 | |
| 
 | |
|     private void setViewText(TextView textView, CharSequence charSequence) {
 | |
|         textView.setText(charSequence);
 | |
|         if (TextUtils.isEmpty(charSequence)) {
 | |
|             textView.setVisibility(8);
 | |
|         } else {
 | |
|             textView.setVisibility(0);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private Drawable getIcon1(Cursor cursor) {
 | |
|         int i = this.mIconName1Col;
 | |
|         if (i == -1) {
 | |
|             return null;
 | |
|         }
 | |
|         Drawable drawableFromResourceValue = getDrawableFromResourceValue(cursor.getString(i));
 | |
|         return drawableFromResourceValue != null ? drawableFromResourceValue : getDefaultIcon1();
 | |
|     }
 | |
| 
 | |
|     private Drawable getIcon2(Cursor cursor) {
 | |
|         int i = this.mIconName2Col;
 | |
|         if (i == -1) {
 | |
|             return null;
 | |
|         }
 | |
|         return getDrawableFromResourceValue(cursor.getString(i));
 | |
|     }
 | |
| 
 | |
|     private void setViewDrawable(ImageView imageView, Drawable drawable, int i) {
 | |
|         imageView.setImageDrawable(drawable);
 | |
|         if (drawable == null) {
 | |
|             imageView.setVisibility(i);
 | |
|             return;
 | |
|         }
 | |
|         imageView.setVisibility(0);
 | |
|         drawable.setVisible(false, false);
 | |
|         drawable.setVisible(true, false);
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.cursoradapter.widget.CursorAdapter, androidx.cursoradapter.widget.CursorFilter.CursorFilterClient
 | |
|     public CharSequence convertToString(Cursor cursor) {
 | |
|         String columnString;
 | |
|         String columnString2;
 | |
|         if (cursor == null) {
 | |
|             return null;
 | |
|         }
 | |
|         String columnString3 = getColumnString(cursor, "suggest_intent_query");
 | |
|         if (columnString3 != null) {
 | |
|             return columnString3;
 | |
|         }
 | |
|         if (this.mSearchable.shouldRewriteQueryFromData() && (columnString2 = getColumnString(cursor, "suggest_intent_data")) != null) {
 | |
|             return columnString2;
 | |
|         }
 | |
|         if (!this.mSearchable.shouldRewriteQueryFromText() || (columnString = getColumnString(cursor, "suggest_text_1")) == null) {
 | |
|             return null;
 | |
|         }
 | |
|         return columnString;
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.cursoradapter.widget.CursorAdapter, android.widget.Adapter
 | |
|     public View getView(int i, View view, ViewGroup viewGroup) {
 | |
|         try {
 | |
|             return super.getView(i, view, viewGroup);
 | |
|         } catch (RuntimeException e) {
 | |
|             Log.w(LOG_TAG, "Search suggestions cursor threw exception.", e);
 | |
|             View newView = newView(this.mProviderContext, getCursor(), viewGroup);
 | |
|             if (newView != null) {
 | |
|                 ((ChildViewCache) newView.getTag()).mText1.setText(e.toString());
 | |
|             }
 | |
|             return newView;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @Override // androidx.cursoradapter.widget.CursorAdapter, android.widget.BaseAdapter, android.widget.SpinnerAdapter
 | |
|     public View getDropDownView(int i, View view, ViewGroup viewGroup) {
 | |
|         try {
 | |
|             return super.getDropDownView(i, view, viewGroup);
 | |
|         } catch (RuntimeException e) {
 | |
|             Log.w(LOG_TAG, "Search suggestions cursor threw exception.", e);
 | |
|             View newDropDownView = newDropDownView(this.mProviderContext, getCursor(), viewGroup);
 | |
|             if (newDropDownView != null) {
 | |
|                 ((ChildViewCache) newDropDownView.getTag()).mText1.setText(e.toString());
 | |
|             }
 | |
|             return newDropDownView;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private Drawable getDrawableFromResourceValue(String str) {
 | |
|         if (str == null || str.isEmpty() || "0".equals(str)) {
 | |
|             return null;
 | |
|         }
 | |
|         try {
 | |
|             int parseInt = Integer.parseInt(str);
 | |
|             String str2 = "android.resource://" + this.mProviderContext.getPackageName() + "/" + parseInt;
 | |
|             Drawable checkIconCache = checkIconCache(str2);
 | |
|             if (checkIconCache != null) {
 | |
|                 return checkIconCache;
 | |
|             }
 | |
|             Drawable drawable = ContextCompat.getDrawable(this.mProviderContext, parseInt);
 | |
|             storeInIconCache(str2, drawable);
 | |
|             return drawable;
 | |
|         } catch (Resources.NotFoundException unused) {
 | |
|             Log.w(LOG_TAG, "Icon resource not found: " + str);
 | |
|             return null;
 | |
|         } catch (NumberFormatException unused2) {
 | |
|             Drawable checkIconCache2 = checkIconCache(str);
 | |
|             if (checkIconCache2 != null) {
 | |
|                 return checkIconCache2;
 | |
|             }
 | |
|             Drawable drawable2 = getDrawable(Uri.parse(str));
 | |
|             storeInIconCache(str, drawable2);
 | |
|             return drawable2;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private Drawable getDrawable(Uri uri) {
 | |
|         try {
 | |
|             if ("android.resource".equals(uri.getScheme())) {
 | |
|                 try {
 | |
|                     return getDrawableFromResourceUri(uri);
 | |
|                 } catch (Resources.NotFoundException unused) {
 | |
|                     throw new FileNotFoundException("Resource does not exist: " + uri);
 | |
|                 }
 | |
|             }
 | |
|             InputStream openInputStream = this.mProviderContext.getContentResolver().openInputStream(uri);
 | |
|             if (openInputStream == null) {
 | |
|                 throw new FileNotFoundException("Failed to open " + uri);
 | |
|             }
 | |
|             try {
 | |
|                 return Drawable.createFromStream(openInputStream, null);
 | |
|             } finally {
 | |
|                 try {
 | |
|                     openInputStream.close();
 | |
|                 } catch (IOException e) {
 | |
|                     Log.e(LOG_TAG, "Error closing icon stream for " + uri, e);
 | |
|                 }
 | |
|             }
 | |
|         } catch (FileNotFoundException e2) {
 | |
|             Log.w(LOG_TAG, "Icon not found: " + uri + ", " + e2.getMessage());
 | |
|             return null;
 | |
|         }
 | |
|         Log.w(LOG_TAG, "Icon not found: " + uri + ", " + e2.getMessage());
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     private Drawable checkIconCache(String str) {
 | |
|         Drawable.ConstantState constantState = this.mOutsideDrawablesCache.get(str);
 | |
|         if (constantState == null) {
 | |
|             return null;
 | |
|         }
 | |
|         return constantState.newDrawable();
 | |
|     }
 | |
| 
 | |
|     private void storeInIconCache(String str, Drawable drawable) {
 | |
|         if (drawable != null) {
 | |
|             this.mOutsideDrawablesCache.put(str, drawable.getConstantState());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private Drawable getDefaultIcon1() {
 | |
|         Drawable activityIconWithCache = getActivityIconWithCache(this.mSearchable.getSearchActivity());
 | |
|         return activityIconWithCache != null ? activityIconWithCache : this.mProviderContext.getPackageManager().getDefaultActivityIcon();
 | |
|     }
 | |
| 
 | |
|     private Drawable getActivityIconWithCache(ComponentName componentName) {
 | |
|         String flattenToShortString = componentName.flattenToShortString();
 | |
|         if (this.mOutsideDrawablesCache.containsKey(flattenToShortString)) {
 | |
|             Drawable.ConstantState constantState = this.mOutsideDrawablesCache.get(flattenToShortString);
 | |
|             if (constantState == null) {
 | |
|                 return null;
 | |
|             }
 | |
|             return constantState.newDrawable(this.mProviderContext.getResources());
 | |
|         }
 | |
|         Drawable activityIcon = getActivityIcon(componentName);
 | |
|         this.mOutsideDrawablesCache.put(flattenToShortString, activityIcon != null ? activityIcon.getConstantState() : null);
 | |
|         return activityIcon;
 | |
|     }
 | |
| 
 | |
|     private Drawable getActivityIcon(ComponentName componentName) {
 | |
|         PackageManager packageManager = this.mProviderContext.getPackageManager();
 | |
|         try {
 | |
|             ActivityInfo activityInfo = packageManager.getActivityInfo(componentName, 128);
 | |
|             int iconResource = activityInfo.getIconResource();
 | |
|             if (iconResource == 0) {
 | |
|                 return null;
 | |
|             }
 | |
|             Drawable drawable = packageManager.getDrawable(componentName.getPackageName(), iconResource, activityInfo.applicationInfo);
 | |
|             if (drawable != null) {
 | |
|                 return drawable;
 | |
|             }
 | |
|             Log.w(LOG_TAG, "Invalid icon resource " + iconResource + " for " + componentName.flattenToShortString());
 | |
|             return null;
 | |
|         } catch (PackageManager.NameNotFoundException e) {
 | |
|             Log.w(LOG_TAG, e.toString());
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static String getColumnString(Cursor cursor, String str) {
 | |
|         return getStringOrNull(cursor, cursor.getColumnIndex(str));
 | |
|     }
 | |
| 
 | |
|     private static String getStringOrNull(Cursor cursor, int i) {
 | |
|         if (i == -1) {
 | |
|             return null;
 | |
|         }
 | |
|         try {
 | |
|             return cursor.getString(i);
 | |
|         } catch (Exception e) {
 | |
|             Log.e(LOG_TAG, "unexpected error retrieving valid column from cursor, did the remote process die?", e);
 | |
|             return null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     Drawable getDrawableFromResourceUri(Uri uri) throws FileNotFoundException {
 | |
|         int parseInt;
 | |
|         String authority = uri.getAuthority();
 | |
|         if (TextUtils.isEmpty(authority)) {
 | |
|             throw new FileNotFoundException("No authority: " + uri);
 | |
|         }
 | |
|         try {
 | |
|             Resources resourcesForApplication = this.mProviderContext.getPackageManager().getResourcesForApplication(authority);
 | |
|             List<String> pathSegments = uri.getPathSegments();
 | |
|             if (pathSegments == null) {
 | |
|                 throw new FileNotFoundException("No path: " + uri);
 | |
|             }
 | |
|             int size = pathSegments.size();
 | |
|             if (size == 1) {
 | |
|                 try {
 | |
|                     parseInt = Integer.parseInt(pathSegments.get(0));
 | |
|                 } catch (NumberFormatException unused) {
 | |
|                     throw new FileNotFoundException("Single path segment is not a resource ID: " + uri);
 | |
|                 }
 | |
|             } else if (size == 2) {
 | |
|                 parseInt = resourcesForApplication.getIdentifier(pathSegments.get(1), pathSegments.get(0), authority);
 | |
|             } else {
 | |
|                 throw new FileNotFoundException("More than two path segments: " + uri);
 | |
|             }
 | |
|             if (parseInt == 0) {
 | |
|                 throw new FileNotFoundException("No resource found for: " + uri);
 | |
|             }
 | |
|             return resourcesForApplication.getDrawable(parseInt);
 | |
|         } catch (PackageManager.NameNotFoundException unused2) {
 | |
|             throw new FileNotFoundException("No package found for authority: " + uri);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     Cursor getSearchManagerSuggestions(SearchableInfo searchableInfo, String str, int i) {
 | |
|         String suggestAuthority;
 | |
|         String[] strArr = null;
 | |
|         if (searchableInfo == null || (suggestAuthority = searchableInfo.getSuggestAuthority()) == null) {
 | |
|             return null;
 | |
|         }
 | |
|         Uri.Builder fragment = new Uri.Builder().scheme("content").authority(suggestAuthority).query("").fragment("");
 | |
|         String suggestPath = searchableInfo.getSuggestPath();
 | |
|         if (suggestPath != null) {
 | |
|             fragment.appendEncodedPath(suggestPath);
 | |
|         }
 | |
|         fragment.appendPath("search_suggest_query");
 | |
|         String suggestSelection = searchableInfo.getSuggestSelection();
 | |
|         if (suggestSelection != null) {
 | |
|             strArr = new String[]{str};
 | |
|         } else {
 | |
|             fragment.appendPath(str);
 | |
|         }
 | |
|         String[] strArr2 = strArr;
 | |
|         if (i > 0) {
 | |
|             fragment.appendQueryParameter("limit", String.valueOf(i));
 | |
|         }
 | |
|         return this.mProviderContext.getContentResolver().query(fragment.build(), null, suggestSelection, strArr2, null);
 | |
|     }
 | |
| }
 |