56
56
import android .preference .Preference .OnPreferenceChangeListener ;
57
57
import android .preference .PreferenceCategory ;
58
58
import android .preference .PreferenceFragment ;
59
+ import android .preference .PreferenceGroup ;
59
60
import android .preference .PreferenceScreen ;
60
61
import android .preference .RingtonePreference ;
61
62
import android .preference .SwitchPreference ;
63
+ import android .text .TextUtils .TruncateAt ;
62
64
import android .text .method .LinkMovementMethod ;
63
65
import android .util .Log ;
64
66
import android .util .TypedValue ;
65
67
import android .view .Display ;
68
+ import android .view .Menu ;
69
+ import android .view .MenuInflater ;
70
+ import android .view .MenuItem ;
71
+ import android .view .MenuItem .OnMenuItemClickListener ;
72
+ import android .widget .SearchView ;
73
+ import android .widget .SearchView .OnQueryTextListener ;
66
74
import android .widget .TextView ;
67
75
import android .widget .Toast ;
68
76
import android .Manifest .permission ;
@@ -1072,6 +1080,9 @@ public SystemProperties(Bundle data) {
1072
1080
public static SystemProperties sSystemProperties ;
1073
1081
private Dialog mAlertDialog ;
1074
1082
private ProgressDialog mProgressDialog ;
1083
+ private String mSearchQuery ;
1084
+ private PrefsFragment mPrefsFragment ;
1085
+
1075
1086
private Runnable mGetSystemPropertiesTimeout = new Runnable () {
1076
1087
@ Override
1077
1088
public void run () {
@@ -1095,6 +1106,14 @@ public void onClick(DialogInterface dialog, int which) {
1095
1106
protected void onCreate (Bundle savedInstanceState ) {
1096
1107
super .onCreate (savedInstanceState );
1097
1108
1109
+ if (savedInstanceState != null ) {
1110
+ mSearchQuery = savedInstanceState .getString ("mSearchQuery" , null );
1111
+ mPrefsFragment = (PrefsFragment ) getFragmentManager ().getFragment (savedInstanceState , "mPrefsFragment" );
1112
+ if (mPrefsFragment != null ) {
1113
+ mPrefsFragment .setSearchQuery (mSearchQuery );
1114
+ }
1115
+ }
1116
+
1098
1117
// fix folder permissions
1099
1118
SettingsManager .getInstance (this ).fixFolderPermissionsAsync ();
1100
1119
@@ -1127,7 +1146,7 @@ public void onClick(DialogInterface dialog, int which) {
1127
1146
return ;
1128
1147
}
1129
1148
1130
- if (savedInstanceState == null || sSystemProperties == null ) {
1149
+ if (savedInstanceState == null || sSystemProperties == null || mPrefsFragment == null ) {
1131
1150
mReceiver = new GravityBoxResultReceiver (new Handler ());
1132
1151
mReceiver .setReceiver (this );
1133
1152
Intent intent = new Intent ();
@@ -1158,6 +1177,79 @@ protected void onDestroy() {
1158
1177
super .onDestroy ();
1159
1178
}
1160
1179
1180
+ @ Override
1181
+ public void onSaveInstanceState (Bundle bundle ) {
1182
+ bundle .putString ("mSearchQuery" , mSearchQuery );
1183
+ getFragmentManager ().putFragment (bundle , "mPrefsFragment" , mPrefsFragment );
1184
+ super .onSaveInstanceState (bundle );
1185
+ }
1186
+
1187
+ @ Override
1188
+ public boolean onCreateOptionsMenu (Menu menu ) {
1189
+ MenuInflater inflater = getMenuInflater ();
1190
+ inflater .inflate (R .menu .settings_menu , menu );
1191
+
1192
+ final MenuItem search = menu .findItem (R .id .search );
1193
+ final SearchView searchView = (SearchView ) search .getActionView ();
1194
+ final MenuItem searchKeyword = menu .findItem (R .id .searchKeyword );
1195
+ final TextView searchKeywordView = (TextView ) searchKeyword .getActionView ();
1196
+ final MenuItem searchReset = menu .findItem (R .id .searchReset );
1197
+
1198
+ searchView .setOnQueryTextListener (new OnQueryTextListener () {
1199
+ @ Override
1200
+ public boolean onQueryTextChange (String text ) {
1201
+ return false ;
1202
+ }
1203
+ @ Override
1204
+ public boolean onQueryTextSubmit (String text ) {
1205
+ if (text .trim ().length () < 3 ) {
1206
+ Toast .makeText (GravityBoxSettings .this ,
1207
+ R .string .search_keyword_short , Toast .LENGTH_SHORT ).show ();
1208
+ } else {
1209
+ mSearchQuery = text .trim ();
1210
+ searchView .clearFocus ();
1211
+ search .collapseActionView ();
1212
+ search .setVisible (false );
1213
+ searchReset .setVisible (true );
1214
+ searchKeyword .setVisible (true );
1215
+ searchKeywordView .setText (mSearchQuery );
1216
+ mPrefsFragment .filterPreferences (mSearchQuery );
1217
+ }
1218
+ return true ;
1219
+ }
1220
+ });
1221
+
1222
+ searchReset .setOnMenuItemClickListener (new OnMenuItemClickListener () {
1223
+ @ Override
1224
+ public boolean onMenuItemClick (MenuItem item ) {
1225
+ mSearchQuery = null ;
1226
+ search .setVisible (true );
1227
+ searchReset .setVisible (false );
1228
+ searchKeyword .setVisible (false );
1229
+ searchKeywordView .setText (null );
1230
+ mPrefsFragment = new PrefsFragment ();
1231
+ getFragmentManager ().beginTransaction ().replace (android .R .id .content , mPrefsFragment ).commit ();
1232
+ return true ;
1233
+ }
1234
+ });
1235
+
1236
+ searchKeywordView .setSingleLine (true );
1237
+ searchKeywordView .setEllipsize (TruncateAt .END );
1238
+ Point size = new Point ();
1239
+ getWindowManager ().getDefaultDisplay ().getSize (size );
1240
+ searchKeywordView .setMaxWidth (size .x / 3 );
1241
+
1242
+ if (mSearchQuery != null ) {
1243
+ searchReset .setVisible (true );
1244
+ searchKeyword .setVisible (true );
1245
+ searchKeywordView .setText (mSearchQuery );
1246
+ } else {
1247
+ search .setVisible (true );
1248
+ }
1249
+
1250
+ return true ;
1251
+ }
1252
+
1161
1253
@ Override
1162
1254
public void onReceiveResult (int resultCode , Bundle resultData ) {
1163
1255
if (mHandler != null ) {
@@ -1168,7 +1260,9 @@ public void onReceiveResult(int resultCode, Bundle resultData) {
1168
1260
Log .d ("GravityBox" , "result received: resultCode=" + resultCode );
1169
1261
if (resultCode == SystemPropertyProvider .RESULT_SYSTEM_PROPERTIES ) {
1170
1262
sSystemProperties = new SystemProperties (resultData );
1171
- getFragmentManager ().beginTransaction ().replace (android .R .id .content , new PrefsFragment ()).commit ();
1263
+ mPrefsFragment = new PrefsFragment ();
1264
+ mPrefsFragment .setSearchQuery (mSearchQuery );
1265
+ getFragmentManager ().beginTransaction ().replace (android .R .id .content , mPrefsFragment ).commit ();
1172
1266
} else {
1173
1267
finish ();
1174
1268
}
@@ -1350,6 +1444,7 @@ public static class PrefsFragment extends PreferenceFragment
1350
1444
//private PreferenceScreen mPrefCatCellTile;
1351
1445
private ListPreference mPrefBatteryTileTempUnit ;
1352
1446
private EditTextPreference mPrefPowerCameraVp ;
1447
+ private String mSearchQuery ;
1353
1448
1354
1449
@ Override
1355
1450
public void onCreate (Bundle savedInstanceState ) {
@@ -1877,6 +1972,52 @@ public void onCreate(Bundle savedInstanceState) {
1877
1972
checkPermissions ();
1878
1973
}
1879
1974
1975
+ protected void setSearchQuery (String query ) {
1976
+ mSearchQuery = query ;
1977
+ }
1978
+
1979
+ protected void filterPreferences () {
1980
+ filterPreferences (mSearchQuery );
1981
+ }
1982
+
1983
+ protected void filterPreferences (String query ) {
1984
+ setSearchQuery (query );
1985
+ if (filterPreferencesInternal (getPreferenceScreen (), null ) == 0 ) {
1986
+ Toast .makeText (getActivity (), R .string .search_no_match ,
1987
+ Toast .LENGTH_SHORT ).show ();
1988
+ }
1989
+ }
1990
+
1991
+ private int filterPreferencesInternal (PreferenceGroup prefGroup , PreferenceGroup parentGroup ) {
1992
+ if (mSearchQuery == null ) return -1 ;
1993
+
1994
+ final int count = prefGroup .getPreferenceCount ();
1995
+
1996
+ int matchCount = 0 ;
1997
+ for (int i = count -1 ; i >= 0 ; i --) {
1998
+ Preference p = prefGroup .getPreference (i );
1999
+ p .setDependency (null );
2000
+ if (p instanceof PreferenceGroup && p .getIntent () == null ) {
2001
+ matchCount += filterPreferencesInternal ((PreferenceGroup )p , prefGroup );
2002
+ } else {
2003
+ String title = (p .getTitle () == null ? "null" :
2004
+ p .getTitle ().toString ()).toLowerCase (Locale .getDefault ());
2005
+ String summary = (p .getSummary () == null ? "null" :
2006
+ p .getSummary ().toString ()).toLowerCase (Locale .getDefault ());
2007
+ if (p .isEnabled () && (title .contains (mSearchQuery ) || summary .contains (mSearchQuery ))) {
2008
+ matchCount ++;
2009
+ } else {
2010
+ prefGroup .removePreference (p );
2011
+ }
2012
+ }
2013
+ }
2014
+ if (parentGroup != null && matchCount == 0 && prefGroup .getIntent () == null ) {
2015
+ parentGroup .removePreference (prefGroup );
2016
+ }
2017
+
2018
+ return matchCount ;
2019
+ }
2020
+
1880
2021
private void initFingerprintLauncher () {
1881
2022
PreferenceCategory catFingers = (PreferenceCategory ) findPreference (
1882
2023
PREF_CAT_KEY_FINGERPRINT_LAUNCHER_FINGERS );
@@ -2003,6 +2144,7 @@ public void onStart() {
2003
2144
super .onStart ();
2004
2145
mPrefs .registerOnSharedPreferenceChangeListener (this );
2005
2146
updatePreferences (null );
2147
+ filterPreferences ();
2006
2148
}
2007
2149
2008
2150
@ Override
@@ -2264,7 +2406,7 @@ private void updatePreferences(String key) {
2264
2406
if (key == null || key .equals (PREF_KEY_VOLUME_ROCKER_WAKE )) {
2265
2407
mPrefVolumeRockerWake .setSummary (mPrefVolumeRockerWake .getEntry ());
2266
2408
Preference p = findPreference (PREF_KEY_VOLUME_ROCKER_WAKE_ALLOW_MUSIC );
2267
- p .setEnabled ("enabled" .equals (mPrefVolumeRockerWake .getValue ()));
2409
+ if ( p != null ) p .setEnabled ("enabled" .equals (mPrefVolumeRockerWake .getValue ()));
2268
2410
}
2269
2411
2270
2412
if (key == null || key .equals (PREF_KEY_DATA_TRAFFIC_OMNI_MODE )) {
@@ -2407,15 +2549,17 @@ private void updatePreferences(String key) {
2407
2549
key .equals (PREF_KEY_LOCKSCREEN_DIRECT_UNLOCK_POLICY )) {
2408
2550
ListPreference du = (ListPreference ) findPreference (PREF_KEY_LOCKSCREEN_DIRECT_UNLOCK );
2409
2551
ListPreference dup = (ListPreference ) findPreference (PREF_KEY_LOCKSCREEN_DIRECT_UNLOCK_POLICY );
2410
- dup .setEnabled (!"OFF" .equals (du .getValue ()));
2411
- dup .setSummary (dup .getEntry ());
2412
- Preference p = findPreference (PREF_KEY_LOCKSCREEN_DIRECT_UNLOCK_TRANS_LEVEL );
2413
- if (p != null ) p .setEnabled ("SEE_THROUGH" .equals (du .getValue ()));
2552
+ if (du != null && dup != null ) {
2553
+ dup .setEnabled (!"OFF" .equals (du .getValue ()));
2554
+ dup .setSummary (dup .getEntry ());
2555
+ Preference p = findPreference (PREF_KEY_LOCKSCREEN_DIRECT_UNLOCK_TRANS_LEVEL );
2556
+ if (p != null ) p .setEnabled ("SEE_THROUGH" .equals (du .getValue ()));
2557
+ }
2414
2558
}
2415
2559
2416
2560
if (key == null || key .equals (PREF_KEY_LOCKSCREEN_SMART_UNLOCK_POLICY )) {
2417
2561
ListPreference sup = (ListPreference ) findPreference (PREF_KEY_LOCKSCREEN_SMART_UNLOCK_POLICY );
2418
- sup .setSummary (sup .getEntry ());
2562
+ if ( sup != null ) sup .setSummary (sup .getEntry ());
2419
2563
}
2420
2564
2421
2565
if (key == null || key .equals (PREF_KEY_LOCKSCREEN_IMPRINT_MODE )) {
@@ -2428,7 +2572,7 @@ private void updatePreferences(String key) {
2428
2572
if (p != null ) {
2429
2573
p .setSummary (p .getEntry ());
2430
2574
Preference dp = findPreference (PREF_KEY_DND_TILE_DURATION );
2431
- dp .setEnabled (p .isEnabled () && "CUSTOM" .equals (p .getValue ()));
2575
+ if ( dp != null ) dp .setEnabled (p .isEnabled () && "CUSTOM" .equals (p .getValue ()));
2432
2576
}
2433
2577
}
2434
2578
@@ -2459,15 +2603,16 @@ private void updatePreferences(String key) {
2459
2603
if (key == null || key .equals (PREF_KEY_NAVBAR_CUSTOM_KEY_ICON_STYLE ) ||
2460
2604
key .equals (PREF_KEY_NAVBAR_CUSTOM_KEY_ENABLE )) {
2461
2605
ListPreference p = (ListPreference ) findPreference (PREF_KEY_NAVBAR_CUSTOM_KEY_ICON_STYLE );
2462
- p .setSummary (p .getEntry ());
2606
+ if ( p != null ) p .setSummary (p .getEntry ());
2463
2607
Preference p2 = findPreference (PREF_KEY_NAVBAR_CUSTOM_KEY_IMAGE );
2464
- p2 .setEnabled (mPrefs .getBoolean (PREF_KEY_NAVBAR_CUSTOM_KEY_ENABLE , false ) &&
2608
+ if (p != null && p2 != null )
2609
+ p2 .setEnabled (mPrefs .getBoolean (PREF_KEY_NAVBAR_CUSTOM_KEY_ENABLE , false ) &&
2465
2610
"CUSTOM" .equals (p .getValue ()));
2466
2611
}
2467
2612
2468
2613
if (key == null || key .equals (PREF_KEY_FORCE_AOSP )) {
2469
2614
CheckBoxPreference p = (CheckBoxPreference ) findPreference (PREF_KEY_FORCE_AOSP );
2470
- p .setChecked (Utils .isAospForced ());
2615
+ if ( p != null ) p .setChecked (Utils .isAospForced ());
2471
2616
}
2472
2617
2473
2618
if (key == null || key .equals (PREF_KEY_LOCKSCREEN_BOTTOM_ACTIONS_HIDE )) {
@@ -2490,16 +2635,18 @@ private void updatePreferences(String key) {
2490
2635
2491
2636
if (key == null || key .equals (PREF_KEY_QS_LOCKED_TILE_INDICATOR )) {
2492
2637
ListPreference p = (ListPreference ) findPreference (PREF_KEY_QS_LOCKED_TILE_INDICATOR );
2493
- p .setSummary (p .getEntry ());
2638
+ if ( p != null ) p .setSummary (p .getEntry ());
2494
2639
}
2495
2640
2496
2641
if (key == null || key .equals (PREF_KEY_APP_LAUNCHER_THEME )) {
2497
2642
ListPreference p = (ListPreference ) findPreference (PREF_KEY_APP_LAUNCHER_THEME );
2498
- p .setSummary (p .getEntry ());
2643
+ if ( p != null ) p .setSummary (p .getEntry ());
2499
2644
}
2500
2645
2501
2646
for (String caKey : customAppKeys ) {
2502
2647
ListPreference caPref = (ListPreference ) findPreference (caKey );
2648
+ if (caPref == null )
2649
+ continue ;
2503
2650
if ((caKey + "_custom" ).equals (key ) && mPrefCustomApp .getValue () != null ) {
2504
2651
caPref .setSummary (mPrefCustomApp .getSummary ());
2505
2652
Intent intent = new Intent (ACTION_PREF_HWKEY_CHANGED );
@@ -2523,6 +2670,8 @@ private void updatePreferences(String key) {
2523
2670
2524
2671
for (String rtKey : ringToneKeys ) {
2525
2672
RingtonePreference rtPref = (RingtonePreference ) findPreference (rtKey );
2673
+ if (rtPref == null )
2674
+ continue ;
2526
2675
String val = mPrefs .getString (rtKey , null );
2527
2676
if (val != null && !val .isEmpty ()) {
2528
2677
if (rtKey .equals (PREF_KEY_CHARGER_PLUGGED_SOUND_WIRELESS ) &&
0 commit comments