• 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.settings.applications.defaultapps;
18 
19 import android.app.Activity;
20 import android.app.AlertDialog;
21 import android.app.Dialog;
22 import android.app.DialogFragment;
23 import android.app.Fragment;
24 import android.content.Context;
25 import android.content.DialogInterface;
26 import android.os.Bundle;
27 import android.text.TextUtils;
28 import android.util.Pair;
29 
30 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
31 import com.android.settings.R;
32 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
33 import com.android.settings.widget.RadioButtonPickerFragment;
34 import com.android.settings.widget.RadioButtonPreference;
35 import com.android.settingslib.applications.DefaultAppInfo;
36 import com.android.settingslib.widget.CandidateInfo;
37 import com.android.settingslib.wrapper.PackageManagerWrapper;
38 
39 /**
40  * A generic app picker fragment that shows a list of app as radio button group.
41  */
42 public abstract class DefaultAppPickerFragment extends RadioButtonPickerFragment {
43 
44     protected PackageManagerWrapper mPm;
45 
46     @Override
onAttach(Context context)47     public void onAttach(Context context) {
48         super.onAttach(context);
49         mPm = new PackageManagerWrapper(context.getPackageManager());
50     }
51 
52     @Override
onRadioButtonClicked(RadioButtonPreference selected)53     public void onRadioButtonClicked(RadioButtonPreference selected) {
54         final String selectedKey = selected.getKey();
55         final CharSequence confirmationMessage = getConfirmationMessage(getCandidate(selectedKey));
56         final Activity activity = getActivity();
57         if (TextUtils.isEmpty(confirmationMessage)) {
58             super.onRadioButtonClicked(selected);
59         } else if (activity != null) {
60             final DialogFragment fragment =
61                     newConfirmationDialogFragment(selectedKey, confirmationMessage);
62             fragment.show(activity.getFragmentManager(), ConfirmationDialogFragment.TAG);
63         }
64     }
65 
66     @Override
onRadioButtonConfirmed(String selectedKey)67     protected void onRadioButtonConfirmed(String selectedKey) {
68         mMetricsFeatureProvider.action(getContext(),
69                 MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP,
70                 selectedKey,
71                 Pair.create(MetricsEvent.FIELD_CONTEXT, getMetricsCategory()));
72 
73         super.onRadioButtonConfirmed(selectedKey);
74     }
75 
76     @Override
bindPreferenceExtra(RadioButtonPreference pref, String key, CandidateInfo info, String defaultKey, String systemDefaultKey)77     public void bindPreferenceExtra(RadioButtonPreference pref,
78             String key, CandidateInfo info, String defaultKey, String systemDefaultKey) {
79         if (!(info instanceof DefaultAppInfo)) {
80             return;
81         }
82         if (TextUtils.equals(systemDefaultKey, key)) {
83             pref.setSummary(R.string.system_app);
84         } else if (!TextUtils.isEmpty(((DefaultAppInfo) info).summary)) {
85             pref.setSummary(((DefaultAppInfo) info).summary);
86         }
87     }
88 
newConfirmationDialogFragment(String selectedKey, CharSequence confirmationMessage)89     protected ConfirmationDialogFragment newConfirmationDialogFragment(String selectedKey,
90             CharSequence confirmationMessage) {
91         final ConfirmationDialogFragment fragment = new ConfirmationDialogFragment();
92         fragment.init(this, selectedKey, confirmationMessage);
93         return fragment;
94     }
95 
getConfirmationMessage(CandidateInfo info)96     protected CharSequence getConfirmationMessage(CandidateInfo info) {
97         return null;
98     }
99 
100     public static class ConfirmationDialogFragment extends InstrumentedDialogFragment
101             implements DialogInterface.OnClickListener {
102 
103         public static final String TAG = "DefaultAppConfirm";
104         public static final String EXTRA_KEY = "extra_key";
105         public static final String EXTRA_MESSAGE = "extra_message";
106 
107         private DialogInterface.OnClickListener mCancelListener;
108 
109         @Override
getMetricsCategory()110         public int getMetricsCategory() {
111             return MetricsEvent.DEFAULT_APP_PICKER_CONFIRMATION_DIALOG;
112         }
113 
114         /**
115          * Initializes the fragment.
116          *
117          * <p>Should be called after it's constructed.
118          */
init(DefaultAppPickerFragment parent, String key, CharSequence message)119         public void init(DefaultAppPickerFragment parent, String key, CharSequence message) {
120             final Bundle argument = new Bundle();
121             argument.putString(EXTRA_KEY, key);
122             argument.putCharSequence(EXTRA_MESSAGE, message);
123             setArguments(argument);
124             setTargetFragment(parent, 0);
125         }
126 
127         // TODO: add test case for cancelListener
setCancelListener(DialogInterface.OnClickListener cancelListener)128         public void setCancelListener(DialogInterface.OnClickListener cancelListener) {
129             this.mCancelListener = cancelListener;
130         }
131 
132         @Override
onCreateDialog(Bundle savedInstanceState)133         public Dialog onCreateDialog(Bundle savedInstanceState) {
134             final Bundle bundle = getArguments();
135             final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
136                     .setMessage(bundle.getCharSequence(EXTRA_MESSAGE))
137                     .setPositiveButton(android.R.string.ok, this)
138                     .setNegativeButton(android.R.string.cancel, mCancelListener);
139             return builder.create();
140         }
141 
142         @Override
onClick(DialogInterface dialog, int which)143         public void onClick(DialogInterface dialog, int which) {
144             final Fragment fragment = getTargetFragment();
145             if (fragment instanceof DefaultAppPickerFragment) {
146                 final Bundle bundle = getArguments();
147                 ((DefaultAppPickerFragment) fragment).onRadioButtonConfirmed(
148                         bundle.getString(EXTRA_KEY));
149             }
150         }
151     }
152 }
153