Add dialog when ejecting sdcard

Remove some dead code
This commit is contained in:
Suchi Amalapurapu
2010-02-22 10:12:14 -08:00
parent 7fa89d9d13
commit 29d587fa18
6 changed files with 115 additions and 435 deletions

View File

@@ -700,14 +700,6 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name="SdCardSettings" android:label="@string/sd_card_settings_label">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
<category android:name="android.intent.category.VOICE_LAUNCH" />
</intent-filter>
</activity>
<activity android:name="ProxySelector" android:label="@string/proxy_settings_label" <activity android:name="ProxySelector" android:label="@string/proxy_settings_label"
android:theme="@android:style/Theme.Dialog"> android:theme="@android:style/Theme.Dialog">
<intent-filter> <intent-filter>

View File

@@ -1,132 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/Settings/res/layout/sdcard_settings_screen.xml
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout android:id="@+id/list"
android:orientation="vertical"
android:padding="10dip"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout android:id="@+id/usb"
android:orientation="vertical"
android:paddingBottom="10dip"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox android:id="@+id/mass_storage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sdcard_settings_screen_mass_storage_text">
<requestFocus/>
</CheckBox>
<TextView android:text="@string/sdcard_changes_instructions" style="@style/info_small" />
</LinearLayout>
<!-- divider line -->
<View android:background="#FF000000"
android:layout_width="match_parent"
android:layout_height="1dip" />
<LinearLayout android:id="@+id/mounted"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip">
<TextView android:id="@+id/read_only"
android:text="@string/sdcard_settings_read_only_status"
style="@style/info_label" />
<Button android:id="@+id/sdcard_unmount"
android:text="@string/sdcard_unmount"
android:textSize="14sp"
android:layout_marginTop="8dip"
android:layout_width="wrap_content" android:layout_height="wrap_content" />
<Button android:id="@+id/sdcard_format"
android:text="@string/sdcard_format"
android:textSize="14sp"
android:layout_marginTop="8dip"
android:layout_width="wrap_content" android:layout_height="wrap_content" />
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip">
<TableRow>
<TextView android:text="@string/sdcard_settings_total_bytes_label" style="@style/info_label" />
<TextView android:id="@+id/total" style="@style/info_value" />
</TableRow>
<TableRow>
<TextView android:text="@string/sdcard_settings_used_bytes_label" style="@style/info_label" />
<TextView android:id="@+id/used" style="@style/info_value" />
</TableRow>
<TableRow>
<TextView android:text="@string/sdcard_settings_available_bytes_label" style="@style/info_label" />
<TextView android:id="@+id/available" style="@style/info_value" />
</TableRow>
</TableLayout>
</LinearLayout>
<LinearLayout style="@style/entry_layout"
android:id="@+id/scanning"
android:paddingTop="10dip">
<TextView android:text="@string/sdcard_settings_scanning_status" style="@style/info_label" />
</LinearLayout>
<LinearLayout style="@style/entry_layout"
android:id="@+id/removed"
android:paddingTop="10dip">
<TextView android:text="@string/sdcard_settings_not_present_status" style="@style/info_label" />
</LinearLayout>
<LinearLayout android:id="@+id/shared"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dip">
<LinearLayout style="@style/entry_layout" >
<TextView android:text="@string/sdcard_settings_mass_storage_status" style="@style/info_label" />
</LinearLayout>
</LinearLayout>
<LinearLayout style="@style/entry_layout"
android:id="@+id/unmounted"
android:paddingTop="10dip">
<TextView android:text="@string/sdcard_settings_unmounted_status" style="@style/info_label" />
</LinearLayout>
<LinearLayout style="@style/entry_layout"
android:id="@+id/bad_removal"
android:paddingTop="10dip">
<TextView android:text="@string/sdcard_settings_bad_removal_status" style="@style/info_label" />
</LinearLayout>
</LinearLayout>
</ScrollView>

View File

@@ -1203,6 +1203,21 @@
<string name="sd_unavailable">Unavailable</string> <string name="sd_unavailable">Unavailable</string>
<!-- SD card status when it is mounted as read only --> <!-- SD card status when it is mounted as read only -->
<string name="read_only">\u0020(Read-only)</string> <string name="read_only">\u0020(Read-only)</string>
<!-- SD card eject confirmation dialog title -->
<string name="dlg_confirm_unmount_title">Unmount sdcard</string>
<!-- SD card eject confirmation dialog -->
<string name="dlg_confirm_unmount_text">Some processes accessing data on sdcard will be killed. Do you want to continue?</string>
<!-- SD card eject error dialog title -->
<string name="dlg_error_unmount_title">Unmount sdcard failed</string>
<!-- SD card eject error dialog text -->
<string name="dlg_error_unmount_text">Cannot unmount sdcard. Try again later.</string>
<!-- SD card unmount informative text -->
<string name="unmount_inform_text">Sdcard will be unmounted. Check the notification area for status.</string>
<!-- SD card eject progress title -->
<string name="sd_ejecting_title">Unmounting</string>
<!-- SD card eject progress text -->
<string name="sd_ejecting_summary">Unmount in progress</string>
<!-- Phone info screen, section titles: --> <!-- Phone info screen, section titles: -->
<string name="battery_status_title">Battery status</string> <string name="battery_status_title">Battery status</string>
<!-- Phone info screen, section titles: --> <!-- Phone info screen, section titles: -->

View File

@@ -1,70 +0,0 @@
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.BroadcastReceiver;
import android.util.Config;
import android.util.Log;
/**
*
*/
public class SdCardIntentReceiver extends BroadcastReceiver {
private static final int SDCARD_STATUS = 1;
private static final String TAG = "SdCardIntentReceiver";
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager nm = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
String action = intent.getAction();
if (Config.LOGD) Log.d(TAG, "onReceiveIntent " + action);
if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
nm.cancel(SDCARD_STATUS);
Intent statusIntent = new Intent(Intent.ACTION_MAIN, null);
statusIntent.setClass(context, SdCardSettings.class);
nm.notify(SDCARD_STATUS, new Notification(context,
android.R.drawable.stat_notify_sdcard,
null,
System.currentTimeMillis(),
context.getText(R.string.sdcard_setting),
null,
statusIntent));
} else if (action.equals(Intent.ACTION_MEDIA_REMOVED)) {
nm.cancel(SDCARD_STATUS);
} else if (action.equals(Intent.ACTION_MEDIA_SHARED)) {
nm.cancel(SDCARD_STATUS);
Intent statusIntent = new Intent(Intent.ACTION_MAIN, null);
statusIntent.setClass(context, SdCardSettings.class);
nm.notify(SDCARD_STATUS, new Notification(context,
android.R.drawable.stat_notify_sdcard_usb,
null,
System.currentTimeMillis(),
"SD Card",
null,
statusIntent));
}
}
}

View File

@@ -1,210 +0,0 @@
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.Environment;
import android.os.ServiceManager;
import android.os.StatFs;
import android.os.storage.StorageManager;
import android.os.storage.IMountService;
import android.text.format.Formatter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import java.io.File;
public class SdCardSettings extends Activity
{
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.sdcard_settings_screen);
mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));
mRemovedLayout = findViewById(R.id.removed);
mMountedLayout = findViewById(R.id.mounted);
mUnmountedLayout = findViewById(R.id.unmounted);
mScanningLayout = findViewById(R.id.scanning);
mSharedLayout = findViewById(R.id.shared);
mBadRemovalLayout = findViewById(R.id.bad_removal);
mReadOnlyStatus = findViewById(R.id.read_only);
mMassStorage = (CheckBox)findViewById(R.id.mass_storage);
mMassStorage.setOnClickListener(mMassStorageListener);
Button unmountButton = (Button)findViewById(R.id.sdcard_unmount);
unmountButton.setOnClickListener(mUnmountButtonHandler);
Button formatButton = (Button)findViewById(R.id.sdcard_format);
formatButton.setOnClickListener(mFormatButtonHandler);
mTotalSize = (TextView)findViewById(R.id.total);
mUsedSize = (TextView)findViewById(R.id.used);
mAvailableSize = (TextView)findViewById(R.id.available);
// install an intent filter to receive SD card related events.
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_REMOVED);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SHARED);
intentFilter.addAction(Intent.ACTION_MEDIA_CHECKING);
intentFilter.addAction(Intent.ACTION_MEDIA_NOFS);
intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
intentFilter.addDataScheme("file");
registerReceiver(mReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onResume() {
super.onResume();
update();
}
private void setLayout(View layout) {
mRemovedLayout.setVisibility(layout == mRemovedLayout ? View.VISIBLE : View.GONE);
mMountedLayout.setVisibility(layout == mMountedLayout ? View.VISIBLE : View.GONE);
mUnmountedLayout.setVisibility(layout == mUnmountedLayout ? View.VISIBLE : View.GONE);
mScanningLayout.setVisibility(layout == mScanningLayout ? View.VISIBLE : View.GONE);
mSharedLayout.setVisibility(layout == mSharedLayout ? View.VISIBLE : View.GONE);
mBadRemovalLayout.setVisibility(layout == mBadRemovalLayout ? View.VISIBLE : View.GONE);
}
private void update() {
try {
mMassStorage.setChecked(mStorageManager.isUsbMassStorageEnabled());
} catch (Exception ex) {
}
String status = Environment.getExternalStorageState();
boolean readOnly = false;
if (status.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
status = Environment.MEDIA_MOUNTED;
readOnly = true;
}
if (status.equals(Environment.MEDIA_MOUNTED)) {
try {
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long availableBlocks = stat.getAvailableBlocks();
mTotalSize.setText(formatSize(totalBlocks * blockSize));
mUsedSize.setText(formatSize((totalBlocks - availableBlocks) * blockSize));
mAvailableSize.setText(formatSize(availableBlocks * blockSize));
} catch (IllegalArgumentException e) {
// this can occur if the SD card is removed, but we haven't received the
// ACTION_MEDIA_REMOVED Intent yet.
status = Environment.MEDIA_REMOVED;
}
mReadOnlyStatus.setVisibility(readOnly ? View.VISIBLE : View.GONE);
setLayout(mMountedLayout);
} else if (status.equals(Environment.MEDIA_UNMOUNTED)) {
setLayout(mUnmountedLayout);
} else if (status.equals(Environment.MEDIA_REMOVED)) {
setLayout(mRemovedLayout);
} else if (status.equals(Environment.MEDIA_SHARED)) {
setLayout(mSharedLayout);
} else if (status.equals(Environment.MEDIA_BAD_REMOVAL)) {
setLayout(mBadRemovalLayout);
}
}
private String formatSize(long size) {
return Formatter.formatFileSize(this, size);
}
OnClickListener mMassStorageListener = new OnClickListener() {
public void onClick(View v) {
try {
if (mMassStorage.isChecked()) {
mStorageManager.enableUsbMassStorage();
} else {
mStorageManager.disableUsbMassStorage();
}
} catch (Exception ex) {
}
}
};
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
update();
}
};
OnClickListener mUnmountButtonHandler = new OnClickListener() {
public void onClick(View v) {
try {
mMountService.unmountVolume(Environment.getExternalStorageDirectory().toString(), false);
} catch (RemoteException ex) {
}
}
};
OnClickListener mFormatButtonHandler = new OnClickListener() {
public void onClick(View v) {
try {
mMountService.formatVolume(Environment.getExternalStorageDirectory().toString());
} catch (RemoteException ex) {
}
}
};
private StorageManager mStorageManager;
private IMountService mMountService;
private CheckBox mMassStorage;
private TextView mTotalSize;
private TextView mUsedSize;
private TextView mAvailableSize;
private View mRemovedLayout;
private View mMountedLayout;
private View mUnmountedLayout;
private View mScanningLayout;
private View mSharedLayout;
private View mBadRemovalLayout;
private View mReadOnlyStatus;
}

View File

@@ -16,13 +16,19 @@
package com.android.settings.deviceinfo; package com.android.settings.deviceinfo;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.DialogInterface.OnCancelListener;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.Environment; import android.os.Environment;
import android.os.storage.IMountService; import android.os.storage.IMountService;
@@ -35,15 +41,15 @@ import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.text.format.Formatter; import android.text.format.Formatter;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import com.android.settings.R; import com.android.settings.R;
import java.io.File; import java.io.File;
import java.text.DecimalFormat;
public class Memory extends PreferenceActivity { public class Memory extends PreferenceActivity implements OnCancelListener {
private static final String TAG = "Memory"; private static final String TAG = "Memory";
private static final boolean localLOGV = false;
private static final String MEMORY_SD_SIZE = "memory_sd_size"; private static final String MEMORY_SD_SIZE = "memory_sd_size";
@@ -52,6 +58,10 @@ public class Memory extends PreferenceActivity {
private static final String MEMORY_SD_MOUNT_TOGGLE = "memory_sd_mount_toggle"; private static final String MEMORY_SD_MOUNT_TOGGLE = "memory_sd_mount_toggle";
private static final String MEMORY_SD_FORMAT = "memory_sd_format"; private static final String MEMORY_SD_FORMAT = "memory_sd_format";
private static final int DLG_CONFIRM_UNMOUNT = 1;
private static final int DLG_ERROR_UNMOUNT = 2;
private Resources mRes; private Resources mRes;
private Preference mSdSize; private Preference mSdSize;
@@ -98,6 +108,9 @@ public class Memory extends PreferenceActivity {
@Override @Override
public void onStorageStateChanged(String path, String oldState, String newState) { public void onStorageStateChanged(String path, String oldState, String newState) {
Log.i(TAG, "Received storage state changed notification that " +
path + " changed state from " + oldState +
" to " + newState);
updateMemoryStatus(); updateMemoryStatus();
} }
}; };
@@ -107,7 +120,15 @@ public class Memory extends PreferenceActivity {
super.onPause(); super.onPause();
unregisterReceiver(mReceiver); unregisterReceiver(mReceiver);
} }
@Override
protected void onDestroy() {
if (mStorageManager != null && mStorageListener != null) {
mStorageManager.unregisterListener(mStorageListener);
}
super.onDestroy();
}
private synchronized IMountService getMountService() { private synchronized IMountService getMountService() {
if (mMountService == null) { if (mMountService == null) {
IBinder service = ServiceManager.getService("mount"); IBinder service = ServiceManager.getService("mount");
@@ -147,19 +168,80 @@ public class Memory extends PreferenceActivity {
} }
}; };
private void unmount() { @Override
IMountService mountService = getMountService(); public Dialog onCreateDialog(int id, Bundle args) {
try { switch (id) {
if (mountService != null) { case DLG_CONFIRM_UNMOUNT:
mountService.unmountVolume(Environment.getExternalStorageDirectory().toString(), false); return new AlertDialog.Builder(this)
} else { .setTitle(R.string.dlg_confirm_unmount_title)
Log.e(TAG, "Mount service is null, can't unmount"); .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
} public void onClick(DialogInterface dialog, int which) {
} catch (RemoteException ex) { doUnmount(true);
}})
.setNegativeButton(R.string.cancel, null)
.setMessage(R.string.dlg_confirm_unmount_text)
.setOnCancelListener(this)
.create();
case DLG_ERROR_UNMOUNT:
return new AlertDialog.Builder(this )
.setTitle(R.string.dlg_error_unmount_title)
.setNeutralButton(R.string.dlg_ok, null)
.setMessage(R.string.dlg_error_unmount_text)
.setOnCancelListener(this)
.create();
} }
updateMemoryStatus(); return null;
} }
private void doUnmount(boolean force) {
// Present a toast here
Toast.makeText(this, R.string.unmount_inform_text, Toast.LENGTH_SHORT).show();
IMountService mountService = getMountService();
String extStoragePath = Environment.getExternalStorageDirectory().toString();
try {
mSdMountToggle.setEnabled(false);
mSdMountToggle.setTitle(mRes.getString(R.string.sd_ejecting_title));
mSdMountToggle.setSummary(mRes.getString(R.string.sd_ejecting_summary));
mountService.unmountVolume(extStoragePath, force);
} catch (RemoteException e) {
// Informative dialog to user that
// unmount failed.
showDialogInner(DLG_ERROR_UNMOUNT);
}
}
private void showDialogInner(int id) {
removeDialog(id);
showDialog(id);
}
private void unmount() {
// Check if the sdcard is being accessed by other processes
// and let the user decide if the sdcard should be ejected.
String extStoragePath = Environment.
getExternalStorageDirectory().toString();
IMountService mountService = getMountService();
int stUsers[] = null;
try {
stUsers = mountService.getStorageUsers(extStoragePath);
} catch (RemoteException e) {
// Very unlikely. But present an error dialog anyway
Log.e(TAG, "Is MountService running?");
showDialogInner(DLG_ERROR_UNMOUNT);
}
if (stUsers != null && stUsers.length > 0) {
if (localLOGV) Log.i(TAG, "Do have storage users accessing "
+ extStoragePath);
for (int pid : stUsers) {
if (localLOGV) Log.i(TAG, pid + " accessing file on sdcard");
}
// Present dialog to user
showDialogInner(DLG_CONFIRM_UNMOUNT);
} else {
doUnmount(true);
}
}
private void mount() { private void mount() {
IMountService mountService = getMountService(); IMountService mountService = getMountService();
try { try {
@@ -170,7 +252,6 @@ public class Memory extends PreferenceActivity {
} }
} catch (RemoteException ex) { } catch (RemoteException ex) {
} }
updateMemoryStatus();
} }
private void updateMemoryStatus() { private void updateMemoryStatus() {
@@ -233,5 +314,9 @@ public class Memory extends PreferenceActivity {
private String formatSize(long size) { private String formatSize(long size) {
return Formatter.formatFileSize(this, size); return Formatter.formatFileSize(this, size);
} }
public void onCancel(DialogInterface dialog) {
finish();
}
} }