1fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler/* 2fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * Copyright (C) 2015 The Android Open Source Project 3fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * 4fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * Licensed under the Apache License, Version 2.0 (the "License"); 5fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * you may not use this file except in compliance with the License. 6fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * You may obtain a copy of the License at 7fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * 8fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * http://www.apache.org/licenses/LICENSE-2.0 9fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * 10fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * Unless required by applicable law or agreed to in writing, software 11fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * distributed under the License is distributed on an "AS IS" BASIS, 12fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * See the License for the specific language governing permissions and 14fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler * limitations under the License 15fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler */ 16fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 17fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerpackage com.android.tv.settings.device.storage; 18fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 19fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.app.Activity; 20fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.app.Fragment; 21b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantlerimport android.content.BroadcastReceiver; 22fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.content.Context; 23fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.content.Intent; 24b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantlerimport android.content.IntentFilter; 25fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.content.pm.PackageManager; 26fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.os.Bundle; 27fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.os.storage.DiskInfo; 28fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.os.storage.StorageManager; 29fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.os.storage.VolumeInfo; 30fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.support.annotation.NonNull; 318f38002bda894e4e9fd55fb87bff2818460c2304Tony Mantlerimport android.support.annotation.Nullable; 32b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantlerimport android.support.v4.content.LocalBroadcastManager; 33fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.text.TextUtils; 34fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.util.Log; 35fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport android.widget.Toast; 36fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 37fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport com.android.tv.settings.R; 38fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 39fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerimport java.util.List; 40fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 41fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantlerpublic class FormatActivity extends Activity 42754ccda2d59a46be682bee0e2c6633f20b6c3fb3Tony Mantler implements FormatAsPrivateStepFragment.Callback, 4336d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler FormatAsPublicStepFragment.Callback, SlowDriveStepFragment.Callback { 44fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 45fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler private static final String TAG = "FormatActivity"; 46fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 47fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler public static final String INTENT_ACTION_FORMAT_AS_PRIVATE = 48fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler "com.android.tv.settings.device.storage.FormatActivity.formatAsPrivate"; 49fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler public static final String INTENT_ACTION_FORMAT_AS_PUBLIC = 50fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler "com.android.tv.settings.device.storage.FormatActivity.formatAsPublic"; 51fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 52fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler private static final String SAVE_STATE_FORMAT_PRIVATE_DISK_ID = 53fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler "StorageResetActivity.formatPrivateDiskId"; 54fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler private static final String SAVE_STATE_FORMAT_DISK_DESC = 55fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler "StorageResetActivity.formatDiskDesc"; 56fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler private static final String SAVE_STATE_FORMAT_PUBLIC_DISK_ID = 57fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler "StorageResetActivity.formatPrivateDiskId"; 58fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 59fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler // Non-null means we're in the process of formatting this volume as private 60fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler private String mFormatAsPrivateDiskId; 61fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler // Non-null means we're in the process of formatting this volume as public 62fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler private String mFormatAsPublicDiskId; 63fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 64fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler private String mFormatDiskDesc; 65fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 66b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler private final BroadcastReceiver mFormatReceiver = new FormatReceiver(); 67fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler private PackageManager mPackageManager; 68fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler private StorageManager mStorageManager; 69fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 70fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler public static Intent getFormatAsPublicIntent(Context context, String diskId) { 71fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final Intent i = new Intent(context, FormatActivity.class); 72fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler i.setAction(INTENT_ACTION_FORMAT_AS_PUBLIC); 73fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler i.putExtra(DiskInfo.EXTRA_DISK_ID, diskId); 74fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler return i; 75fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 76fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 77fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler public static Intent getFormatAsPrivateIntent(Context context, String diskId) { 78fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final Intent i = new Intent(context, FormatActivity.class); 79fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler i.setAction(INTENT_ACTION_FORMAT_AS_PRIVATE); 80fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler i.putExtra(DiskInfo.EXTRA_DISK_ID, diskId); 81fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler return i; 82fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 83fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 84fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler @Override 85fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler protected void onCreate(@Nullable Bundle savedInstanceState) { 86fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler super.onCreate(savedInstanceState); 87fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 88fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mPackageManager = getPackageManager(); 89fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mStorageManager = getSystemService(StorageManager.class); 90fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 91b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final IntentFilter filter = new IntentFilter(); 92b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler filter.addAction(SettingsStorageService.ACTION_FORMAT_AS_PRIVATE); 93b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler filter.addAction(SettingsStorageService.ACTION_FORMAT_AS_PUBLIC); 94b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler LocalBroadcastManager.getInstance(this).registerReceiver(mFormatReceiver, filter); 95b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler 96fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if (savedInstanceState != null) { 97fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mFormatAsPrivateDiskId = 98fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler savedInstanceState.getString(SAVE_STATE_FORMAT_PRIVATE_DISK_ID); 99fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mFormatAsPublicDiskId = savedInstanceState.getString(SAVE_STATE_FORMAT_PUBLIC_DISK_ID); 100fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mFormatDiskDesc = savedInstanceState.getString(SAVE_STATE_FORMAT_DISK_DESC); 101fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } else { 102fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final String diskId = getIntent().getStringExtra(DiskInfo.EXTRA_DISK_ID); 103fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final String action = getIntent().getAction(); 104fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final Fragment f; 105fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if (TextUtils.equals(action, INTENT_ACTION_FORMAT_AS_PRIVATE)) { 106fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler f = FormatAsPrivateStepFragment.newInstance(diskId); 107fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } else if (TextUtils.equals(action, INTENT_ACTION_FORMAT_AS_PUBLIC)) { 108fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler f = FormatAsPublicStepFragment.newInstance(diskId); 109fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } else { 110fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler throw new IllegalStateException("No known action specified"); 111fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 112fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler getFragmentManager().beginTransaction() 113fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler .add(android.R.id.content, f) 114fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler .commit(); 115fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 116fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 117fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 118fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler @Override 119fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler protected void onResume() { 120fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler super.onResume(); 121b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (!TextUtils.isEmpty(mFormatAsPrivateDiskId)) { 122b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final VolumeInfo volumeInfo = findVolume(mFormatAsPrivateDiskId); 123b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (volumeInfo != null && volumeInfo.getType() == VolumeInfo.TYPE_PRIVATE) { 124b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler // Formatting must have completed while we were paused 125b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler // We've lost the benchmark data, so just assume the drive is fast enough 126b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler handleFormatAsPrivateComplete(-1, -1); 127b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } 128b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } 129b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } 130fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 131b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler @Override 132b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler protected void onDestroy() { 133b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler super.onDestroy(); 134b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler LocalBroadcastManager.getInstance(this).unregisterReceiver(mFormatReceiver); 135b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } 136b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler 137b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler private VolumeInfo findVolume(String diskId) { 138b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final List<VolumeInfo> vols = mStorageManager.getVolumes(); 139b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler for (final VolumeInfo vol : vols) { 140b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (TextUtils.equals(diskId, vol.getDiskId()) 141b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler && (vol.getType() == VolumeInfo.TYPE_PRIVATE)) { 142b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler return vol; 143b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } 144b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } 145b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler return null; 146fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 147fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 148fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler @Override 149fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler protected void onSaveInstanceState(@NonNull Bundle outState) { 150fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler super.onSaveInstanceState(outState); 151fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler outState.putString(SAVE_STATE_FORMAT_PRIVATE_DISK_ID, mFormatAsPrivateDiskId); 152fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler outState.putString(SAVE_STATE_FORMAT_PUBLIC_DISK_ID, mFormatAsPublicDiskId); 153fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler outState.putString(SAVE_STATE_FORMAT_DISK_DESC, mFormatDiskDesc); 154fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 155fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 156b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler private void handleFormatAsPrivateComplete(float privateBench, float internalBench) { 157b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (Math.abs(-1 - privateBench) < 0.1) { 158b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final float frac = privateBench / internalBench; 159b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler Log.d(TAG, "New volume is " + frac + "x the speed of internal"); 160b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler 161b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler // TODO: better threshold 162b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (privateBench > 2000000000) { 163b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler getFragmentManager().beginTransaction() 164b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler .replace(android.R.id.content, 165b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler SlowDriveStepFragment.newInstance()) 166b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler .commit(); 167b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler return; 168fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 169fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 170b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler launchMigrateStorageAndFinish(mFormatAsPrivateDiskId); 171fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 172fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 173b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler private class FormatReceiver extends BroadcastReceiver { 174fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 175fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler @Override 176b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler public void onReceive(Context context, Intent intent) { 177b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (TextUtils.equals(intent.getAction(), 178b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler SettingsStorageService.ACTION_FORMAT_AS_PRIVATE) 179b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler && !TextUtils.isEmpty(mFormatAsPrivateDiskId)) { 180b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final String diskId = intent.getStringExtra(DiskInfo.EXTRA_DISK_ID); 181b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (TextUtils.equals(mFormatAsPrivateDiskId, diskId)) { 182b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final boolean success = 183b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler intent.getBooleanExtra(SettingsStorageService.EXTRA_SUCCESS, false); 184b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (success) { 185fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if (isResumed()) { 186b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final float privateBench = intent.getFloatExtra( 187b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler SettingsStorageService.EXTRA_PRIVATE_BENCH, -1); 188b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final float internalBench = intent.getFloatExtra( 189b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler SettingsStorageService.EXTRA_INTERNAL_BENCH, -1); 190b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler handleFormatAsPrivateComplete(privateBench, internalBench); 191fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 192fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 193072a5491523bc3cb09b0198d6c42dd6a237371dbTony Mantler Toast.makeText(context, getString( 194b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler R.string.storage_format_success, mFormatDiskDesc), 195b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler Toast.LENGTH_SHORT).show(); 196b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } else { 197072a5491523bc3cb09b0198d6c42dd6a237371dbTony Mantler Toast.makeText(context, 198b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler getString(R.string.storage_format_failure, mFormatDiskDesc), 199b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler Toast.LENGTH_SHORT).show(); 200b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler finish(); 2010f64713c1f0379031e523fef2a0777cc11f7531aTony Mantler } 2020f64713c1f0379031e523fef2a0777cc11f7531aTony Mantler } 203b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } else if (TextUtils.equals(intent.getAction(), 204b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler SettingsStorageService.ACTION_FORMAT_AS_PUBLIC) 205b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler && !TextUtils.isEmpty(mFormatAsPublicDiskId)) { 206b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final String diskId = intent.getStringExtra(DiskInfo.EXTRA_DISK_ID); 207b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (TextUtils.equals(mFormatAsPublicDiskId, diskId)) { 208b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler final boolean success = 209b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler intent.getBooleanExtra(SettingsStorageService.EXTRA_SUCCESS, false); 210b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler if (success) { 211072a5491523bc3cb09b0198d6c42dd6a237371dbTony Mantler Toast.makeText(context, 212b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler getString(R.string.storage_format_success, 213b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler mFormatDiskDesc), Toast.LENGTH_SHORT).show(); 214b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } else { 215072a5491523bc3cb09b0198d6c42dd6a237371dbTony Mantler Toast.makeText(context, 216b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler getString(R.string.storage_format_failure, 217b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler mFormatDiskDesc), Toast.LENGTH_SHORT).show(); 218b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } 219b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler finish(); 220b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler } 221fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 222fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 223fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 224fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 225fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler @Override 226fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler public void onRequestFormatAsPrivate(String diskId) { 227fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final FormattingProgressFragment fragment = FormattingProgressFragment.newInstance(); 228fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler getFragmentManager().beginTransaction() 229fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler .replace(android.R.id.content, fragment) 230fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler .commit(); 231fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 232fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mFormatAsPrivateDiskId = diskId; 233fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final List<VolumeInfo> volumes = mStorageManager.getVolumes(); 234fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler for (final VolumeInfo volume : volumes) { 235fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if ((volume.getType() == VolumeInfo.TYPE_PRIVATE || 236fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler volume.getType() == VolumeInfo.TYPE_PUBLIC) && 237fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler TextUtils.equals(volume.getDiskId(), diskId)) { 238fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mFormatDiskDesc = mStorageManager.getBestVolumeDescription(volume); 239fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 240fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 241fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if (TextUtils.isEmpty(mFormatDiskDesc)) { 242fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final DiskInfo info = mStorageManager.findDiskById(diskId); 243fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if (info != null) { 244fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mFormatDiskDesc = info.getDescription(); 245fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 246fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 247b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler SettingsStorageService.formatAsPrivate(this, diskId); 248fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 249fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 25036d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler private void launchMigrateStorageAndFinish(String diskId) { 25136d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler final List<VolumeInfo> candidates = 25236d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler mPackageManager.getPrimaryStorageCandidateVolumes(); 25336d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler VolumeInfo moveTarget = null; 25436d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler for (final VolumeInfo candidate : candidates) { 25536d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler if (TextUtils.equals(candidate.getDiskId(), diskId)) { 25636d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler moveTarget = candidate; 25736d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler break; 25836d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler } 25936d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler } 26036d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler 26136d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler if (moveTarget != null) { 26236d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler startActivity(MigrateStorageActivity.getLaunchIntent(this, moveTarget.getId(), true)); 26336d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler } 26436d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler 26536d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler finish(); 26636d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler } 26736d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler 268fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler @Override 269fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler public void onRequestFormatAsPublic(String diskId, String volumeId) { 270fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final FormattingProgressFragment fragment = FormattingProgressFragment.newInstance(); 271fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler getFragmentManager().beginTransaction() 272fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler .replace(android.R.id.content, fragment) 273fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler .commit(); 274fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 275fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mFormatAsPublicDiskId = diskId; 276fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if (!TextUtils.isEmpty(volumeId)) { 277fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final VolumeInfo info = mStorageManager.findVolumeById(volumeId); 278fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if (info != null) { 279fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mFormatDiskDesc = mStorageManager.getBestVolumeDescription(info); 280fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 281fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 282fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if (TextUtils.isEmpty(mFormatDiskDesc)) { 283fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler final DiskInfo info = mStorageManager.findDiskById(diskId); 284fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler if (info != null) { 285fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler mFormatDiskDesc = info.getDescription(); 286fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 287fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 288b339f6e838fc5a4c3f51b18379b58de7b51b8b6bTony Mantler SettingsStorageService.formatAsPublic(this, diskId); 289fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 290fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 291fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler @Override 292fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler public void onCancelFormatDialog() { 293fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler finish(); 294fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler } 295fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler 29636d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler @Override 29736d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler public void onSlowDriveWarningComplete() { 29836d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler launchMigrateStorageAndFinish(mFormatAsPrivateDiskId); 29936d01a438bf77012c50b1164e5ecdd02dd699817Tony Mantler } 300fbd185f9f8ecdff72743b435c9e3cc4154606473Tony Mantler} 301