UsbStorageActivity.java

/* * Copyright (C) 2007 Google Inc. * * 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.server.status; import com.android.internal.R; import android.app.Activity; import android.app.ActivityManager; import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.DialogInterface.OnCancelListener; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.os.storage.IMountService; import android.os.storage.StorageManager; import android.os.storage.StorageEventListener; import android.os.RemoteException; import android.os.ServiceManager; import android.widget.ImageView; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.view.View; import android.view.Window; import android.util.Log; import java.util.List; /** * This activity is shown to the user for him/her to enable USB mass storage * on-demand (that is, when the USB cable is connected). It uses the alert * dialog style. It will be launched from a notification. */ public class UsbStorageActivity extends Activity implements View.OnClickListener, OnCancelListener { private static final String TAG = "UsbStorageActivity"; private Button mMountButton; private Button mUnmountButton; private ProgressBar mProgressBar; private TextView mBanner; private TextView mMessage; private ImageView mIcon; private StorageManager mStorageManager = null; private static final int DLG_CONFIRM_KILL_STORAGE_USERS = 1; private static final int DLG_ERROR_SHARING = 2; static final boolean localLOGV = false; /** Used to detect when the USB cable is unplugged, so we can call finish() */ private BroadcastReceiver mBatteryReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() == Intent.ACTION_BATTERY_CHANGED) { handleBatteryChanged(intent); } } }; private StorageEventListener mStorageListener = new StorageEventListener() { @Override public void onStorageStateChanged(String path, String oldState, String newState) { final boolean on = newState.equals(Environment.MEDIA_SHARED); switchDisplay(on); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mStorageManager == null) { mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); if (mStorageManager == null) { Log.w(TAG, "Failed to get StorageManager"); } } requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setProgressBarIndeterminateVisibility(true); setTitle(getString(com.android.internal.R.string.usb_storage_activity_title)); setContentView(com.android.internal.R.layout.usb_storage_activity); mIcon = (ImageView) findViewById(com.android.internal.R.id.icon); mBanner = (TextView) findViewById(com.android.internal.R.id.banner); mMessage = (TextView) findViewById(com.android.internal.R.id.message); mMountButton = (Button) findViewById(com.android.internal.R.id.mount_button); mMountButton.setOnClickListener(this); mUnmountButton = (Button) findViewById(com.android.internal.R.id.unmount_button); mUnmountButton.setOnClickListener(this); mProgressBar = (ProgressBar) findViewById(com.android.internal.R.id.progress); } private void switchDisplay(boolean usbStorageInUse) { if (usbStorageInUse) { mProgressBar.setVisibility(View.GONE); mUnmountButton.setVisibility(View.VISIBLE); mMountButton.setVisibility(View.GONE); mIcon.setImageResource(com.android.internal.R.drawable.usb_android_connected); mBanner.setText(com.android.internal.R.string.usb_storage_stop_title); mMessage.setText(com.android.internal.R.string.usb_storage_stop_message); } else { mProgressBar.setVisibility(View.GONE); mUnmountButton.setVisibility(View.GONE); mMountButton.setVisibility(View.VISIBLE); mIcon.setImageResource(com.android.internal.R.drawable.usb_android); mBanner.setText(com.android.internal.R.string.usb_storage_title); mMessage.setText(com.android.internal.R.string.usb_storage_message); } } @Override protected void onResume() { super.onResume(); mStorageManager.registerListener(mStorageListener); registerReceiver(mBatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); try { switchDisplay(mStorageManager.isUsbMassStorageEnabled()); } catch (Exception ex) { Log.e(TAG, "Failed to read UMS enable state", ex); } } @Override protected void onPause() { super.onPause(); unregisterReceiver(mBatteryReceiver); if (mStorageManager == null && mStorageListener != null) { mStorageManager.unregisterListener(mStorageListener); } } private void handleBatteryChanged(Intent intent) { int pluggedType = intent.getIntExtra("plugged", 0); if (pluggedType == 0) { // It was disconnected from the plug, so finish finish(); } } private IMountService getMountService() { IBinder service = ServiceManager.getService("mount"); if (service != null) { return IMountService.Stub.asInterface(service); } return null; } @Override public Dialog onCreateDialog(int id, Bundle args) { switch (id) { case DLG_CONFIRM_KILL_STORAGE_USERS: return new AlertDialog.Builder(this) .setTitle(R.string.dlg_confirm_kill_storage_users_title) .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { switchUsbMassStorageAsync(true); }}) .setNegativeButton(R.string.cancel, null) .setMessage(R.string.dlg_confirm_kill_storage_users_text) .setOnCancelListener(this) .create(); case DLG_ERROR_SHARING: return new AlertDialog.Builder(this) .setTitle(R.string.dlg_error_title) .setNeutralButton(R.string.dlg_ok, null) .setMessage(R.string.usb_storage_error_message) .setOnCancelListener(this) .create(); } return null; } private void showDialogInner(int id) { removeDialog(id); showDialog(id); } private void switchUsbMassStorageAsync(boolean on) { mUnmountButton.setVisibility(View.GONE); mMountButton.setVisibility(View.GONE); mProgressBar.setVisibility(View.VISIBLE); // will be hidden once USB mass storage kicks in (or fails) final boolean _on = on; new Thread() { public void run() { if (_on) { mStorageManager.enableUsbMassStorage(); } else { mStorageManager.disableUsbMassStorage(); } } }.start(); } private void checkStorageUsers() { IMountService ims = getMountService(); if (ims == null) { // Display error dialog showDialogInner(DLG_ERROR_SHARING); } String extStoragePath = Environment.getExternalStorageDirectory().toString(); boolean showDialog = false; try { int[] stUsers = ims.getStorageUsers(extStoragePath); if (stUsers != null && stUsers.length > 0) { showDialog = true; } else { // List of applications on sdcard. ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<ApplicationInfo> infoList = am.getRunningExternalApplications(); if (infoList != null && infoList.size() > 0) { showDialog = true; } } } catch (RemoteException e) { // Display error dialog showDialogInner(DLG_ERROR_SHARING); } if (showDialog) { // Display dialog to user showDialogInner(DLG_CONFIRM_KILL_STORAGE_USERS); } else { if (localLOGV) Log.i(TAG, "Enabling UMS"); switchUsbMassStorageAsync(true); } } public void onClick(View v) { if (v == mMountButton) { // Check for list of storage users and display dialog if needed. checkStorageUsers(); } else if (v == mUnmountButton) { if (localLOGV) Log.i(TAG, "Disabling UMS"); switchUsbMassStorageAsync(false); } } public void onCancel(DialogInterface dialog) { finish(); } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值