1 /*
2  * Copyright (C) 2017 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.settings.applications.instantapps;
18 
19 import android.app.AlertDialog;
20 import android.app.Fragment;
21 import android.content.Context;
22 import android.content.DialogInterface;
23 import android.content.Intent;
24 import android.content.pm.PackageManager;
25 import android.os.UserHandle;
26 import android.view.View;
27 import android.widget.Button;
28 
29 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
30 import com.android.settings.R;
31 import com.android.settings.applications.AppStoreUtil;
32 import com.android.settings.applications.PackageManagerWrapper;
33 import com.android.settings.applications.PackageManagerWrapperImpl;
34 import com.android.settings.overlay.FeatureFactory;
35 
36 /** Encapsulates a container for buttons relevant to instant apps */
37 public class InstantAppButtonsController implements DialogInterface.OnClickListener {
38 
39     public interface ShowDialogDelegate {
40         /**
41          * Delegate that should be called when this controller wants to show a dialog.
42          */
showDialog(int id)43         void showDialog(int id);
44     }
45 
46     private final Context mContext;
47     private final Fragment mFragment;
48     private final View mView;
49     private final PackageManagerWrapper mPackageManagerWrapper;
50     private final ShowDialogDelegate mShowDialogDelegate;
51     private String mPackageName;
52 
53     public static final int DLG_BASE = 0x5032;
54     public static final int DLG_CLEAR_APP = DLG_BASE + 1;
55 
InstantAppButtonsController( Context context, Fragment fragment, View view, ShowDialogDelegate showDialogDelegate)56     public InstantAppButtonsController(
57             Context context,
58             Fragment fragment,
59             View view,
60             ShowDialogDelegate showDialogDelegate) {
61       mContext = context;
62       mFragment = fragment;
63       mView = view;
64       mShowDialogDelegate = showDialogDelegate;
65       mPackageManagerWrapper = new PackageManagerWrapperImpl(context.getPackageManager());
66     }
67 
setPackageName(String packageName)68     public InstantAppButtonsController setPackageName(String packageName) {
69         mPackageName = packageName;
70         return this;
71     }
72 
bindButtons()73     public void bindButtons() {
74         Button installButton = (Button)mView.findViewById(R.id.install);
75         Button clearDataButton = (Button)mView.findViewById(R.id.clear_data);
76         Intent appStoreIntent = AppStoreUtil.getAppStoreLink(mContext, mPackageName);
77         if (appStoreIntent != null) {
78             installButton.setEnabled(true);
79             installButton.setOnClickListener(v -> mFragment.startActivity(appStoreIntent));
80         }
81 
82         clearDataButton.setOnClickListener(v -> mShowDialogDelegate.showDialog(DLG_CLEAR_APP));
83     }
84 
createDialog(int id)85     public AlertDialog createDialog(int id) {
86         if (id == DLG_CLEAR_APP) {
87             AlertDialog dialog = new AlertDialog.Builder(mFragment.getActivity())
88                     .setPositiveButton(R.string.clear_instant_app_data, this)
89                     .setNegativeButton(R.string.cancel, null)
90                     .setTitle(R.string.clear_instant_app_data)
91                     .setMessage(mContext.getString(R.string.clear_instant_app_confirmation))
92                     .create();
93             return dialog;
94         }
95         return null;
96     }
97 
onClick(DialogInterface dialog, int which)98     public void onClick(DialogInterface dialog, int which) {
99         if (which == DialogInterface.BUTTON_POSITIVE) {
100             FeatureFactory.getFactory(mContext)
101                     .getMetricsFeatureProvider()
102                     .action(mContext,
103                             MetricsEvent.ACTION_SETTINGS_CLEAR_INSTANT_APP,
104                             mPackageName);
105             mPackageManagerWrapper.deletePackageAsUser(
106                     mPackageName, null, 0, UserHandle.myUserId());
107         }
108     }
109 
show()110     public InstantAppButtonsController show() {
111         bindButtons();
112         mView.setVisibility(View.VISIBLE);
113         return this;
114     }
115 }
116