BaseRawContactEditorView.java revision b18624f0cbca15e6a515316f7046ad814d54c970
14bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton/*
24bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * Copyright (C) 2009 The Android Open Source Project
34bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton *
44bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License");
54bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * you may not use this file except in compliance with the License.
64bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * You may obtain a copy of the License at
74bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton *
84bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton *      http://www.apache.org/licenses/LICENSE-2.0
94bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton *
104bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * Unless required by applicable law or agreed to in writing, software
114bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS,
124bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * See the License for the specific language governing permissions and
144bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * limitations under the License.
154bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton */
164bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
1718ffaa2561cc7dd2e3ef81737e6537931c0a9a11Dmitri Plotnikovpackage com.android.contacts.editor;
184bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
19ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikovimport com.android.contacts.R;
204597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType;
214597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikovimport com.android.contacts.model.AccountType.EditType;
22e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport com.android.contacts.model.EntityDelta;
234bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport com.android.contacts.model.EntityDelta.ValuesDelta;
24e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport com.android.contacts.model.EntityModifier;
254bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
264bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.content.Context;
274bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.content.Entity;
28e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.database.Cursor;
294bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.graphics.Bitmap;
30e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo;
314bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.provider.ContactsContract.Data;
324bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.provider.ContactsContract.RawContacts;
334bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.util.AttributeSet;
34ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikovimport android.view.View;
35ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikovimport android.view.ViewGroup;
364bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.widget.LinearLayout;
374bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
384bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton/**
394bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * Base view that provides common code for the editor interaction for a specific
40ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov * RawContact represented through an {@link EntityDelta}.
414bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * <p>
424bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * Internal updates are performed against {@link ValuesDelta} so that the
434bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * source {@link Entity} can be swapped out. Any state-based changes, such as
444bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * adding {@link Data} rows or changing {@link EditType}, are performed through
454597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikov * {@link EntityModifier} to ensure that {@link AccountType} are enforced.
464bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton */
4772af89f9e497bb8ef54fe3deeec7e8477d192242Daniel Lehmannpublic abstract class BaseRawContactEditorView extends LinearLayout {
484bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
49ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    private PhotoEditorView mPhoto;
50ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    private boolean mHasPhotoEditor = false;
51ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
52ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    private View mHeader;
53ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    private View mBody;
54b18624f0cbca15e6a515316f7046ad814d54c970Dmitri Plotnikov    private View mDivider;
55ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
56ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    private boolean mExpanded = true;
574bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
5872af89f9e497bb8ef54fe3deeec7e8477d192242Daniel Lehmann    public BaseRawContactEditorView(Context context) {
594bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        super(context);
604bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
614bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
6272af89f9e497bb8ef54fe3deeec7e8477d192242Daniel Lehmann    public BaseRawContactEditorView(Context context, AttributeSet attrs) {
634bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        super(context, attrs);
644bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
654bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
66ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    @Override
67ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    protected void onFinishInflate() {
68ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        super.onFinishInflate();
69ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
70ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mHeader = findViewById(R.id.header);
71ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mBody = findViewById(R.id.body);
72b18624f0cbca15e6a515316f7046ad814d54c970Dmitri Plotnikov        mDivider = findViewById(R.id.divider);
73ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mHeader.setOnClickListener(new OnClickListener() {
74ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov            @Override
75ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov            public void onClick(View v) {
76ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov                setExpanded(!mExpanded);
77ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov            }
78ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        });
79ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
80ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mPhoto = (PhotoEditorView)findViewById(R.id.edit_photo);
8102bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov        mPhoto.setEnabled(isEnabled());
82ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    }
83ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
84e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov    public void setGroupMetaData(Cursor groupMetaData) {
85e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov    }
86e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov
874bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
884bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * Assign the given {@link Bitmap} to the internal {@link PhotoEditorView}
894bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * for the {@link EntityDelta} currently being edited.
904bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
914bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public void setPhotoBitmap(Bitmap bitmap) {
924bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        mPhoto.setPhotoBitmap(bitmap);
934bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
944bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
95ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    protected void setHasPhotoEditor(boolean hasPhotoEditor) {
96ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mHasPhotoEditor = hasPhotoEditor;
97ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mPhoto.setVisibility(hasPhotoEditor ? View.VISIBLE : View.GONE);
98ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    }
99ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
1004bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
1014bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * Return true if the current {@link RawContacts} supports {@link Photo},
1024bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * which means that {@link PhotoEditorView} is enabled.
1034bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
1044bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public boolean hasPhotoEditor() {
1054bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        return mHasPhotoEditor;
1064bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
1074bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
1084bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
1094bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * Return true if internal {@link PhotoEditorView} has a {@link Photo} set.
1104bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
1114bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public boolean hasSetPhoto() {
1124bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        return mPhoto.hasSetPhoto();
1134bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
1144bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
1154bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public PhotoEditorView getPhotoEditor() {
1164bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        return mPhoto;
1174bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
1184bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
1194bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
1204bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * @return the RawContact ID that this editor is editing.
1214bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
1224bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public abstract long getRawContactId();
1234bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
1244bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
1254bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * Set the internal state for this view, given a current
1264597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikov     * {@link EntityDelta} state and the {@link AccountType} that
1274bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * apply to that state.
1284bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
1294597c92d655d45447780b32c7572acef110b6ed1Dmitri Plotnikov    public abstract void setState(EntityDelta state, AccountType source, ViewIdGenerator vig);
130ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
131ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    /* package */ void setExpanded(boolean value) {
132ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        // only allow collapsing if we are one of several children
133ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        final boolean newValue;
134ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        if (getParent() instanceof ViewGroup && ((ViewGroup) getParent()).getChildCount() == 1) {
135ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov            newValue = true;
136ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        } else {
137ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov            newValue = value;
138ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        }
139ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
140ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        if (newValue == mExpanded) return;
141ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mExpanded = newValue;
142ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mBody.setVisibility(newValue ? View.VISIBLE : View.GONE);
143b18624f0cbca15e6a515316f7046ad814d54c970Dmitri Plotnikov        mDivider.setVisibility(newValue ? View.GONE : View.VISIBLE);
144ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    }
1454bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton}
146