• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.deskclock;
2 
3 import android.annotation.TargetApi;
4 import android.content.Context;
5 import android.content.res.TypedArray;
6 import android.graphics.Color;
7 import android.graphics.drawable.Drawable;
8 import android.os.Build;
9 import android.util.AttributeSet;
10 import android.widget.NumberPicker;
11 
12 import java.lang.reflect.Field;
13 
14 /**
15  * Subclass of NumberPicker that allows customizing divider color.
16  */
17 public class NumberPickerCompat extends NumberPicker {
18 
19     private static Field sSelectionDivider;
20     private static boolean sTrySelectionDivider = true;
21 
NumberPickerCompat(Context context)22     public NumberPickerCompat(Context context) {
23         this(context, null /* attrs */);
24     }
25 
NumberPickerCompat(Context context, AttributeSet attrs)26     public NumberPickerCompat(Context context, AttributeSet attrs) {
27         super(context, attrs);
28         tintSelectionDivider(context);
29     }
30 
NumberPickerCompat(Context context, AttributeSet attrs, int defStyleAttr)31     public NumberPickerCompat(Context context, AttributeSet attrs, int defStyleAttr) {
32         super(context, attrs, defStyleAttr);
33         tintSelectionDivider(context);
34     }
35 
36     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
tintSelectionDivider(Context context)37     private void tintSelectionDivider(Context context) {
38         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP
39                 || Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
40             // Accent color in KK will stay system blue, so leave divider color matching.
41             // The divider is correctly tinted to controlColorNormal in M.
42             return;
43         }
44 
45         if (sTrySelectionDivider) {
46             final TypedArray a = context.obtainStyledAttributes(
47                     new int[] { android.R.attr.colorControlNormal });
48              // White is default color if colorControlNormal is not defined.
49             final int color = a.getColor(0, Color.WHITE);
50             a.recycle();
51 
52             try {
53                 if (sSelectionDivider == null) {
54                     sSelectionDivider = NumberPicker.class.getDeclaredField("mSelectionDivider");
55                     sSelectionDivider.setAccessible(true);
56                 }
57                 final Drawable selectionDivider = (Drawable) sSelectionDivider.get(this);
58                 if (selectionDivider != null) {
59                     // setTint is API21+, but this will only be called in API21
60                     selectionDivider.setTint(color);
61                 }
62             } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
63                 LogUtils.e("Unable to set selection divider", e);
64                 sTrySelectionDivider = false;
65             }
66         }
67     }
68 
69 }
70