Home | History | Annotate | Download | only in development
      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.development;
     18 
     19 import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes
     20         .REQUEST_CODE_DEBUG_APP;
     21 
     22 import android.app.Activity;
     23 import android.content.Context;
     24 import android.content.Intent;
     25 import android.content.pm.ApplicationInfo;
     26 import android.content.pm.PackageManager;
     27 import android.provider.Settings;
     28 import android.support.annotation.VisibleForTesting;
     29 import android.support.v7.preference.Preference;
     30 
     31 import com.android.settings.R;
     32 import com.android.settings.core.PreferenceControllerMixin;
     33 import com.android.settingslib.development.DeveloperOptionsPreferenceController;
     34 import com.android.settingslib.wrapper.PackageManagerWrapper;
     35 
     36 public class SelectDebugAppPreferenceController extends DeveloperOptionsPreferenceController
     37         implements PreferenceControllerMixin, OnActivityResultListener {
     38 
     39     private static final String DEBUG_APP_KEY = "debug_app";
     40 
     41     private final DevelopmentSettingsDashboardFragment mFragment;
     42     private final PackageManagerWrapper mPackageManager;
     43 
     44     public SelectDebugAppPreferenceController(Context context,
     45             DevelopmentSettingsDashboardFragment fragment) {
     46         super(context);
     47         mFragment = fragment;
     48         mPackageManager = new PackageManagerWrapper(mContext.getPackageManager());
     49     }
     50 
     51     @Override
     52     public String getPreferenceKey() {
     53         return DEBUG_APP_KEY;
     54     }
     55 
     56     @Override
     57     public boolean handlePreferenceTreeClick(Preference preference) {
     58         if (DEBUG_APP_KEY.equals(preference.getKey())) {
     59             final Intent intent = getActivityStartIntent();
     60             intent.putExtra(AppPicker.EXTRA_DEBUGGABLE, true /* value */);
     61             mFragment.startActivityForResult(intent, REQUEST_CODE_DEBUG_APP);
     62             return true;
     63         }
     64         return false;
     65     }
     66 
     67     @Override
     68     public void updateState(Preference preference) {
     69         updatePreferenceSummary();
     70     }
     71 
     72     @Override
     73     public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
     74         if (requestCode != REQUEST_CODE_DEBUG_APP || resultCode != Activity.RESULT_OK) {
     75             return false;
     76         }
     77         Settings.Global.putString(mContext.getContentResolver(), Settings.Global.DEBUG_APP,
     78                 data.getAction());
     79         updatePreferenceSummary();
     80         return true;
     81     }
     82 
     83     @Override
     84     protected void onDeveloperOptionsSwitchDisabled() {
     85         super.onDeveloperOptionsSwitchDisabled();
     86         mPreference.setSummary(mContext.getResources().getString(R.string.debug_app_not_set));
     87     }
     88 
     89     @VisibleForTesting
     90     Intent getActivityStartIntent() {
     91         return new Intent(mContext, AppPicker.class);
     92     }
     93 
     94     private void updatePreferenceSummary() {
     95         final String debugApp = Settings.Global.getString(
     96                 mContext.getContentResolver(), Settings.Global.DEBUG_APP);
     97         if (debugApp != null && debugApp.length() > 0) {
     98             mPreference.setSummary(mContext.getResources().getString(R.string.debug_app_set,
     99                     getAppLabel(debugApp)));
    100         } else {
    101             mPreference.setSummary(mContext.getResources().getString(R.string.debug_app_not_set));
    102         }
    103     }
    104 
    105     private String getAppLabel(String debugApp) {
    106         try {
    107             final ApplicationInfo ai = mPackageManager.getApplicationInfo(debugApp,
    108                     PackageManager.GET_DISABLED_COMPONENTS);
    109             final CharSequence lab = mPackageManager.getApplicationLabel(ai);
    110             return lab != null ? lab.toString() : debugApp;
    111         } catch (PackageManager.NameNotFoundException e) {
    112             return debugApp;
    113         }
    114     }
    115 }
    116