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 30 import com.android.internal.logging.nano.MetricsProto; 31 import com.android.settings.R; 32 import com.android.settings.core.InstrumentedPreferenceFragment; 33 import com.android.settings.widget.RadioButtonPreference; 34 35 import java.util.List; 36 37 /** 38 * Fragment for choosing default network scorer. 39 */ 40 public class NetworkScorerPicker extends InstrumentedPreferenceFragment implements 41 RadioButtonPreference.OnClickListener { 42 43 private NetworkScoreManager mNetworkScoreManager; 44 45 @Override getMetricsCategory()46 public int getMetricsCategory() { 47 return MetricsProto.MetricsEvent.SETTINGS_NETWORK_SCORER; 48 } 49 50 @Override onCreatePreferences(Bundle savedInstanceState, String rootKey)51 public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 52 super.onCreatePreferences(savedInstanceState, rootKey); 53 updateCandidates(); 54 } 55 56 @Override onAttach(Context context)57 public void onAttach(Context context) { 58 super.onAttach(context); 59 mNetworkScoreManager = createNetworkScorerManager(context); 60 } 61 62 @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)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 @Override getPreferenceScreenResId()72 protected int getPreferenceScreenResId() { 73 return R.xml.network_scorer_picker_prefs; 74 } 75 76 @VisibleForTesting updateCandidates()77 public void updateCandidates() { 78 final PreferenceScreen screen = getPreferenceScreen(); 79 screen.removeAll(); 80 81 final List<NetworkScorerAppData> scorers = mNetworkScoreManager.getAllValidScorers(); 82 final String defaultAppKey = getActiveScorerPackage(); 83 84 final RadioButtonPreference nonePref = new RadioButtonPreference(getPrefContext()); 85 nonePref.setTitle(R.string.network_scorer_picker_none_preference); 86 if (scorers.isEmpty()) { 87 nonePref.setChecked(true); 88 } else { 89 nonePref.setKey(null); 90 nonePref.setChecked(TextUtils.isEmpty(defaultAppKey)); 91 nonePref.setOnClickListener(this); 92 } 93 screen.addPreference(nonePref); 94 95 final int numScorers = scorers.size(); 96 for (int i = 0; i < numScorers; i++) { 97 final RadioButtonPreference pref = new RadioButtonPreference(getPrefContext()); 98 final NetworkScorerAppData appData = scorers.get(i); 99 final String appKey = appData.getRecommendationServicePackageName(); 100 pref.setTitle(appData.getRecommendationServiceLabel()); 101 pref.setKey(appKey); 102 pref.setChecked(TextUtils.equals(defaultAppKey, appKey)); 103 pref.setOnClickListener(this); 104 screen.addPreference(pref); 105 } 106 } 107 getActiveScorerPackage()108 private String getActiveScorerPackage() { 109 return mNetworkScoreManager.getActiveScorerPackage(); 110 } 111 setActiveScorer(String key)112 private boolean setActiveScorer(String key) { 113 if (!TextUtils.equals(key, getActiveScorerPackage())) { 114 return mNetworkScoreManager.setActiveScorer(key); 115 } 116 return false; 117 } 118 119 @Override onRadioButtonClicked(RadioButtonPreference selected)120 public void onRadioButtonClicked(RadioButtonPreference selected) { 121 final String selectedKey = selected.getKey(); 122 final boolean success = setActiveScorer(selectedKey); 123 if (success) { 124 updateCheckedState(selectedKey); 125 } 126 } 127 updateCheckedState(String selectedKey)128 private void updateCheckedState(String selectedKey) { 129 final PreferenceScreen screen = getPreferenceScreen(); 130 final int count = screen.getPreferenceCount(); 131 for (int i = 0; i < count; i++) { 132 final Preference pref = screen.getPreference(i); 133 if (pref instanceof RadioButtonPreference) { 134 final RadioButtonPreference radioPref = (RadioButtonPreference) pref; 135 radioPref.setChecked(TextUtils.equals(pref.getKey(), selectedKey)); 136 } 137 } 138 } 139 140 @VisibleForTesting createNetworkScorerManager(Context context)141 NetworkScoreManager createNetworkScorerManager(Context context) { 142 return (NetworkScoreManager) context.getSystemService(Context.NETWORK_SCORE_SERVICE); 143 } 144 } 145