1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.car.settings.applications;
18 
19 import android.content.Context;
20 import android.content.pm.PackageInfo;
21 import android.content.pm.PackageManager;
22 import android.os.Bundle;
23 import android.os.UserHandle;
24 
25 import androidx.annotation.XmlRes;
26 
27 import com.android.car.settings.R;
28 import com.android.car.settings.applications.appinfo.HibernationSwitchPreferenceController;
29 import com.android.car.settings.common.Logger;
30 import com.android.car.settings.common.SettingsFragment;
31 import com.android.settingslib.applications.ApplicationsState;
32 
33 /**
34  * Shows details about an application.
35  */
36 public class ApplicationDetailsFragment extends SettingsFragment {
37     private static final Logger LOG = new Logger(ApplicationDetailsFragment.class);
38     public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
39 
40     private PackageManager mPm;
41 
42     private String mPackageName;
43     private PackageInfo mPackageInfo;
44     private ApplicationsState mAppState;
45     private ApplicationsState.AppEntry mAppEntry;
46 
47     /** Creates an instance of this fragment, passing packageName as an argument. */
getInstance(String packageName)48     public static ApplicationDetailsFragment getInstance(String packageName) {
49         ApplicationDetailsFragment applicationDetailFragment = new ApplicationDetailsFragment();
50         Bundle bundle = new Bundle();
51         bundle.putString(EXTRA_PACKAGE_NAME, packageName);
52         applicationDetailFragment.setArguments(bundle);
53         return applicationDetailFragment;
54     }
55 
56     @Override
57     @XmlRes
getPreferenceScreenResId()58     protected int getPreferenceScreenResId() {
59         return R.xml.application_details_fragment;
60     }
61 
62     @Override
onAttach(Context context)63     public void onAttach(Context context) {
64         super.onAttach(context);
65         mPm = context.getPackageManager();
66 
67         // These should be loaded before onCreate() so that the controller operates as expected.
68         mPackageName = getArguments().getString(EXTRA_PACKAGE_NAME);
69 
70         mAppState = ApplicationsState.getInstance(requireActivity().getApplication());
71 
72         retrieveAppEntry();
73 
74         use(ApplicationPreferenceController.class,
75                 R.string.pk_application_details_app)
76                 .setAppEntry(mAppEntry).setAppState(mAppState);
77         use(ApplicationActionButtonsPreferenceController.class,
78                 R.string.pk_application_details_action_buttons)
79                 .setAppEntry(mAppEntry).setAppState(mAppState).setPackageName(mPackageName);
80         use(NotificationsPreferenceController.class,
81                 R.string.pk_application_details_notifications).setPackageInfo(mPackageInfo);
82         use(PermissionsPreferenceController.class,
83                 R.string.pk_application_details_permissions).setPackageName(mPackageName);
84         use(StoragePreferenceController.class,
85                 R.string.pk_application_details_storage)
86                 .setAppEntry(mAppEntry).setAppState(mAppState).setPackageName(mPackageName);
87         use(PrioritizeAppPerformancePreferenceController.class,
88                 R.string.pk_application_details_prioritize_app_performance)
89                 .setPackageInfo(mPackageInfo);
90         use(HibernationSwitchPreferenceController.class,
91                 R.string.pk_hibernation_switch)
92                 .setPackageName(mPackageName);
93         use(VersionPreferenceController.class,
94                 R.string.pk_application_details_version).setPackageInfo(mPackageInfo);
95     }
96 
retrieveAppEntry()97     private void retrieveAppEntry() {
98         mAppEntry = mAppState.getEntry(mPackageName, UserHandle.myUserId());
99         if (mAppEntry != null) {
100             try {
101                 mPackageInfo = mPm.getPackageInfo(mPackageName,
102                         PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_ANY_USER
103                                 | PackageManager.GET_SIGNATURES | PackageManager.GET_PERMISSIONS);
104             } catch (PackageManager.NameNotFoundException e) {
105                 LOG.e("Exception when retrieving package:" + mPackageName, e);
106                 mPackageInfo = null;
107             }
108         } else {
109             mPackageInfo = null;
110         }
111     }
112 }
113