From 6402fbaf2417995808088e134f8f2b313c77535b Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Tue, 12 Jan 2010 15:19:16 -0800 Subject: android-2.1_r1 snapshot --- AndroidManifest.xml | 12 ++- res/values-da/strings.xml | 10 +-- res/values-ru/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 2 +- .../packageinstaller/InstallAppProgress.java | 86 ++++++++++++++++++---- .../packageinstaller/PackageInstallerActivity.java | 57 -------------- src/com/android/packageinstaller/PackageUtil.java | 28 ++++--- 7 files changed, 106 insertions(+), 91 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 21131455..ab4562bc 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -7,7 +7,8 @@ - + @@ -16,9 +17,11 @@ - + - + @@ -26,7 +29,8 @@ - + diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 68cd23f2..01c31eef 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -17,8 +17,8 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Pakkeinstallationsprogram" "Installer" - "Færdig" - "Tillad dette program at:" + "Udfør" + "Tillad, at dette program:" "Annuller" "Ukendt" "Installerer ..." @@ -27,12 +27,12 @@ "Programmet er ikke installeret" "%1$s kunne ikke installeres på denne telefon." "Åbn" - "Installer blokeret" + "Installationen er blokeret" "Din telefon er af sikkerhedsgrunde indstillet til at blokere installation af programmer, der ikke er anskaffet på Android Marked." "OK" "Indstillinger" "Administ. programmer" - "Erstat program" + "Erstat programmet" "Det program, du installerer, erstatter et andet program."\n\n"Alle tidligere brugerdata gemmes." "Dette er et systemprogram. Ønsker du stadig at erstatte det?"\n\n"Alle tidligere brugerdata gemmes." "Der er ikke mere plads" @@ -45,7 +45,7 @@ "Dette program fjernes fra din telefon." "Programopdateringen afinstalleres. Du kan stadig bruge programmets fabriksversion." "Afinstallerer ..." - "Afinstallation afsluttet!" + "Afinstallationen er afsluttet!" "Afinstallationen mislykkedes" "%1$s kunne ikke afinstalleres!" "Parsingfejl" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 197c3843..bcb09177 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -28,7 +28,7 @@ "Установить приложение %1$s на этом телефоне не удалось." "Открыть" "Установка заблокирована" - "Из соображений безопасности на вашем телефоне заблокирована установка приложений, источником которых не является Android-маркет." + "Из соображений безопасности на вашем телефоне заблокирована установка приложений, источником которых не является Android Маркет." "ОК" "Настройки" "Управление приложениями" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 32a0b1d7..9f11099f 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -35,7 +35,7 @@ "替换应用程序" "您正在安装的应用程序会替换其他应用程序。"\n\n"会保存所有以前的用户数据。" "这是一个系统应用程序。您是否仍要替换它?"\n\n"之前的所有用户数据都会保存。" - "空间不足" + "没有存储空间" "无法查看%1$s。请释放部分手机空间,然后重试。" "确定" "找不到应用程序" diff --git a/src/com/android/packageinstaller/InstallAppProgress.java b/src/com/android/packageinstaller/InstallAppProgress.java index c5a3c5b5..1ecc1f1e 100755 --- a/src/com/android/packageinstaller/InstallAppProgress.java +++ b/src/com/android/packageinstaller/InstallAppProgress.java @@ -29,6 +29,7 @@ import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.os.FileUtils; import android.os.Handler; import android.os.Message; import android.util.Log; @@ -38,6 +39,11 @@ import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + /** * This activity corresponds to a download progress screen that is displayed * when the user tries @@ -60,6 +66,9 @@ public class InstallAppProgress extends Activity implements View.OnClickListener final static int FAILED = 0; private final int INSTALL_COMPLETE = 1; private Intent mLaunchIntent; + private File mTmpFile; + private final String TMP_FILE_NAME="tmpCopy.apk"; + private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { @@ -123,18 +132,6 @@ public class InstallAppProgress extends Activity implements View.OnClickListener public void initView() { requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.op_progress); - // Initialize views - PackageUtil.initSnippetForInstalledApp(this, mAppInfo, R.id.app_snippet); - mStatusTextView = (TextView)findViewById(R.id.center_text); - mStatusTextView.setText(R.string.installing); - mProgressBar = (ProgressBar) findViewById(R.id.progress_bar); - mProgressBar.setIndeterminate(true); - // Hide button till progress is being displayed - mOkPanel = (View)findViewById(R.id.buttons_panel); - mDoneButton = (Button)findViewById(R.id.done_button); - mLaunchButton = (Button)findViewById(R.id.launch_button); - mOkPanel.setVisibility(View.INVISIBLE); - // Set flag to replace package if already existing int installFlags = 0; PackageManager pm = getPackageManager(); try { @@ -148,6 +145,27 @@ public class InstallAppProgress extends Activity implements View.OnClickListener if((installFlags & PackageManager.INSTALL_REPLACE_EXISTING )!= 0) { Log.w(TAG, "Replacing package:" + mAppInfo.packageName); } + PackageUtil.initSnippetForNewApp(this, mAppInfo, + R.id.app_snippet, mPackageURI); + mStatusTextView = (TextView)findViewById(R.id.center_text); + mStatusTextView.setText(R.string.installing); + mProgressBar = (ProgressBar) findViewById(R.id.progress_bar); + mProgressBar.setIndeterminate(true); + // Hide button till progress is being displayed + mOkPanel = (View)findViewById(R.id.buttons_panel); + mDoneButton = (Button)findViewById(R.id.done_button); + mLaunchButton = (Button)findViewById(R.id.launch_button); + mOkPanel.setVisibility(View.INVISIBLE); + + // Create temp file before invoking install api + mTmpFile = createTempPackageFile(mPackageURI.getPath()); + if (mTmpFile == null) { + Message msg = mHandler.obtainMessage(INSTALL_COMPLETE); + msg.arg1 = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE; + mHandler.sendMessage(msg); + return; + } + mPackageURI = Uri.parse("file://" + mTmpFile.getPath()); String installerPackageName = getIntent().getStringExtra( Intent.EXTRA_INSTALLER_PACKAGE_NAME); @@ -155,13 +173,55 @@ public class InstallAppProgress extends Activity implements View.OnClickListener pm.installPackage(mPackageURI, observer, installFlags, installerPackageName); } + @Override + protected void onDestroy() { + super.onDestroy(); + if (mTmpFile != null && mTmpFile.exists()) { + mTmpFile.delete(); + } + } + public void onClick(View v) { if(v == mDoneButton) { - Log.i(TAG, "Finished installing "+mAppInfo); + if (mAppInfo.packageName != null) { + Log.i(TAG, "Finished installing "+mAppInfo.packageName); + } finish(); } else if(v == mLaunchButton) { startActivity(mLaunchIntent); finish(); } } + + private File createTempPackageFile(String filePath) { + File tmpPackageFile = getFileStreamPath(TMP_FILE_NAME); + if (tmpPackageFile == null) { + Log.w(TAG, "Failed to create temp file"); + return null; + } + if (tmpPackageFile.exists()) { + tmpPackageFile.delete(); + } + // Open file to make it world readable + FileOutputStream fos; + try { + fos = openFileOutput(TMP_FILE_NAME, MODE_WORLD_READABLE); + } catch (FileNotFoundException e1) { + Log.e(TAG, "Error opening file " + TMP_FILE_NAME); + return null; + } + try { + fos.close(); + } catch (IOException e) { + Log.e(TAG, "Error opening file " + TMP_FILE_NAME); + return null; + } + + File srcPackageFile = new File(filePath); + if (!FileUtils.copyFile(srcPackageFile, tmpPackageFile)) { + Log.w(TAG, "Failed to make copy of file: " + srcPackageFile); + return null; + } + return tmpPackageFile; + } } diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java index 8f681bb0..b1651943 100644 --- a/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -19,9 +19,6 @@ package com.android.packageinstaller; import com.android.packageinstaller.R; import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -33,13 +30,11 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.DialogInterface.OnCancelListener; import android.content.pm.ApplicationInfo; -import android.content.pm.IPackageDataObserver; import android.content.pm.PackageManager; import android.content.pm.PackageParser; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.os.Bundle; -import android.os.FileUtils; import android.os.Handler; import android.os.Message; import android.provider.Settings; @@ -50,7 +45,6 @@ import android.view.View.OnClickListener; import android.widget.AppSecurityPermissions; import android.widget.Button; import android.widget.LinearLayout; -import android.widget.TextView; /* * This activity is launched when a new application is installed via side loading @@ -69,7 +63,6 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen PackageManager mPm; private boolean mReplacing = false; private PackageParser.Package mPkgInfo; - private File mTmpFile; private static final int SUCCEEDED = 1; private static final int FAILED = 0; // Broadcast receiver for clearing cache @@ -271,46 +264,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen Settings.Secure.INSTALL_NON_MARKET_APPS, 0) > 0; } - private File createTempPackageFile(String filePath) { - File tmpPackageFile; - int i = filePath.lastIndexOf("/"); - String tmpFileName; - if(i != -1) { - tmpFileName = filePath.substring(i+1); - } else { - tmpFileName = filePath; - } - FileOutputStream fos; - try { - fos=openFileOutput(tmpFileName, MODE_WORLD_READABLE); - } catch (FileNotFoundException e1) { - Log.e(TAG, "Error opening file "+tmpFileName); - return null; - } - try { - fos.close(); - } catch (IOException e) { - Log.e(TAG, "Error opening file "+tmpFileName); - return null; - } - tmpPackageFile=getFileStreamPath(tmpFileName); - File srcPackageFile = new File(filePath); - if (!FileUtils.copyFile(srcPackageFile, tmpPackageFile)) { - return null; - } - return tmpPackageFile; - } - private void makeTempCopyAndInstall() { - //copy file to tmp dir - mTmpFile = createTempPackageFile(mPackageURI.getPath()); - if(mTmpFile == null) { - //display a dialog - Log.e(TAG, "Error copying file locally. Failed Installation"); - showDialogInner(DLG_OUT_OF_SPACE); - return; - } - mPackageURI = Uri.parse("file://"+mTmpFile.getPath()); // Check if package is already installed. display confirmation dialog if replacing pkg try { mAppInfo = mPm.getApplicationInfo(mPkgInfo.packageName, @@ -356,8 +310,6 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen showDialogInner(DLG_UNKNOWN_APPS); return; } - // Clear any other temporary files in data directory - mPm.clearApplicationUserData(getPackageName(), null); //compute the size of the application. just an estimate long size; String apkPath = mPackageURI.getPath(); @@ -367,15 +319,6 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen checkOutOfSpace(size); } - @Override - public void onDestroy() { - super.onDestroy(); - // Delete the temporary file if it still exists - if (mTmpFile != null) { - deleteFile(mTmpFile.getName()); - } - } - // Generic handling when pressing back key public void onCancel(DialogInterface dialog) { finish(); diff --git a/src/com/android/packageinstaller/PackageUtil.java b/src/com/android/packageinstaller/PackageUtil.java index 362c9636..5b31062c 100644 --- a/src/com/android/packageinstaller/PackageUtil.java +++ b/src/com/android/packageinstaller/PackageUtil.java @@ -115,25 +115,33 @@ public class PackageUtil { int snippetId, Uri packageURI) { View appSnippet = pContext.findViewById(snippetId); final String archiveFilePath = packageURI.getPath(); - DisplayMetrics metrics = new DisplayMetrics(); - metrics.setToDefaults(); + Resources pRes = pContext.getResources(); AssetManager assmgr = new AssetManager(); assmgr.addAssetPath(archiveFilePath); - Resources res = new Resources(assmgr, metrics, null); + Resources res = new Resources(assmgr, pRes.getDisplayMetrics(), pRes.getConfiguration()); CharSequence label = null; // Try to load the label from the package's resources. If an app has not explicitly // specified any label, just use the package name. - try { - label = res.getText(appInfo.labelRes); - } catch (Resources.NotFoundException e) { - label = appInfo.packageName; + if (appInfo.labelRes != 0) { + try { + label = res.getText(appInfo.labelRes); + } catch (Resources.NotFoundException e) { + } + } + if (label == null) { + label = (appInfo.nonLocalizedLabel != null) ? + appInfo.nonLocalizedLabel : appInfo.packageName; } Drawable icon = null; // Try to load the icon from the package's resources. If an app has not explicitly // specified any resource, just use the default icon for now. - try { - icon = res.getDrawable(appInfo.icon); - } catch (Resources.NotFoundException e) { + if (appInfo.icon != 0) { + try { + icon = res.getDrawable(appInfo.icon); + } catch (Resources.NotFoundException e) { + } + } + if (icon == null) { icon = pContext.getPackageManager().getDefaultActivityIcon(); } ((ImageView)appSnippet.findViewById(R.id.app_icon)).setImageDrawable(icon); -- cgit v1.2.3