diff options
Diffstat (limited to 'src/com/android/settings/deviceinfo')
6 files changed, 261 insertions, 34 deletions
diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java index db60c37..fff1570 100644 --- a/src/com/android/settings/deviceinfo/Memory.java +++ b/src/com/android/settings/deviceinfo/Memory.java @@ -34,8 +34,12 @@ import android.os.storage.StorageEventListener; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; import android.preference.Preference; +import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.widget.Toast; import com.android.settings.R; @@ -47,6 +51,8 @@ public class Memory extends SettingsPreferenceFragment { private static final int DLG_CONFIRM_UNMOUNT = 1; private static final int DLG_ERROR_UNMOUNT = 2; + private static final int MENU_ID_USB = Menu.FIRST; + private Resources mResources; // The mountToggle Preference that has last been clicked. @@ -60,6 +66,7 @@ public class Memory extends SettingsPreferenceFragment { private StorageManager mStorageManager = null; + private StorageVolumePreferenceCategory mInternalStorageVolumePreferenceCategory; private StorageVolumePreferenceCategory[] mStorageVolumePreferenceCategories; @Override @@ -75,18 +82,32 @@ public class Memory extends SettingsPreferenceFragment { mResources = getResources(); + if (!Environment.isExternalStorageEmulated()) { + // External storage is separate from internal storage; need to + // show internal storage as a separate item. + mInternalStorageVolumePreferenceCategory = new StorageVolumePreferenceCategory( + getActivity(), mResources, null, mStorageManager, false); + getPreferenceScreen().addPreference(mInternalStorageVolumePreferenceCategory); + mInternalStorageVolumePreferenceCategory.init(); + } + StorageVolume[] storageVolumes = mStorageManager.getVolumeList(); + // mass storage is enabled if primary volume supports it + boolean massStorageEnabled = (storageVolumes.length > 0 + && storageVolumes[0].allowMassStorage()); int length = storageVolumes.length; mStorageVolumePreferenceCategories = new StorageVolumePreferenceCategory[length]; for (int i = 0; i < length; i++) { StorageVolume storageVolume = storageVolumes[i]; - StorageVolumePreferenceCategory storagePreferenceCategory = - new StorageVolumePreferenceCategory(getActivity(), mResources, storageVolume, - mStorageManager, i == 0); // The first volume is the primary volume - mStorageVolumePreferenceCategories[i] = storagePreferenceCategory; - getPreferenceScreen().addPreference(storagePreferenceCategory); - storagePreferenceCategory.init(); + boolean isPrimary = i == 0; + mStorageVolumePreferenceCategories[i] = new StorageVolumePreferenceCategory( + getActivity(), mResources, storageVolume, mStorageManager, isPrimary); + getPreferenceScreen().addPreference(mStorageVolumePreferenceCategories[i]); + mStorageVolumePreferenceCategories[i].init(); } + + // only show options menu if we are not using the legacy USB mass storage support + setHasOptionsMenu(!massStorageEnabled); } @Override @@ -97,6 +118,9 @@ public class Memory extends SettingsPreferenceFragment { intentFilter.addDataScheme("file"); getActivity().registerReceiver(mMediaScannerReceiver, intentFilter); + if (mInternalStorageVolumePreferenceCategory != null) { + mInternalStorageVolumePreferenceCategory.onResume(); + } for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) { mStorageVolumePreferenceCategories[i].onResume(); } @@ -105,9 +129,8 @@ public class Memory extends SettingsPreferenceFragment { StorageEventListener mStorageListener = new StorageEventListener() { @Override 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); + Log.i(TAG, "Received storage state changed notification that " + path + + " changed state from " + oldState + " to " + newState); for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) { StorageVolumePreferenceCategory svpc = mStorageVolumePreferenceCategories[i]; if (path.equals(svpc.getStorageVolume().getPath())) { @@ -122,6 +145,9 @@ public class Memory extends SettingsPreferenceFragment { public void onPause() { super.onPause(); getActivity().unregisterReceiver(mMediaScannerReceiver); + if (mInternalStorageVolumePreferenceCategory != null) { + mInternalStorageVolumePreferenceCategory.onPause(); + } for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) { mStorageVolumePreferenceCategories[i].onPause(); } @@ -135,6 +161,31 @@ public class Memory extends SettingsPreferenceFragment { super.onDestroy(); } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + menu.add(Menu.NONE, MENU_ID_USB, 0, R.string.storage_menu_usb) + //.setIcon(com.android.internal.R.drawable.stat_sys_data_usb) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case MENU_ID_USB: + if (getActivity() instanceof PreferenceActivity) { + ((PreferenceActivity) getActivity()).startPreferencePanel( + UsbSettings.class.getCanonicalName(), + null, + R.string.storage_title_usb, null, + this, 0); + } else { + startFragment(this, UsbSettings.class.getCanonicalName(), -1, null); + } + return true; + } + return super.onOptionsItemSelected(item); + } + private synchronized IMountService getMountService() { if (mMountService == null) { IBinder service = ServiceManager.getService("mount"); @@ -178,6 +229,7 @@ public class Memory extends SettingsPreferenceFragment { private final BroadcastReceiver mMediaScannerReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + // mInternalStorageVolumePreferenceCategory is not affected by the media scanner for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) { mStorageVolumePreferenceCategories[i].onMediaScannerFinished(); } diff --git a/src/com/android/settings/deviceinfo/PercentageBarChart.java b/src/com/android/settings/deviceinfo/PercentageBarChart.java index 0c71c12..95973c4 100644 --- a/src/com/android/settings/deviceinfo/PercentageBarChart.java +++ b/src/com/android/settings/deviceinfo/PercentageBarChart.java @@ -71,20 +71,21 @@ public class PercentageBarChart extends View { final int width = right - left; - int lastX = left; + float lastX = left; if (mEntries != null) { for (final Entry e : mEntries) { - final int entryWidth; - if (e.percentage == 0f) { - entryWidth = 0; + final float entryWidth; + if (e.percentage == 0.0f) { + entryWidth = 0.0f; } else { - entryWidth = Math.max(mMinTickWidth, (int) (width * e.percentage)); + entryWidth = Math.max(mMinTickWidth, width * e.percentage); } - final int nextX = lastX + entryWidth; - if (nextX >= right) { - break; + final float nextX = lastX + entryWidth; + if (nextX > right) { + canvas.drawRect(lastX, top, right, bottom, e.paint); + return; } canvas.drawRect(lastX, top, nextX, bottom, e.paint); @@ -92,7 +93,7 @@ public class PercentageBarChart extends View { } } - canvas.drawRect(lastX, top, lastX + width, bottom, mEmptyPaint); + canvas.drawRect(lastX, top, right, bottom, mEmptyPaint); } /** diff --git a/src/com/android/settings/deviceinfo/StorageMeasurement.java b/src/com/android/settings/deviceinfo/StorageMeasurement.java index 7fb309c..b4004e9 100644 --- a/src/com/android/settings/deviceinfo/StorageMeasurement.java +++ b/src/com/android/settings/deviceinfo/StorageMeasurement.java @@ -88,6 +88,7 @@ public class StorageMeasurement { private static Map<StorageVolume, StorageMeasurement> sInstances = new ConcurrentHashMap<StorageVolume, StorageMeasurement>(); + private static StorageMeasurement sInternalInstance; private volatile WeakReference<MeasurementReceiver> mReceiver; @@ -100,6 +101,7 @@ public class StorageMeasurement { final private StorageVolume mStorageVolume; final private boolean mIsPrimary; + final private boolean mIsInternal; List<FileInfo> mFileInfoForMisc; @@ -110,7 +112,8 @@ public class StorageMeasurement { private StorageMeasurement(Context context, StorageVolume storageVolume, boolean isPrimary) { mStorageVolume = storageVolume; - mIsPrimary = isPrimary; + mIsInternal = storageVolume == null; + mIsPrimary = !mIsInternal && isPrimary; // Start the thread that will measure the disk usage. final HandlerThread handlerThread = new HandlerThread("MemoryMeasurement"); @@ -126,6 +129,13 @@ public class StorageMeasurement { */ public static StorageMeasurement getInstance(Context context, StorageVolume storageVolume, boolean isPrimary) { + if (storageVolume == null) { + if (sInternalInstance == null) { + sInternalInstance = + new StorageMeasurement(context.getApplicationContext(), storageVolume, isPrimary); + } + return sInternalInstance; + } if (sInstances.containsKey(storageVolume)) { return sInstances.get(storageVolume); } else { @@ -317,9 +327,18 @@ public class StorageMeasurement { } if (succeeded) { - mAppsSizeForThisStatsObserver += stats.codeSize + stats.dataSize + - stats.externalCacheSize + stats.externalDataSize + - stats.externalMediaSize + stats.externalObbSize; + if (mIsInternal) { + mAppsSizeForThisStatsObserver += stats.codeSize + stats.dataSize; + } else if (!Environment.isExternalStorageEmulated()) { + mAppsSizeForThisStatsObserver += stats.externalObbSize + + stats.externalCodeSize + stats.externalDataSize + + stats.externalCacheSize + stats.externalMediaSize; + } else { + mAppsSizeForThisStatsObserver += stats.codeSize + stats.dataSize + + stats.externalCodeSize + stats.externalDataSize + + stats.externalCacheSize + stats.externalMediaSize + + stats.externalObbSize; + } } synchronized (mAppsList) { @@ -349,7 +368,8 @@ public class StorageMeasurement { } private void measureApproximateStorage() { - final StatFs stat = new StatFs(mStorageVolume.getPath()); + final StatFs stat = new StatFs(mStorageVolume != null + ? mStorageVolume.getPath() : Environment.getDataDirectory().getPath()); final long blockSize = stat.getBlockSize(); final long totalBlocks = stat.getBlockCount(); final long availableBlocks = stat.getAvailableBlocks(); @@ -434,7 +454,7 @@ public class StorageMeasurement { return; } final List<ApplicationInfo> apps; - if (mIsPrimary) { + if (mIsPrimary || mIsInternal) { apps = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS); } else { @@ -529,7 +549,7 @@ public class StorageMeasurement { /** * TODO remove this method, only used because external SD Card needs a special treatment. */ - boolean isPrimary() { - return mIsPrimary; + boolean isExternalSDCard() { + return !mIsPrimary && !mIsInternal; } } diff --git a/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java b/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java index 9dbff88..ae6d817 100644 --- a/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java +++ b/src/com/android/settings/deviceinfo/StorageVolumePreferenceCategory.java @@ -162,12 +162,13 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory implemen mResources = resources; mStorageVolume = storageVolume; mStorageManager = storageManager; - setTitle(storageVolume.getDescription()); + setTitle(storageVolume != null ? storageVolume.getDescription() + : resources.getText(R.string.internal_storage)); mMeasurement = StorageMeasurement.getInstance(context, storageVolume, isPrimary); mMeasurement.setReceiver(this); // Cannot format emulated storage - mAllowFormat = !mStorageVolume.isEmulated(); + mAllowFormat = mStorageVolume != null && !mStorageVolume.isEmulated(); // For now we are disabling reformatting secondary external storage // until some interoperability problems with MTP are fixed if (!isPrimary) mAllowFormat = false; @@ -240,7 +241,9 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory implemen private void updatePreferencesFromState() { resetPreferences(); - String state = mStorageManager.getVolumeState(mStorageVolume.getPath()); + String state = mStorageVolume != null + ? mStorageManager.getVolumeState(mStorageVolume.getPath()) + : Environment.MEDIA_MOUNTED; String readOnly = ""; if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { @@ -255,7 +258,8 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory implemen removePreference(mFormatPreference); } - if (!mStorageVolume.isRemovable() && !Environment.MEDIA_UNMOUNTED.equals(state)) { + if ((mStorageVolume == null || !mStorageVolume.isRemovable()) + && !Environment.MEDIA_UNMOUNTED.equals(state)) { // This device has built-in storage that is not removable. // There is no reason for the user to unmount it. removePreference(mMountTogglePreference); @@ -307,7 +311,7 @@ public class StorageVolumePreferenceCategory extends PreferenceCategory implemen mPreferences[TOTAL_SIZE].setSummary(formatSize(totalSize)); - if (!mMeasurement.isPrimary()) { + if (mMeasurement.isExternalSDCard()) { // TODO FIXME: external SD card will not report any size. Show used space in bar graph final long usedSize = totalSize - availSize; mUsageBarPreference.addEntry(usedSize / (float) totalSize, android.graphics.Color.GRAY); diff --git a/src/com/android/settings/deviceinfo/UsageBarPreference.java b/src/com/android/settings/deviceinfo/UsageBarPreference.java index e9909f1..5aeaef5 100644 --- a/src/com/android/settings/deviceinfo/UsageBarPreference.java +++ b/src/com/android/settings/deviceinfo/UsageBarPreference.java @@ -36,17 +36,17 @@ public class UsageBarPreference extends Preference { public UsageBarPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - setWidgetLayoutResource(R.layout.preference_memoryusage); + setLayoutResource(R.layout.preference_memoryusage); } public UsageBarPreference(Context context) { super(context); - setWidgetLayoutResource(R.layout.preference_memoryusage); + setLayoutResource(R.layout.preference_memoryusage); } public UsageBarPreference(Context context, AttributeSet attrs) { super(context, attrs); - setWidgetLayoutResource(R.layout.preference_memoryusage); + setLayoutResource(R.layout.preference_memoryusage); } public void addEntry(float percentage, int color) { diff --git a/src/com/android/settings/deviceinfo/UsbSettings.java b/src/com/android/settings/deviceinfo/UsbSettings.java new file mode 100644 index 0000000..5da13af --- /dev/null +++ b/src/com/android/settings/deviceinfo/UsbSettings.java @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2011 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.deviceinfo; + +import android.content.ContentQueryMap; +import android.content.ContentResolver; +import android.content.Context; +import android.hardware.usb.UsbManager; +import android.os.Bundle; +import android.os.storage.StorageManager; +import android.os.storage.StorageVolume; +import android.preference.CheckBoxPreference; +import android.preference.Preference; +import android.preference.PreferenceScreen; +import android.provider.Settings; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +import java.io.File; + +/** + * USB storage settings. + */ +public class UsbSettings extends SettingsPreferenceFragment { + + private static final String TAG = "UsbSettings"; + + private static final String KEY_MTP = "usb_mtp"; + private static final String KEY_PTP = "usb_ptp"; + private static final String KEY_INSTALLER_CD = "usb_installer_cd"; + private static final int MENU_ID_INSTALLER_CD = Menu.FIRST; + + private UsbManager mUsbManager; + private String mInstallerImagePath; + private CheckBoxPreference mMtp; + private CheckBoxPreference mPtp; + + private PreferenceScreen createPreferenceHierarchy() { + PreferenceScreen root = getPreferenceScreen(); + if (root != null) { + root.removeAll(); + } + addPreferencesFromResource(R.xml.usb_settings); + root = getPreferenceScreen(); + + mMtp = (CheckBoxPreference)root.findPreference(KEY_MTP); + mPtp = (CheckBoxPreference)root.findPreference(KEY_PTP); + + return root; + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE); + mInstallerImagePath = getString(com.android.internal.R.string.config_isoImagePath); + if (!(new File(mInstallerImagePath)).exists()) { + mInstallerImagePath = null; + } + setHasOptionsMenu(mInstallerImagePath != null); + } + + @Override + public void onResume() { + super.onResume(); + + // Make sure we reload the preference hierarchy since some of these settings + // depend on others... + createPreferenceHierarchy(); + updateToggles(); + } + + private void updateToggles() { + if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_MTP)) { + mMtp.setChecked(true); + mPtp.setChecked(false); + } else if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_PTP)) { + mMtp.setChecked(false); + mPtp.setChecked(true); + } else { + mMtp.setChecked(false); + mPtp.setChecked(false); + } + } + + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + Log.d(TAG, "onPreferenceTreeClick " + preference); + + // temporary hack - using check boxes as radio buttons + // don't allow unchecking them + if (preference instanceof CheckBoxPreference) { + CheckBoxPreference checkBox = (CheckBoxPreference)preference; + if (!checkBox.isChecked()) { + checkBox.setChecked(true); + return true; + } + } + + if (preference == mMtp) { + mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MTP, true); + mPtp.setChecked(false); + } else if (preference == mPtp) { + mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_PTP, true); + mMtp.setChecked(false); + } + + return true; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + menu.add(Menu.NONE, MENU_ID_INSTALLER_CD, 0, R.string.usb_label_installer_cd) + //.setIcon(com.android.internal.R.drawable.stat_sys_data_usb) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case MENU_ID_INSTALLER_CD: + // installer CD is never default + mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MASS_STORAGE, false); + mUsbManager.setMassStorageBackingFile(mInstallerImagePath); + mMtp.setChecked(false); + mPtp.setChecked(false); + return true; + } + return super.onOptionsItemSelected(item); + } +} |