14d48e820ac6d77dea33df9b5c432100345266972Tony Mantler/* 24d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * Copyright (C) 2015 The Android Open Source Project 34d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * 44d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 54d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * you may not use this file except in compliance with the License. 64d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * You may obtain a copy of the License at 74d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * 84d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * http://www.apache.org/licenses/LICENSE-2.0 94d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * 104d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * Unless required by applicable law or agreed to in writing, software 114d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 124d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * See the License for the specific language governing permissions and 144d48e820ac6d77dea33df9b5c432100345266972Tony Mantler * limitations under the License 154d48e820ac6d77dea33df9b5c432100345266972Tony Mantler */ 164d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 174d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerpackage com.android.tv.settings.device.apps; 184d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 194d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.app.Activity; 204d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.app.ActivityManager; 214d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.app.admin.DevicePolicyManager; 224d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.content.BroadcastReceiver; 234d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.content.Context; 244d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.content.Intent; 254d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.content.pm.ApplicationInfo; 264d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.net.Uri; 274d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.os.Bundle; 284d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.os.UserHandle; 294d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.support.annotation.NonNull; 304d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport android.support.v17.leanback.widget.GuidanceStylist; 314d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 324d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport com.android.settingslib.applications.ApplicationsState; 334d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerimport com.android.tv.settings.R; 344d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 354d48e820ac6d77dea33df9b5c432100345266972Tony Mantlerpublic class ForceStopPreference extends AppActionPreference { 364d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 374d48e820ac6d77dea33df9b5c432100345266972Tony Mantler public ForceStopPreference(Context context, ApplicationsState.AppEntry entry) { 384d48e820ac6d77dea33df9b5c432100345266972Tony Mantler super(context, entry); 394d48e820ac6d77dea33df9b5c432100345266972Tony Mantler ConfirmationFragment.prepareArgs(getExtras(), mEntry.info.packageName); 404d48e820ac6d77dea33df9b5c432100345266972Tony Mantler refresh(); 414d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } 424d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 434d48e820ac6d77dea33df9b5c432100345266972Tony Mantler public void refresh() { 444d48e820ac6d77dea33df9b5c432100345266972Tony Mantler setTitle(R.string.device_apps_app_management_force_stop); 454d48e820ac6d77dea33df9b5c432100345266972Tony Mantler DevicePolicyManager dpm = (DevicePolicyManager) getContext().getSystemService( 464d48e820ac6d77dea33df9b5c432100345266972Tony Mantler Context.DEVICE_POLICY_SERVICE); 474d48e820ac6d77dea33df9b5c432100345266972Tony Mantler if (dpm.packageHasActiveAdmins(mEntry.info.packageName)) { 484d48e820ac6d77dea33df9b5c432100345266972Tony Mantler // User can't force stop device admin. 494d48e820ac6d77dea33df9b5c432100345266972Tony Mantler setVisible(false); 504d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } else if ((mEntry.info.flags & ApplicationInfo.FLAG_STOPPED) == 0) { 514d48e820ac6d77dea33df9b5c432100345266972Tony Mantler // If the app isn't explicitly stopped, then always show the 524d48e820ac6d77dea33df9b5c432100345266972Tony Mantler // force stop action. 534d48e820ac6d77dea33df9b5c432100345266972Tony Mantler setVisible(true); 544d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } else { 554d48e820ac6d77dea33df9b5c432100345266972Tony Mantler Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 564d48e820ac6d77dea33df9b5c432100345266972Tony Mantler Uri.fromParts("package", mEntry.info.packageName, null)); 574d48e820ac6d77dea33df9b5c432100345266972Tony Mantler intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { 584d48e820ac6d77dea33df9b5c432100345266972Tony Mantler mEntry.info.packageName }); 594d48e820ac6d77dea33df9b5c432100345266972Tony Mantler intent.putExtra(Intent.EXTRA_UID, mEntry.info.uid); 604d48e820ac6d77dea33df9b5c432100345266972Tony Mantler intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mEntry.info.uid)); 614d48e820ac6d77dea33df9b5c432100345266972Tony Mantler getContext().sendOrderedBroadcast(intent, null, new BroadcastReceiver() { 624d48e820ac6d77dea33df9b5c432100345266972Tony Mantler @Override 634d48e820ac6d77dea33df9b5c432100345266972Tony Mantler public void onReceive(Context context, Intent intent) { 644d48e820ac6d77dea33df9b5c432100345266972Tony Mantler setVisible(getResultCode() != Activity.RESULT_CANCELED); 654d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } 664d48e820ac6d77dea33df9b5c432100345266972Tony Mantler }, null, Activity.RESULT_CANCELED, null, null); 674d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } 684d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } 694d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 704d48e820ac6d77dea33df9b5c432100345266972Tony Mantler @Override 714d48e820ac6d77dea33df9b5c432100345266972Tony Mantler public String getFragment() { 724d48e820ac6d77dea33df9b5c432100345266972Tony Mantler return ConfirmationFragment.class.getName(); 734d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } 744d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 754d48e820ac6d77dea33df9b5c432100345266972Tony Mantler public static class ConfirmationFragment extends AppActionPreference.ConfirmationFragment { 764d48e820ac6d77dea33df9b5c432100345266972Tony Mantler private static final String ARG_PACKAGE_NAME = "packageName"; 774d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 784d48e820ac6d77dea33df9b5c432100345266972Tony Mantler private static void prepareArgs(@NonNull Bundle args, String packageName) { 794d48e820ac6d77dea33df9b5c432100345266972Tony Mantler args.putString(ARG_PACKAGE_NAME, packageName); 804d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } 814d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 824d48e820ac6d77dea33df9b5c432100345266972Tony Mantler @NonNull 834d48e820ac6d77dea33df9b5c432100345266972Tony Mantler @Override 844d48e820ac6d77dea33df9b5c432100345266972Tony Mantler public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { 854d48e820ac6d77dea33df9b5c432100345266972Tony Mantler final AppManagementFragment fragment = (AppManagementFragment) getTargetFragment(); 864d48e820ac6d77dea33df9b5c432100345266972Tony Mantler return new GuidanceStylist.Guidance( 874d48e820ac6d77dea33df9b5c432100345266972Tony Mantler getString(R.string.device_apps_app_management_force_stop), 884d48e820ac6d77dea33df9b5c432100345266972Tony Mantler getString(R.string.device_apps_app_management_force_stop_desc), 894d48e820ac6d77dea33df9b5c432100345266972Tony Mantler fragment.getAppName(), 904d48e820ac6d77dea33df9b5c432100345266972Tony Mantler fragment.getAppIcon()); 914d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } 924d48e820ac6d77dea33df9b5c432100345266972Tony Mantler 934d48e820ac6d77dea33df9b5c432100345266972Tony Mantler @Override 944d48e820ac6d77dea33df9b5c432100345266972Tony Mantler public void onOk() { 954d48e820ac6d77dea33df9b5c432100345266972Tony Mantler ActivityManager am = (ActivityManager) 964d48e820ac6d77dea33df9b5c432100345266972Tony Mantler getActivity().getSystemService(Context.ACTIVITY_SERVICE); 974d48e820ac6d77dea33df9b5c432100345266972Tony Mantler am.forceStopPackage(getArguments().getString(ARG_PACKAGE_NAME)); 984d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } 994d48e820ac6d77dea33df9b5c432100345266972Tony Mantler } 1004d48e820ac6d77dea33df9b5c432100345266972Tony Mantler} 101