191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project/*
291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project**
391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** Copyright 2007, The Android Open Source Project
491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project**
591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** you may not use this file except in compliance with the License.
791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** You may obtain a copy of the License at
891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project**
991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
1091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project**
1191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** Unless required by applicable law or agreed to in writing, software
1291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
1391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** See the License for the specific language governing permissions and
1591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project** limitations under the License.
1691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project*/
1791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectpackage com.android.packageinstaller;
1891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
1991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.app.Activity;
209ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapuimport android.app.AlertDialog;
219ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapuimport android.app.Dialog;
229ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapuimport android.content.DialogInterface;
239ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapuimport android.content.DialogInterface.OnCancelListener;
2479da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkeyimport android.content.Intent;
2591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
2691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.IPackageInstallObserver;
272b3202c3ff18469b294629bf1416118f12492173Kenny Rootimport android.content.pm.ManifestDigest;
2891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.PackageInfo;
2991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.PackageManager;
3091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
3179da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkeyimport android.content.pm.ResolveInfo;
32916ad007619e025218665298ef9793c152ced070rich canningsimport android.content.pm.VerificationParams;
33bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Rootimport android.graphics.drawable.LevelListDrawable;
3491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.net.Uri;
3591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.os.Bundle;
3691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.os.Handler;
3791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.os.Message;
3891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.util.Log;
39d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapuimport android.view.View;
40d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapuimport android.widget.Button;
4191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.widget.ProgressBar;
4291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Projectimport android.widget.TextView;
4391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
4479da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkeyimport java.io.File;
45dc7d3d29d2d058e795ab7650a611027d981e4a71Suchi Amalapurapuimport java.util.List;
46f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu
4791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project/**
4891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * This activity corresponds to a download progress screen that is displayed
4991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * when the user tries
5091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * to install an application bundled as an apk file. The result of the application install
5191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * is indicated in the result code that gets set to the corresponding installation status
5291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * codes defined in PackageManager. If the package being installed already exists,
5391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project * the existing package is replaced with the new one.
5491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project */
559ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapupublic class InstallAppProgress extends Activity implements View.OnClickListener, OnCancelListener {
5691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private final String TAG="InstallAppProgress";
5791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private boolean localLOGV = false;
582b3202c3ff18469b294629bf1416118f12492173Kenny Root    static final String EXTRA_MANIFEST_DIGEST =
592b3202c3ff18469b294629bf1416118f12492173Kenny Root            "com.android.packageinstaller.extras.manifest_digest";
607b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    static final String EXTRA_INSTALL_FLOW_ANALYTICS =
617b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            "com.android.packageinstaller.extras.install_flow_analytics";
6291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private ApplicationInfo mAppInfo;
6391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private Uri mPackageURI;
647b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin    private InstallFlowAnalytics mInstallFlowAnalytics;
6591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private ProgressBar mProgressBar;
66d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    private View mOkPanel;
67d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    private TextView mStatusTextView;
68bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root    private TextView mExplanationTextView;
69d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    private Button mDoneButton;
70d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    private Button mLaunchButton;
7191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private final int INSTALL_COMPLETE = 1;
72d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    private Intent mLaunchIntent;
739ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu    private static final int DLG_OUT_OF_SPACE = 1;
749ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu    private CharSequence mLabel;
75f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu
7691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    private Handler mHandler = new Handler() {
7791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        public void handleMessage(Message msg) {
7891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            switch (msg.what) {
7991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                case INSTALL_COMPLETE:
807b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                    mInstallFlowAnalytics.setFlowFinishedWithPackageManagerResult(msg.arg1);
819e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) {
829e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                        Intent result = new Intent();
839e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                        result.putExtra(Intent.EXTRA_INSTALL_RESULT, msg.arg1);
849e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                        setResult(msg.arg1 == PackageManager.INSTALL_SUCCEEDED
859e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                                ? Activity.RESULT_OK : Activity.RESULT_FIRST_USER,
869e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                                        result);
879e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                        finish();
889e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                        return;
899e9721266feafdf16786b94f6fac4c06220cd422Dianne Hackborn                    }
90d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    // Update the status text
91d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    mProgressBar.setVisibility(View.INVISIBLE);
92d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    // Show the ok button
93d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    int centerTextLabel;
94bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                    int centerExplanationLabel = -1;
95bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                    LevelListDrawable centerTextDrawable = (LevelListDrawable) getResources()
96bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                            .getDrawable(R.drawable.ic_result_status);
97bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                    if (msg.arg1 == PackageManager.INSTALL_SUCCEEDED) {
98d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                        mLaunchButton.setVisibility(View.VISIBLE);
99bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                        centerTextDrawable.setLevel(0);
100d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                        centerTextLabel = R.string.install_done;
101d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                        // Enable or disable launch button
102d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                        mLaunchIntent = getPackageManager().getLaunchIntentForPackage(
103d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                                mAppInfo.packageName);
104dc7d3d29d2d058e795ab7650a611027d981e4a71Suchi Amalapurapu                        boolean enabled = false;
105d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                        if(mLaunchIntent != null) {
106dc7d3d29d2d058e795ab7650a611027d981e4a71Suchi Amalapurapu                            List<ResolveInfo> list = getPackageManager().
107dc7d3d29d2d058e795ab7650a611027d981e4a71Suchi Amalapurapu                                    queryIntentActivities(mLaunchIntent, 0);
108dc7d3d29d2d058e795ab7650a611027d981e4a71Suchi Amalapurapu                            if (list != null && list.size() > 0) {
109dc7d3d29d2d058e795ab7650a611027d981e4a71Suchi Amalapurapu                                enabled = true;
110dc7d3d29d2d058e795ab7650a611027d981e4a71Suchi Amalapurapu                            }
111dc7d3d29d2d058e795ab7650a611027d981e4a71Suchi Amalapurapu                        }
112dc7d3d29d2d058e795ab7650a611027d981e4a71Suchi Amalapurapu                        if (enabled) {
113d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                            mLaunchButton.setOnClickListener(InstallAppProgress.this);
114d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                        } else {
115d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                            mLaunchButton.setEnabled(false);
116d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                        }
1179ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                    } else if (msg.arg1 == PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE){
1189ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                        showDialogInner(DLG_OUT_OF_SPACE);
1199ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                        return;
120d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    } else {
1219ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                        // Generic error handling for all other error codes.
122bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                        centerTextDrawable.setLevel(1);
123bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                        centerExplanationLabel = getExplanationFromErrorCode(msg.arg1);
124d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                        centerTextLabel = R.string.install_failed;
125d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                        mLaunchButton.setVisibility(View.INVISIBLE);
126d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    }
127d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    if (centerTextDrawable != null) {
128d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    centerTextDrawable.setBounds(0, 0,
129d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                            centerTextDrawable.getIntrinsicWidth(),
130d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                            centerTextDrawable.getIntrinsicHeight());
131e1c0ad6d82bd4c4ba5c65e4951c5fcba170b2f55Fabrice Di Meglio                        mStatusTextView.setCompoundDrawablesRelative(centerTextDrawable, null,
132e1c0ad6d82bd4c4ba5c65e4951c5fcba170b2f55Fabrice Di Meglio                                null, null);
133d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    }
134d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    mStatusTextView.setText(centerTextLabel);
135bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                    if (centerExplanationLabel != -1) {
136bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                        mExplanationTextView.setText(centerExplanationLabel);
137bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                        mExplanationTextView.setVisibility(View.VISIBLE);
138bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                    } else {
139bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                        mExplanationTextView.setVisibility(View.GONE);
140bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                    }
141d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    mDoneButton.setOnClickListener(InstallAppProgress.this);
142d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu                    mOkPanel.setVisibility(View.VISIBLE);
14391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    break;
14491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                default:
14591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    break;
14691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            }
14791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        }
14891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    };
14991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project
150bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root    private int getExplanationFromErrorCode(int errCode) {
151bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root        Log.d(TAG, "Installation error code: " + errCode);
152bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root        switch (errCode) {
153bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root            case PackageManager.INSTALL_FAILED_INVALID_APK:
154bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                return R.string.install_failed_invalid_apk;
155bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root            case PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES:
156bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                return R.string.install_failed_inconsistent_certificates;
157bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root            case PackageManager.INSTALL_FAILED_OLDER_SDK:
158bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                return R.string.install_failed_older_sdk;
159bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root            case PackageManager.INSTALL_FAILED_CPU_ABI_INCOMPATIBLE:
160bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                return R.string.install_failed_cpu_abi_incompatible;
161bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root            default:
162bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root                return -1;
163bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root        }
164bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root    }
165bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root
16691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    @Override
16791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    public void onCreate(Bundle icicle) {
16891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        super.onCreate(icicle);
16991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        Intent intent = getIntent();
17091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
1717b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin        mInstallFlowAnalytics = intent.getParcelableExtra(EXTRA_INSTALL_FLOW_ANALYTICS);
1728fca480bee00578c1529b1f32ab30af096db82ddAlex Klyubin        mInstallFlowAnalytics.setContext(this);
17391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        mPackageURI = intent.getData();
17479da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey
17579da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey        final String scheme = mPackageURI.getScheme();
176aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        if (scheme != null && !"file".equals(scheme) && !"package".equals(scheme)) {
1777b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin            mInstallFlowAnalytics.setFlowFinished(
1787b30bc34492a0c53b02cec2fee7d0993da407fc4Alex Klyubin                    InstallFlowAnalytics.RESULT_FAILED_UNSUPPORTED_SCHEME);
17979da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey            throw new IllegalArgumentException("unexpected scheme " + scheme);
18079da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey        }
18179da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey
18291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        initView();
18391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
1849ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu
1859ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu    @Override
1869ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu    public Dialog onCreateDialog(int id, Bundle bundle) {
1879ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        switch (id) {
1889ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        case DLG_OUT_OF_SPACE:
1899ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu            String dlgText = getString(R.string.out_of_space_dlg_text, mLabel);
1909ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu            return new AlertDialog.Builder(this)
1919ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                    .setTitle(R.string.out_of_space_dlg_title)
1929ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                    .setMessage(dlgText)
1939ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                    .setPositiveButton(R.string.manage_applications, new DialogInterface.OnClickListener() {
1949ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                        public void onClick(DialogInterface dialog, int which) {
1959ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                            //launch manage applications
1969ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                            Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE");
1979ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                            startActivity(intent);
1989ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                            finish();
1999ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                        }
2009ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                    })
2019ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
2029ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                        public void onClick(DialogInterface dialog, int which) {
2039ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                            Log.i(TAG, "Canceling installation");
2049ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                            finish();
2059ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                        }
2069ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                    })
2079ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                    .setOnCancelListener(this)
2089ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu                    .create();
2099ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        }
2109ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu       return null;
2119ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu   }
2129ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu
2139ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu    private void showDialogInner(int id) {
2149ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        removeDialog(id);
2159ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        showDialog(id);
2169ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu    }
2179ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu
21891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    class PackageInstallObserver extends IPackageInstallObserver.Stub {
21991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        public void packageInstalled(String packageName, int returnCode) {
22091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
22191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            msg.arg1 = returnCode;
22291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            mHandler.sendMessage(msg);
22391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        }
22491ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
225d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu
22691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    public void initView() {
22791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        setContentView(R.layout.op_progress);
22891ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        int installFlags = 0;
22991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        PackageManager pm = getPackageManager();
23091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        try {
23191ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            PackageInfo pi = pm.getPackageInfo(mAppInfo.packageName,
23291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project                    PackageManager.GET_UNINSTALLED_PACKAGES);
23391ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            if(pi != null) {
234c0d65ae569b5f6188383a0d0ec253b6131203f30Dianne Hackborn                installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
23591ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project            }
23691ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        } catch (NameNotFoundException e) {
23791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        }
238c0d65ae569b5f6188383a0d0ec253b6131203f30Dianne Hackborn        if((installFlags & PackageManager.INSTALL_REPLACE_EXISTING )!= 0) {
239d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu            Log.w(TAG, "Replacing package:" + mAppInfo.packageName);
24091ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        }
24179da2eaa800f889be5e5f5bd91121c2ecb55ce14Jeff Sharkey
242aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        final PackageUtil.AppSnippet as;
243aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        if ("package".equals(mPackageURI.getScheme())) {
244aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            as = new PackageUtil.AppSnippet(pm.getApplicationLabel(mAppInfo),
245aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                    pm.getApplicationIcon(mAppInfo));
246aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        } else {
247aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            final File sourceFile = new File(mPackageURI.getPath());
248aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            as = PackageUtil.getAppSnippet(this, mAppInfo, sourceFile);
249aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        }
2509ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        mLabel = as.label;
2519ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        PackageUtil.initSnippetForNewApp(this, as, R.id.app_snippet);
252f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu        mStatusTextView = (TextView)findViewById(R.id.center_text);
253f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu        mStatusTextView.setText(R.string.installing);
254bae45d9ae440e20d1a261e81b6acdf02130a305aKenny Root        mExplanationTextView = (TextView) findViewById(R.id.center_explanation);
255f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu        mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
256f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu        mProgressBar.setIndeterminate(true);
257f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu        // Hide button till progress is being displayed
258f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu        mOkPanel = (View)findViewById(R.id.buttons_panel);
259f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu        mDoneButton = (Button)findViewById(R.id.done_button);
260f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu        mLaunchButton = (Button)findViewById(R.id.launch_button);
261f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu        mOkPanel.setVisibility(View.INVISIBLE);
262f075068817434dbb5e861d00f5ed23d6405ab4d9Suchi Amalapurapu
263fe069ea729efec01a8b6f16f9e76a2db4988404aJacek Surazski        String installerPackageName = getIntent().getStringExtra(
264fe069ea729efec01a8b6f16f9e76a2db4988404aJacek Surazski                Intent.EXTRA_INSTALLER_PACKAGE_NAME);
265916ad007619e025218665298ef9793c152ced070rich cannings        Uri originatingURI = getIntent().getParcelableExtra(Intent.EXTRA_ORIGINATING_URI);
266916ad007619e025218665298ef9793c152ced070rich cannings        Uri referrer = getIntent().getParcelableExtra(Intent.EXTRA_REFERRER);
267d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver        int originatingUid = getIntent().getIntExtra(Intent.EXTRA_ORIGINATING_UID,
268d58f150060e9300038ff86eeeffc86c2440303c8Ben Gruver                VerificationParams.NO_UID);
2692b3202c3ff18469b294629bf1416118f12492173Kenny Root        ManifestDigest manifestDigest = getIntent().getParcelableExtra(EXTRA_MANIFEST_DIGEST);
270916ad007619e025218665298ef9793c152ced070rich cannings        VerificationParams verificationParams = new VerificationParams(null, originatingURI,
2712b3202c3ff18469b294629bf1416118f12492173Kenny Root                referrer, originatingUid, manifestDigest);
27291ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project        PackageInstallObserver observer = new PackageInstallObserver();
273916ad007619e025218665298ef9793c152ced070rich cannings
274aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        if ("package".equals(mPackageURI.getScheme())) {
275aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            try {
276aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                pm.installExistingPackage(mAppInfo.packageName);
277aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                observer.packageInstalled(mAppInfo.packageName,
278aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                        PackageManager.INSTALL_SUCCEEDED);
279aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            } catch (PackageManager.NameNotFoundException e) {
280aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                observer.packageInstalled(mAppInfo.packageName,
281aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                        PackageManager.INSTALL_FAILED_INVALID_APK);
282aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            }
283aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        } else {
284aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn            pm.installPackageWithVerificationAndEncryption(mPackageURI, observer, installFlags,
285aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn                    installerPackageName, verificationParams, null);
286aba0bed7a4f6301c6e3067fc799d8ef47aaca0b2Dianne Hackborn        }
28791ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project    }
288d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu
289f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu    @Override
290f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu    protected void onDestroy() {
291f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu        super.onDestroy();
292f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu    }
293f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu
294d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    public void onClick(View v) {
295d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        if(v == mDoneButton) {
296f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu            if (mAppInfo.packageName != null) {
297f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu                Log.i(TAG, "Finished installing "+mAppInfo.packageName);
298f80cb7b8632fb2cab44838ee741b3e8fa4aa90b1Suchi Amalapurapu            }
299d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu            finish();
300d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        } else if(v == mLaunchButton) {
301d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu            startActivity(mLaunchIntent);
302d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu            finish();
303d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu        }
304d9b773b7041894e37c1b6f62d6b221dd3c8e4c43Suchi Amalapurapu    }
3059ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu
3069ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu    public void onCancel(DialogInterface dialog) {
3079ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu        finish();
3089ab50f3655afed4f9266402a03d3235d94220397Suchi Amalapurapu    }
30991ec61c3dca241befdf4a3803c45b051a3e3124fThe Android Open Source Project}
310