14a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk/*
24a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk * Copyright (C) 2016 The Android Open Source Project
34a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk *
44a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
54a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk * except in compliance with the License. You may obtain a copy of the License at
64a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk *
74a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
84a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk *
94a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
104a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
114a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk * KIND, either express or implied. See the License for the specific language governing
124a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk * permissions and limitations under the License.
134a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk */
144a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk
154a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monkpackage com.android.settings.dashboard;
164a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk
174a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monkimport android.app.AutomaticZenRule;
18b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monkimport android.app.IWallpaperManager;
19b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monkimport android.app.IWallpaperManager.Stub;
20b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monkimport android.app.IWallpaperManagerCallback;
2162a7280cb8210958e2e23bbd72c4bd74285bb2a6Udam Sainiimport android.app.KeyguardManager;
224a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monkimport android.app.NotificationManager;
23672b51ba3bb0e8ae7c03af40d466c75ce0c9e1f0Christopher Tateimport android.app.WallpaperManager;
24c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishiimport android.app.admin.DevicePolicyManager;
254a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monkimport android.content.Context;
269d5c050ce0cb29f6a49dd818e39a9c06ddd9ee19Jason Monkimport android.hardware.fingerprint.FingerprintManager;
27b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monkimport android.os.Bundle;
28b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monkimport android.os.IBinder;
29b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monkimport android.os.RemoteException;
30b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monkimport android.os.ServiceManager;
31672b51ba3bb0e8ae7c03af40d466c75ce0c9e1f0Christopher Tate
32d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monkimport com.android.ims.ImsManager;
3362a7280cb8210958e2e23bbd72c4bd74285bb2a6Udam Sainiimport com.android.settings.Settings.FingerprintEnrollSuggestionActivity;
349d5c050ce0cb29f6a49dd818e39a9c06ddd9ee19Jason Monkimport com.android.settings.Settings.FingerprintSuggestionActivity;
3562a7280cb8210958e2e23bbd72c4bd74285bb2a6Udam Sainiimport com.android.settings.Settings.ScreenLockSuggestionActivity;
36d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monkimport com.android.settings.Settings.WifiCallingSuggestionActivity;
374a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monkimport com.android.settings.Settings.ZenModeAutomationSuggestionActivity;
380bf6f94c585de80be0fbbe5d870a32d21e32a258Sunny Goyalimport com.android.settings.WallpaperSuggestionActivity;
394a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monkimport com.android.settingslib.drawer.Tile;
404a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk
411d33d59be29c719f8003458373585397a781dc77Julia Reynoldsimport java.util.Collection;
424a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk
434a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk/**
444a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk * The Home of all stupidly dynamic Settings Suggestions checks.
454a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk */
464a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monkpublic class SuggestionsChecks {
474a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk
484a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk    private final Context mContext;
494a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk
504a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk    public SuggestionsChecks(Context context) {
514e8d3013a281e924b02172c90a52e21984f5d8b4Jason Monk        mContext = context.getApplicationContext();
524a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk    }
534a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk
544a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk    public boolean isSuggestionComplete(Tile suggestion) {
55b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        String className = suggestion.intent.getComponent().getClassName();
56b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        if (className.equals(ZenModeAutomationSuggestionActivity.class.getName())) {
574a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk            return hasEnabledZenAutoRules();
58b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        } else if (className.equals(WallpaperSuggestionActivity.class.getName())) {
59b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk            return hasWallpaperSet();
60d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monk        } else if (className.equals(WifiCallingSuggestionActivity.class.getName())) {
61d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monk            return isWifiCallingUnavailableOrEnabled();
629d5c050ce0cb29f6a49dd818e39a9c06ddd9ee19Jason Monk        } else if (className.equals(FingerprintSuggestionActivity.class.getName())) {
63c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi            return isNotSingleFingerprintEnrolled() || !isFingerprintEnabled();
64c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi        } else if (className.equals(ScreenLockSuggestionActivity.class.getName())) {
6562a7280cb8210958e2e23bbd72c4bd74285bb2a6Udam Saini            return isDeviceSecured();
66c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi        } else if (className.equals(FingerprintEnrollSuggestionActivity.class.getName())) {
67c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi            return isDeviceSecured() || !isFingerprintEnabled();
684a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk        }
694a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk        return false;
704a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk    }
714a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk
7262a7280cb8210958e2e23bbd72c4bd74285bb2a6Udam Saini    private boolean isDeviceSecured() {
7362a7280cb8210958e2e23bbd72c4bd74285bb2a6Udam Saini        KeyguardManager km = mContext.getSystemService(KeyguardManager.class);
7462a7280cb8210958e2e23bbd72c4bd74285bb2a6Udam Saini        return km.isKeyguardSecure();
7562a7280cb8210958e2e23bbd72c4bd74285bb2a6Udam Saini    }
7662a7280cb8210958e2e23bbd72c4bd74285bb2a6Udam Saini
779d5c050ce0cb29f6a49dd818e39a9c06ddd9ee19Jason Monk    private boolean isNotSingleFingerprintEnrolled() {
789d5c050ce0cb29f6a49dd818e39a9c06ddd9ee19Jason Monk        FingerprintManager manager = mContext.getSystemService(FingerprintManager.class);
799d5c050ce0cb29f6a49dd818e39a9c06ddd9ee19Jason Monk        return manager == null || manager.getEnrolledFingerprints().size() != 1;
809d5c050ce0cb29f6a49dd818e39a9c06ddd9ee19Jason Monk    }
819d5c050ce0cb29f6a49dd818e39a9c06ddd9ee19Jason Monk
82d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monk    public boolean isWifiCallingUnavailableOrEnabled() {
83e2f59b90ad21ecc07a584a06575a4c4ba75e1eb6Pavel Zhamaitsiak        if (!ImsManager.isWfcEnabledByPlatform(mContext) ||
84e2f59b90ad21ecc07a584a06575a4c4ba75e1eb6Pavel Zhamaitsiak                !ImsManager.isWfcProvisionedOnDevice(mContext)) {
85d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monk            return true;
86d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monk        }
87d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monk        return ImsManager.isWfcEnabledByUser(mContext)
88d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monk                && ImsManager.isNonTtyOrTtyOnVolteEnabled(mContext);
89d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monk    }
90d3ac239e32ee20158d06c33d89c67f5d56f23285Jason Monk
914a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk    private boolean hasEnabledZenAutoRules() {
921d33d59be29c719f8003458373585397a781dc77Julia Reynolds        Collection<AutomaticZenRule> zenRules =
931d33d59be29c719f8003458373585397a781dc77Julia Reynolds                NotificationManager.from(mContext).getAutomaticZenRules().values();
941d33d59be29c719f8003458373585397a781dc77Julia Reynolds        for (AutomaticZenRule rule : zenRules) {
951d33d59be29c719f8003458373585397a781dc77Julia Reynolds            if (rule.isEnabled()) {
964a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk                return true;
974a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk            }
984a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk        }
994a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk        return false;
1004a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk    }
1014a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk
102b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk    private boolean hasWallpaperSet() {
103b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        IBinder b = ServiceManager.getService(Context.WALLPAPER_SERVICE);
104b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        IWallpaperManager service = Stub.asInterface(b);
105b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        try {
1062c5a27dc7ac719a0b0c8a7c68bf86910420f0fdaTony Mak            return !service.isSetWallpaperAllowed(mContext.getOpPackageName()) ||
1072c5a27dc7ac719a0b0c8a7c68bf86910420f0fdaTony Mak                    service.getWallpaper(mCallback, WallpaperManager.FLAG_SYSTEM,
1082c5a27dc7ac719a0b0c8a7c68bf86910420f0fdaTony Mak                            new Bundle(), mContext.getUserId()) != null;
109b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        } catch (RemoteException e) {
110b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        }
111b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        return false;
112b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk    }
113b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk
114c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi    private boolean isFingerprintEnabled() {
115c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi        DevicePolicyManager dpManager =
116c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi                (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
117c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi        final int dpmFlags = dpManager.getKeyguardDisabledFeatures(null, /* admin */
118c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi                mContext.getUserId());
119c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi        return (dpmFlags & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) == 0;
120c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi    }
121c9ec8c80bca31c175076bc1f719f5c4fb44d14b1Daniel Nishi
122b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk    private final IWallpaperManagerCallback mCallback = new IWallpaperManagerCallback.Stub() {
123b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        @Override
124b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        public void onWallpaperChanged() throws RemoteException {
125b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk             // Don't care.
126b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk        }
127b9e5d238b64abf3a45f148b43b8d8fcca912d976Jason Monk    };
1284a60c8876e0960ce1c7dfa7cbcf5eb07f2f701aaJason Monk}
129