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