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