| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.example.android.apprestrictionenforcer; |
| |
| import android.app.Activity; |
| import android.app.admin.DevicePolicyManager; |
| import android.content.pm.ApplicationInfo; |
| import android.content.pm.PackageManager; |
| import android.os.Build; |
| import android.os.Bundle; |
| import android.support.annotation.Nullable; |
| import android.support.v4.app.Fragment; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.Button; |
| import android.widget.TextView; |
| import android.widget.Toast; |
| |
| /** |
| * Provides UI for enabling the target app in this profile. The status of the app can be |
| * uninstalled, hidden, or enabled depending on the situations. This fragment shows suitable |
| * controls for each status. |
| */ |
| public class StatusFragment extends Fragment implements View.OnClickListener { |
| |
| private TextView mTextStatus; |
| private Button mButtonUnhide; |
| private StatusUpdatedListener mListener; |
| |
| @Override |
| public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, |
| @Nullable Bundle savedInstanceState) { |
| return inflater.inflate(R.layout.fragment_status, container, false); |
| } |
| |
| @Override |
| public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { |
| mTextStatus = (TextView) view.findViewById(R.id.status); |
| mButtonUnhide = (Button) view.findViewById(R.id.unhide); |
| mButtonUnhide.setOnClickListener(this); |
| } |
| |
| @Override |
| public void onAttach(Activity activity) { |
| super.onAttach(activity); |
| mListener = (StatusUpdatedListener) activity; |
| } |
| |
| @Override |
| public void onDetach() { |
| mListener = null; |
| super.onDetach(); |
| } |
| |
| @Override |
| public void onResume() { |
| super.onResume(); |
| updateUi(getActivity()); |
| } |
| |
| @Override |
| public void onClick(View v) { |
| switch (v.getId()) { |
| case R.id.unhide: { |
| unhideApp(getActivity()); |
| break; |
| } |
| } |
| } |
| |
| private void updateUi(Activity activity) { |
| PackageManager packageManager = activity.getPackageManager(); |
| try { |
| int packageFlags; |
| if (Build.VERSION.SDK_INT < 24) { |
| //noinspection deprecation |
| packageFlags = PackageManager.GET_UNINSTALLED_PACKAGES; |
| } else { |
| packageFlags = PackageManager.MATCH_UNINSTALLED_PACKAGES; |
| } |
| ApplicationInfo info = packageManager.getApplicationInfo( |
| Constants.PACKAGE_NAME_APP_RESTRICTION_SCHEMA, |
| packageFlags); |
| DevicePolicyManager devicePolicyManager = |
| (DevicePolicyManager) activity.getSystemService(Activity.DEVICE_POLICY_SERVICE); |
| if ((info.flags & ApplicationInfo.FLAG_INSTALLED) != 0) { |
| if (!devicePolicyManager.isApplicationHidden( |
| EnforcerDeviceAdminReceiver.getComponentName(activity), |
| Constants.PACKAGE_NAME_APP_RESTRICTION_SCHEMA)) { |
| // The app is ready to enforce restrictions |
| // This is unlikely to happen in this sample as unhideApp() handles it. |
| mListener.onStatusUpdated(); |
| } else { |
| // The app is installed but hidden in this profile |
| mTextStatus.setText(R.string.status_not_activated); |
| mButtonUnhide.setVisibility(View.VISIBLE); |
| } |
| } else { |
| // Need to reinstall the sample app |
| mTextStatus.setText(R.string.status_need_reinstall); |
| mButtonUnhide.setVisibility(View.GONE); |
| } |
| } catch (PackageManager.NameNotFoundException e) { |
| // Need to reinstall the sample app |
| mTextStatus.setText(R.string.status_need_reinstall); |
| mButtonUnhide.setVisibility(View.GONE); |
| } |
| } |
| |
| /** |
| * Unhides the AppRestrictionSchema sample in case it is hidden in this profile. |
| * |
| * @param activity The activity |
| */ |
| private void unhideApp(Activity activity) { |
| DevicePolicyManager devicePolicyManager = |
| (DevicePolicyManager) activity.getSystemService(Activity.DEVICE_POLICY_SERVICE); |
| devicePolicyManager.setApplicationHidden( |
| EnforcerDeviceAdminReceiver.getComponentName(activity), |
| Constants.PACKAGE_NAME_APP_RESTRICTION_SCHEMA, false); |
| Toast.makeText(activity, "Enabled the app", Toast.LENGTH_SHORT).show(); |
| mListener.onStatusUpdated(); |
| } |
| |
| public interface StatusUpdatedListener { |
| public void onStatusUpdated(); |
| } |
| |
| } |