Home | History | Annotate | Download | only in query
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.settings.intelligence.search.query;
     18 
     19 import android.accessibilityservice.AccessibilityServiceInfo;
     20 import android.content.ComponentName;
     21 import android.content.Context;
     22 import android.content.Intent;
     23 import android.content.pm.PackageManager;
     24 import android.content.pm.ResolveInfo;
     25 import android.content.pm.ServiceInfo;
     26 import android.graphics.drawable.Drawable;
     27 import android.view.accessibility.AccessibilityManager;
     28 
     29 import com.android.settings.intelligence.R;
     30 import com.android.settings.intelligence.nano.SettingsIntelligenceLogProto;
     31 import com.android.settings.intelligence.search.ResultPayload;
     32 import com.android.settings.intelligence.search.SearchResult;
     33 import com.android.settings.intelligence.search.indexing.DatabaseIndexingUtils;
     34 import com.android.settings.intelligence.search.sitemap.SiteMapManager;
     35 
     36 import java.util.ArrayList;
     37 import java.util.Collections;
     38 import java.util.List;
     39 
     40 public class AccessibilityServiceResultTask extends SearchQueryTask.QueryWorker {
     41 
     42     public static final int QUERY_WORKER_ID = SettingsIntelligenceLogProto.SettingsIntelligenceEvent
     43             .SEARCH_QUERY_ACCESSIBILITY_SERVICES;
     44 
     45     private static final String ACCESSIBILITY_SETTINGS_CLASSNAME =
     46             "com.android.settings.accessibility.AccessibilitySettings";
     47     private static final int NAME_NO_MATCH = -1;
     48 
     49     private final AccessibilityManager mAccessibilityManager;
     50     private final PackageManager mPackageManager;
     51 
     52     private List<String> mBreadcrumb;
     53 
     54     public static SearchQueryTask newTask(Context context, SiteMapManager manager,
     55             String query) {
     56         return new SearchQueryTask(new AccessibilityServiceResultTask(context, manager, query));
     57     }
     58 
     59     public AccessibilityServiceResultTask(Context context, SiteMapManager mapManager,
     60             String query) {
     61         super(context, mapManager, query);
     62         mPackageManager = context.getPackageManager();
     63         mAccessibilityManager =
     64                 (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
     65     }
     66 
     67     @Override
     68     protected List<? extends SearchResult> query() {
     69         final List<SearchResult> results = new ArrayList<>();
     70         final List<AccessibilityServiceInfo> services = mAccessibilityManager
     71                 .getInstalledAccessibilityServiceList();
     72         final String screenTitle = mContext.getString(R.string.accessibility_settings);
     73         for (AccessibilityServiceInfo service : services) {
     74             if (service == null) {
     75                 continue;
     76             }
     77             final ResolveInfo resolveInfo = service.getResolveInfo();
     78             if (service.getResolveInfo() == null) {
     79                 continue;
     80             }
     81             final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
     82             final CharSequence title = resolveInfo.loadLabel(mPackageManager);
     83             final int wordDiff = SearchQueryUtils.getWordDifference(title.toString(), mQuery);
     84             if (wordDiff == NAME_NO_MATCH) {
     85                 continue;
     86             }
     87             final Drawable icon = serviceInfo.loadIcon(mPackageManager);
     88             final String componentName = new ComponentName(serviceInfo.packageName,
     89                     serviceInfo.name).flattenToString();
     90             final Intent intent = DatabaseIndexingUtils.buildSearchTrampolineIntent(mContext,
     91                     ACCESSIBILITY_SETTINGS_CLASSNAME, componentName, screenTitle);
     92 
     93             results.add(new SearchResult.Builder()
     94                     .setTitle(title)
     95                     .addBreadcrumbs(getBreadCrumb())
     96                     .setPayload(new ResultPayload(intent))
     97                     .setRank(wordDiff)
     98                     .setIcon(icon)
     99                     .setDataKey(componentName)
    100                     .build());
    101         }
    102         Collections.sort(results);
    103         return results;
    104     }
    105 
    106     @Override
    107     protected int getQueryWorkerId() {
    108         return QUERY_WORKER_ID;
    109     }
    110 
    111     private List<String> getBreadCrumb() {
    112         if (mBreadcrumb == null || mBreadcrumb.isEmpty()) {
    113             mBreadcrumb = mSiteMapManager.buildBreadCrumb(
    114                     mContext, ACCESSIBILITY_SETTINGS_CLASSNAME,
    115                     mContext.getString(R.string.accessibility_settings));
    116         }
    117         return mBreadcrumb;
    118     }
    119 }
    120