Home | History | Annotate | Download | only in network
      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 package com.android.settings.network;
     17 
     18 import android.content.Context;
     19 import android.net.NetworkScoreManager;
     20 import android.net.NetworkScorerAppData;
     21 import android.os.Bundle;
     22 import android.support.annotation.VisibleForTesting;
     23 import android.support.v7.preference.Preference;
     24 import android.support.v7.preference.PreferenceScreen;
     25 import android.text.TextUtils;
     26 import android.view.LayoutInflater;
     27 import android.view.View;
     28 import android.view.ViewGroup;
     29 import com.android.internal.logging.nano.MetricsProto;
     30 import com.android.settings.R;
     31 import com.android.settings.core.InstrumentedPreferenceFragment;
     32 import com.android.settings.widget.RadioButtonPreference;
     33 
     34 import java.util.List;
     35 
     36 /**
     37  * Fragment for choosing default network scorer.
     38  */
     39 public class NetworkScorerPicker extends InstrumentedPreferenceFragment implements
     40         RadioButtonPreference.OnClickListener {
     41 
     42     private NetworkScoreManagerWrapper mNetworkScoreManager;
     43 
     44     @Override
     45     public int getMetricsCategory() {
     46         return MetricsProto.MetricsEvent.SETTINGS_NETWORK_SCORER;
     47     }
     48 
     49     @Override
     50     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
     51         super.onCreatePreferences(savedInstanceState, rootKey);
     52         addPreferencesFromResource(R.xml.network_scorer_picker_prefs);
     53         updateCandidates();
     54     }
     55 
     56     @Override
     57     public void onAttach(Context context) {
     58         super.onAttach(context);
     59         mNetworkScoreManager = createNetworkScorerManagerWrapper(context);
     60     }
     61 
     62     @Override
     63     public View onCreateView(LayoutInflater inflater, ViewGroup container,
     64                              Bundle savedInstanceState) {
     65         final View view = super.onCreateView(inflater, container, savedInstanceState);
     66         // this is needed so the back button goes back to previous fragment
     67         setHasOptionsMenu(true);
     68         return view;
     69     }
     70 
     71     @VisibleForTesting
     72     public void updateCandidates() {
     73         final PreferenceScreen screen = getPreferenceScreen();
     74         screen.removeAll();
     75 
     76         final List<NetworkScorerAppData> scorers = mNetworkScoreManager.getAllValidScorers();
     77         final String defaultAppKey = getActiveScorerPackage();
     78 
     79         final RadioButtonPreference nonePref = new RadioButtonPreference(getPrefContext());
     80         nonePref.setTitle(R.string.network_scorer_picker_none_preference);
     81         if (scorers.isEmpty()) {
     82             nonePref.setChecked(true);
     83         } else {
     84             nonePref.setKey(null);
     85             nonePref.setChecked(TextUtils.isEmpty(defaultAppKey));
     86             nonePref.setOnClickListener(this);
     87         }
     88         screen.addPreference(nonePref);
     89 
     90         final int numScorers = scorers.size();
     91         for (int i = 0; i < numScorers; i++) {
     92             final RadioButtonPreference pref = new RadioButtonPreference(getPrefContext());
     93             final NetworkScorerAppData appData = scorers.get(i);
     94             final String appKey = appData.getRecommendationServicePackageName();
     95             pref.setTitle(appData.getRecommendationServiceLabel());
     96             pref.setKey(appKey);
     97             pref.setChecked(TextUtils.equals(defaultAppKey, appKey));
     98             pref.setOnClickListener(this);
     99             screen.addPreference(pref);
    100         }
    101     }
    102 
    103     private String getActiveScorerPackage() {
    104         return mNetworkScoreManager.getActiveScorerPackage();
    105     }
    106 
    107     private boolean setActiveScorer(String key) {
    108         if (!TextUtils.equals(key, getActiveScorerPackage())) {
    109             return mNetworkScoreManager.setActiveScorer(key);
    110         }
    111         return false;
    112     }
    113 
    114     @Override
    115     public void onRadioButtonClicked(RadioButtonPreference selected) {
    116         final String selectedKey = selected.getKey();
    117         final boolean success = setActiveScorer(selectedKey);
    118         if (success) {
    119             updateCheckedState(selectedKey);
    120         }
    121     }
    122 
    123     private void updateCheckedState(String selectedKey) {
    124         final PreferenceScreen screen = getPreferenceScreen();
    125         final int count = screen.getPreferenceCount();
    126         for (int i = 0; i < count; i++) {
    127             final Preference pref = screen.getPreference(i);
    128             if (pref instanceof RadioButtonPreference) {
    129                 final RadioButtonPreference radioPref = (RadioButtonPreference) pref;
    130                 radioPref.setChecked(TextUtils.equals(pref.getKey(), selectedKey));
    131             }
    132         }
    133     }
    134 
    135     @VisibleForTesting
    136     NetworkScoreManagerWrapper createNetworkScorerManagerWrapper(Context context) {
    137         return new NetworkScoreManagerWrapper(context.getSystemService(NetworkScoreManager.class));
    138     }
    139 }
    140