• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.tv.settings.accessibility;
18 
19 import android.app.Fragment;
20 import android.content.ComponentName;
21 import android.content.Context;
22 import android.os.Bundle;
23 import android.support.annotation.NonNull;
24 import android.support.v17.leanback.app.GuidedStepFragment;
25 import android.support.v17.leanback.widget.GuidanceStylist;
26 import android.support.v17.leanback.widget.GuidedAction;
27 
28 import com.android.tv.settings.R;
29 
30 import java.util.List;
31 
32 /**
33  * Fragment for confirming [de]activation of accessibility service
34  */
35 public class AccessibilityServiceConfirmationFragment extends GuidedStepFragment {
36     private static final String ARG_LABEL = "label";
37     private static final String ARG_COMPONENT = "component";
38     private static final String ARG_ENABLING = "enabling";
39 
40     /**
41      * Callback for dialog completion
42      */
43     public interface OnAccessibilityServiceConfirmedListener {
44         /**
45          * Called when enabling/disabling was confirmed by the user, not called otherwise.
46          * @param componentName Service in question
47          * @param enabling True for enabling
48          */
onAccessibilityServiceConfirmed(ComponentName componentName, boolean enabling)49         void onAccessibilityServiceConfirmed(ComponentName componentName, boolean enabling);
50     }
51 
52     /**
53      * Create a new instance of the fragment
54      * @param cn Component of service
55      * @param label Human readable label
56      * @param enabling True for enabling
57      * @return new fragment instance
58      */
newInstance(ComponentName cn, CharSequence label, boolean enabling)59     public static AccessibilityServiceConfirmationFragment newInstance(ComponentName cn,
60             CharSequence label, boolean enabling) {
61         Bundle args = new Bundle(3);
62         prepareArgs(args, cn, label, enabling);
63         AccessibilityServiceConfirmationFragment fragment =
64                 new AccessibilityServiceConfirmationFragment();
65         fragment.setArguments(args);
66         return fragment;
67     }
68 
69     /**
70      * Put args in bundle
71      * @param args Bundle to prepare
72      * @param cn Component of service
73      * @param label Human readable label
74      * @param enabling True for enabling
75      */
prepareArgs(@onNull Bundle args, ComponentName cn, CharSequence label, boolean enabling)76     public static void prepareArgs(@NonNull Bundle args, ComponentName cn, CharSequence label,
77             boolean enabling) {
78         args.putParcelable(ARG_COMPONENT, cn);
79         args.putCharSequence(ARG_LABEL, label);
80         args.putBoolean(ARG_ENABLING, enabling);
81     }
82 
83     @NonNull
84     @Override
onCreateGuidance(Bundle savedInstanceState)85     public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
86         final CharSequence label = getArguments().getCharSequence(ARG_LABEL);
87         if (getArguments().getBoolean(ARG_ENABLING)) {
88             return new GuidanceStylist.Guidance(
89                     getString(R.string.system_accessibility_service_on_confirm_title,
90                             label),
91                     getString(R.string.system_accessibility_service_on_confirm_desc,
92                             label),
93                     null,
94                     getActivity().getDrawable(R.drawable.ic_accessibility_new_132dp)
95             );
96         } else {
97             return new GuidanceStylist.Guidance(
98                     getString(R.string.system_accessibility_service_off_confirm_title,
99                             label),
100                     getString(R.string.system_accessibility_service_off_confirm_desc,
101                             label),
102                     null,
103                     getActivity().getDrawable(R.drawable.ic_accessibility_new_132dp)
104             );
105         }
106     }
107 
108     @Override
onCreateActions(@onNull List<GuidedAction> actions, Bundle savedInstanceState)109     public void onCreateActions(@NonNull List<GuidedAction> actions,
110             Bundle savedInstanceState) {
111         final Context context = getActivity();
112         actions.add(new GuidedAction.Builder(context)
113                 .clickAction(GuidedAction.ACTION_ID_OK).build());
114         actions.add(new GuidedAction.Builder(context)
115                 .clickAction(GuidedAction.ACTION_ID_CANCEL).build());
116     }
117 
118     @Override
onGuidedActionClicked(GuidedAction action)119     public void onGuidedActionClicked(GuidedAction action) {
120         if (action.getId() == GuidedAction.ACTION_ID_OK) {
121             final ComponentName component = getArguments().getParcelable(ARG_COMPONENT);
122             final Fragment fragment = getTargetFragment();
123             final boolean enabling = getArguments().getBoolean(ARG_ENABLING);
124             if (fragment instanceof OnAccessibilityServiceConfirmedListener) {
125                 ((OnAccessibilityServiceConfirmedListener) fragment)
126                         .onAccessibilityServiceConfirmed(component, enabling);
127             } else {
128                 throw new IllegalStateException("Target fragment is not an "
129                         + "OnAccessibilityServiceConfirmedListener");
130             }
131             getFragmentManager().popBackStack();
132         } else if (action.getId() == GuidedAction.ACTION_ID_CANCEL) {
133             getFragmentManager().popBackStack();
134         } else {
135             super.onGuidedActionClicked(action);
136         }
137     }
138 }
139