content: /*
   * Copyright (C) 2018 The Android Open Source Project
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.android.quickstep;
  
  import android.annotation.TargetApi;
  import android.content.Intent;
  import android.content.pm.LauncherApps;
  import android.content.pm.ResolveInfo;
  import android.content.res.TypedArray;
  import android.content.res.XmlResourceParser;
  import android.database.Cursor;
  import android.database.MatrixCursor;
  import android.os.Build;
  import android.provider.SearchIndexablesContract.XmlResource;
  import android.provider.SearchIndexablesProvider;
  import android.util.Xml;
  
  import com.android.launcher3.R;
  
  import org.xmlpull.v1.XmlPullParser;
  import org.xmlpull.v1.XmlPullParserException;
  
  import java.io.IOException;
  
  import static android.provider.SearchIndexablesContract.INDEXABLES_RAW_COLUMNS;
  import static android.provider.SearchIndexablesContract.INDEXABLES_XML_RES_COLUMNS;
  import static android.provider.SearchIndexablesContract.NON_INDEXABLES_KEYS_COLUMNS;
  
  @TargetApi(Build.VERSION_CODES.O)
  public class LauncherSearchIndexablesProvider extends SearchIndexablesProvider {
      @Override
      public boolean onCreate() {
          return true;
      }
  
      @Override
      public Cursor queryXmlResources(String[] strings) {
          MatrixCursor cursor = new MatrixCursor(INDEXABLES_XML_RES_COLUMNS);
          ResolveInfo settingsActivity = getContext().getPackageManager().resolveActivity(
                  new Intent(Intent.ACTION_APPLICATION_PREFERENCES)
                          .setPackage(getContext().getPackageName()), 0);
          cursor.newRow()
                  .add(XmlResource.COLUMN_XML_RESID, R.xml.indexable_launcher_prefs)
                  .add(XmlResource.COLUMN_INTENT_ACTION, Intent.ACTION_APPLICATION_PREFERENCES)
                  .add(XmlResource.COLUMN_INTENT_TARGET_PACKAGE, getContext().getPackageName())
                  .add(XmlResource.COLUMN_INTENT_TARGET_CLASS, settingsActivity.activityInfo.name);
          return cursor;
      }
  
      @Override
      public Cursor queryRawData(String[] projection) {
          return new MatrixCursor(INDEXABLES_RAW_COLUMNS);
      }
  
      @Override
      public Cursor queryNonIndexableKeys(String[] projection) {
          MatrixCursor cursor = new MatrixCursor(NON_INDEXABLES_KEYS_COLUMNS);
          if (!getContext().getSystemService(LauncherApps.class).hasShortcutHostPermission()) {
              // We are not the current launcher. Hide all preferences
              try (XmlResourceParser parser = getContext().getResources()
                      .getXml(R.xml.indexable_launcher_prefs)) {
                  final int depth = parser.getDepth();
                  final int[] attrs = new int[] { android.R.attr.key };
                  int type;
                  while (((type = parser.next()) != XmlPullParser.END_TAG ||
                          parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
                      if (type == XmlPullParser.START_TAG) {
                          TypedArray a = getContext().obtainStyledAttributes(
                                  Xml.asAttributeSet(parser), attrs);
                          cursor.addRow(new String[] {a.getString(0)});
                          a.recycle();
                      }
                  }
              } catch (IOException |XmlPullParserException e) {
                  throw new RuntimeException(e);
              }
          }
          return cursor;
      }
  }
  