119f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh/*
219f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh * Copyright (C) 2011 The Android Open Source Project
319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh *
419f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License");
519f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh * you may not use this file except in compliance with the License.
619f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh * You may obtain a copy of the License at
719f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh *
819f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh *      http://www.apache.org/licenses/LICENSE-2.0
919f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh *
1019f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software
1119f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS,
1219f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh * See the License for the specific language governing permissions and
1419f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh * limitations under the License.
1519f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh */
1619f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
1719f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yehpackage com.android.vpndialogs;
1819f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
1919f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yehimport android.content.Context;
2019f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yehimport android.content.DialogInterface;
2105542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.content.Intent;
2219f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yehimport android.content.pm.ApplicationInfo;
2319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yehimport android.content.pm.PackageManager;
2405542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.content.pm.ResolveInfo;
2505542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.graphics.drawable.Drawable;
26f530da67b4f9ffa55bb8a1c05390c6f7f87fe4baChia-chi Yehimport android.net.IConnectivityManager;
2705542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.net.VpnService;
28f530da67b4f9ffa55bb8a1c05390c6f7f87fe4baChia-chi Yehimport android.os.ServiceManager;
2905542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.text.Html;
3005542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport android.text.Html.ImageGetter;
3119f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yehimport android.util.Log;
3219f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yehimport android.view.View;
3319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yehimport android.widget.Button;
3419f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yehimport android.widget.TextView;
3519f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
36ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yehimport com.android.internal.app.AlertActivity;
3705542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport com.android.internal.net.VpnConfig;
38ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yeh
3905542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonimport java.util.List;
4005542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson
4105542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidsonpublic class ConfirmDialog extends AlertActivity
4205542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson        implements DialogInterface.OnClickListener, ImageGetter {
4319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    private static final String TAG = "VpnConfirm";
4419f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
45100155a310fbb5028fc48e359bdfb7c4d3531843Chia-chi Yeh    private String mPackage;
4619f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
47f530da67b4f9ffa55bb8a1c05390c6f7f87fe4baChia-chi Yeh    private IConnectivityManager mService;
4819f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
4919f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    private Button mButton;
5019f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
5119f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    @Override
5219f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    protected void onResume() {
5319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh        super.onResume();
5419f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh        try {
55100155a310fbb5028fc48e359bdfb7c4d3531843Chia-chi Yeh            mPackage = getCallingPackage();
56f530da67b4f9ffa55bb8a1c05390c6f7f87fe4baChia-chi Yeh
57f530da67b4f9ffa55bb8a1c05390c6f7f87fe4baChia-chi Yeh            mService = IConnectivityManager.Stub.asInterface(
58f530da67b4f9ffa55bb8a1c05390c6f7f87fe4baChia-chi Yeh                    ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
5919f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
60100155a310fbb5028fc48e359bdfb7c4d3531843Chia-chi Yeh            if (mService.prepareVpn(mPackage, null)) {
6119f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh                setResult(RESULT_OK);
6219f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh                finish();
6319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh                return;
6419f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh            }
6519f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
6619f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh            View view = View.inflate(this, R.layout.confirm, null);
6719f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
6805542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson            ((TextView) view.findViewById(R.id.warning)).setText(
6905542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson                    Html.fromHtml(
7005542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson                            getString(R.string.warning, VpnConfig.getVpnLabel(this, mPackage)),
7105542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson                    this, null /* tagHandler */));
7205542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson
7305542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson            mAlertParams.mTitle = getText(R.string.prompt);
74ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yeh            mAlertParams.mPositiveButtonText = getText(android.R.string.ok);
75ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yeh            mAlertParams.mPositiveButtonListener = this;
76ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yeh            mAlertParams.mNegativeButtonText = getText(android.R.string.cancel);
77ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yeh            mAlertParams.mView = view;
78ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yeh            setupAlert();
79ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yeh
80ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yeh            getWindow().setCloseOnTouchOutside(false);
81ae380fb89dedaa03597d031370a18aa153a6a645Chia-chi Yeh            mButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
8256480ef53fe63f03d069ba76d8f90e712d764c9bKenny Root            mButton.setFilterTouchesWhenObscured(true);
8319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh        } catch (Exception e) {
8419f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh            Log.e(TAG, "onResume", e);
8519f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh            finish();
8619f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh        }
8719f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    }
8819f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
8919f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    @Override
9005542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson    public Drawable getDrawable(String source) {
9105542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson        // Should only reach this when fetching the VPN icon for the warning string.
9205542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson        Drawable icon = getDrawable(R.drawable.ic_vpn_dialog);
9305542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson        icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
9405542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson        return icon;
9519f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    }
9619f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
9719f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    @Override
9805542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson    public void onBackPressed() {
9919f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    }
10019f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh
10119f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    @Override
10219f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    public void onClick(DialogInterface dialog, int which) {
10319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh        try {
10405542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson            if (mService.prepareVpn(null, mPackage)) {
10505542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson                // Authorize this app to initiate VPN connections in the future without user
10605542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson                // intervention.
10705542603dd4f1e0ea47a3dca01de3999a9a329a9Jeff Davidson                mService.setVpnPackageAuthorization(true);
10819f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh                setResult(RESULT_OK);
10919f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh            }
11019f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh        } catch (Exception e) {
11119f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh            Log.e(TAG, "onClick", e);
11219f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh        }
11319f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh    }
11419f054b0f69b2f56ea0e98a3bb7e0e62b90ff480Chia-chi Yeh}
115