UsbStorageActivity.java

来源:互联网 发布:水墨风手游 知乎 编辑:程序博客网 时间:2024/06/06 15:04
/* * 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();    }}


原创粉丝点击