120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood/*
220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * Copyright (C) 2010 The Android Open Source Project
320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood *
420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * you may not use this file except in compliance with the License.
620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * You may obtain a copy of the License at
720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood *
820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood *
1020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * Unless required by applicable law or agreed to in writing, software
1120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
1220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * See the License for the specific language governing permissions and
1420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * limitations under the License.
1520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood */
1620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
1720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodpackage com.android.camerabrowser;
1820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
1920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.app.ListActivity;
2020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.content.Context;
2120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.content.Intent;
2220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.database.Cursor;
2320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.graphics.Bitmap;
2420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.graphics.BitmapFactory;
2520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.mtp.MtpConstants;
2620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.mtp.MtpDevice;
2720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.mtp.MtpObjectInfo;
2820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.os.Bundle;
2920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.util.Log;
3020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.view.LayoutInflater;
3120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.view.View;
3220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.view.ViewGroup;
3320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.widget.BaseAdapter;
3420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.widget.ImageView;
3520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.widget.ListView;
3620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport android.widget.TextView;
3720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
3820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodimport java.util.List;
3920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
4020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood /**
4120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood * A list view displaying all objects within a container (folder or storage unit).
4220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood */
4320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwoodpublic class ObjectBrowser extends ListActivity {
4420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
4520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private static final String TAG = "ObjectBrowser";
4620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
4720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private MtpClient mClient;
4820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private List<MtpObjectInfo> mObjectList;
4920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private String mDeviceName;
5020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private int mStorageID;
5120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private int mObjectID;
5220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private DeviceDisconnectedReceiver mDisconnectedReceiver;
5320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
5420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    private class ObjectAdapter extends BaseAdapter {
5520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        private final Context mContext;
5620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        private final LayoutInflater mInflater;
5720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
5820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        public ObjectAdapter(Context c) {
5920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            mContext = c;
6020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            mInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
6120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
6220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
6320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        public int getCount() {
6420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            if (mObjectList == null) {
6520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                return 0;
6620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            } else {
6720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                return mObjectList.size();
6820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            }
6920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
7020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
7120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        public Object getItem(int position) {
7220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            return mObjectList.get(position);
7320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
7420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
7520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        public long getItemId(int position) {
7620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            return position;
7720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
7820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
7920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        public View getView(int position, View convertView, ViewGroup parent) {
8020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            View view;
8120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            if (convertView == null) {
8220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                view = mInflater.inflate(R.layout.object_list, parent, false);
8320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            } else {
8420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                view = convertView;
8520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            }
8620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
8720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            TextView nameView = (TextView)view.findViewById(R.id.name);
8820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            MtpObjectInfo info = mObjectList.get(position);
8920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            nameView.setText(info.getName());
9020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
9120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            int thumbFormat = info.getThumbFormat();
9220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            if (thumbFormat == MtpConstants.FORMAT_EXIF_JPEG
9320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                    || thumbFormat == MtpConstants.FORMAT_JFIF) {
9420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                byte[] thumbnail = mClient.getThumbnail(mDeviceName, info.getObjectHandle());
9520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                if (thumbnail != null) {
9620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                    Bitmap bitmap = BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length);
9720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                    if (bitmap != null) {
9820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                        ImageView thumbView = (ImageView)view.findViewById(R.id.thumbnail);
9920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                        thumbView.setImageBitmap(bitmap);
10020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                    }
10120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood                }
10220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            }
10320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            return view;
10420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
10520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
10620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
10720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    @Override
10820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    protected void onCreate(Bundle savedInstanceState) {
10920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        super.onCreate(savedInstanceState);
11020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
11120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mClient = ((CameraBrowserApplication)getApplication()).getMtpClient();
11220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mDeviceName = getIntent().getStringExtra("device");
11320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mStorageID = getIntent().getIntExtra("storage", 0);
11420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mObjectID = getIntent().getIntExtra("object", 0);
11520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mDisconnectedReceiver = new DeviceDisconnectedReceiver(this, mDeviceName);
11620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
11720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
11820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    @Override
11920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    protected void onResume() {
12020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        super.onResume();
12120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
12220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        mObjectList = mClient.getObjectList(mDeviceName, mStorageID, mObjectID);
12320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        setListAdapter(new ObjectAdapter(this));
12420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
12520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
12620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    @Override
12720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    protected void onDestroy() {
12820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        unregisterReceiver(mDisconnectedReceiver);
12920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        super.onDestroy();
13020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
13120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood
13220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    @Override
13320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    protected void onListItemClick(ListView l, View v, int position, long id) {
13420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        MtpObjectInfo info = mObjectList.get(position);
13520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        Intent intent;
13620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        if (info.getFormat() == MtpConstants.FORMAT_ASSOCIATION) {
13720bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            intent = new Intent(this, ObjectBrowser.class);
13820bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        } else {
13920bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood            intent = new Intent(this, ObjectViewer.class);
14020bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        }
14120bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        intent.putExtra("device", mDeviceName);
14220bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        intent.putExtra("storage", mStorageID);
14320bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        intent.putExtra("object", info.getObjectHandle());
14420bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood        startActivity(intent);
14520bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood    }
14620bc97fc541610a296d12e25570ac3eb6d599673Mike Lockwood}
147