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
194bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.content.Context;
20e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.database.Cursor;
214bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.graphics.Bitmap;
22e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikovimport android.provider.ContactsContract.CommonDataKinds.Photo;
234bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.provider.ContactsContract.Data;
244bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.provider.ContactsContract.RawContacts;
254bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.util.AttributeSet;
26ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikovimport android.view.View;
27ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikovimport android.view.ViewGroup;
284bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamiltonimport android.widget.LinearLayout;
294bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
30e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R;
31cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.model.RawContactDelta;
32738ff8623dc77dd91a1b9023861e924ba5e4c27eChiao Chengimport com.android.contacts.common.model.ValuesDelta;
33cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.model.RawContactModifier;
34428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountType;
35428f008513d1591cc08fcfe2cf0c9237fb313241Chiao Chengimport com.android.contacts.common.model.account.AccountType.EditType;
36e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
374bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton/**
384bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * Base view that provides common code for the editor interaction for a specific
39851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * RawContact represented through an {@link RawContactDelta}.
404bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * <p>
414bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * Internal updates are performed against {@link ValuesDelta} so that the
42851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * source {@link RawContact} can be swapped out. Any state-based changes, such as
434bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton * adding {@link Data} rows or changing {@link EditType}, are performed through
44851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu * {@link RawContactModifier} to ensure that {@link AccountType} are enforced.
454bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton */
4672af89f9e497bb8ef54fe3deeec7e8477d192242Daniel Lehmannpublic abstract class BaseRawContactEditorView extends LinearLayout {
474bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
48ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    private PhotoEditorView mPhoto;
49ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    private boolean mHasPhotoEditor = false;
50ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
51ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    private View mBody;
52b18624f0cbca15e6a515316f7046ad814d54c970Dmitri Plotnikov    private View mDivider;
53ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
54ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    private boolean mExpanded = true;
554bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
5672af89f9e497bb8ef54fe3deeec7e8477d192242Daniel Lehmann    public BaseRawContactEditorView(Context context) {
574bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        super(context);
584bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
594bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
6072af89f9e497bb8ef54fe3deeec7e8477d192242Daniel Lehmann    public BaseRawContactEditorView(Context context, AttributeSet attrs) {
614bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        super(context, attrs);
624bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
634bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
64ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    @Override
65ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    protected void onFinishInflate() {
66ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        super.onFinishInflate();
67ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
68ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mBody = findViewById(R.id.body);
69b18624f0cbca15e6a515316f7046ad814d54c970Dmitri Plotnikov        mDivider = findViewById(R.id.divider);
70ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
71ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mPhoto = (PhotoEditorView)findViewById(R.id.edit_photo);
7202bb1252aa990813fa9e86ad75c458acc15e6801Dmitri Plotnikov        mPhoto.setEnabled(isEnabled());
73ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    }
74ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
75e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov    public void setGroupMetaData(Cursor groupMetaData) {
76e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov    }
77e843f916942fff482ec162eee2a23914e32182cfDmitri Plotnikov
784bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
794bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * Assign the given {@link Bitmap} to the internal {@link PhotoEditorView}
80851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * for the {@link RawContactDelta} currently being edited.
814bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
824bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public void setPhotoBitmap(Bitmap bitmap) {
834bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        mPhoto.setPhotoBitmap(bitmap);
844bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
854bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
86ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    protected void setHasPhotoEditor(boolean hasPhotoEditor) {
87ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mHasPhotoEditor = hasPhotoEditor;
88ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mPhoto.setVisibility(hasPhotoEditor ? View.VISIBLE : View.GONE);
89ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    }
90ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
914bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
924bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * Return true if the current {@link RawContacts} supports {@link Photo},
934bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * which means that {@link PhotoEditorView} is enabled.
944bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
954bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public boolean hasPhotoEditor() {
964bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        return mHasPhotoEditor;
974bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
984bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
994bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
1004bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * Return true if internal {@link PhotoEditorView} has a {@link Photo} set.
1014bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
1024bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public boolean hasSetPhoto() {
1034bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        return mPhoto.hasSetPhoto();
1044bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
1054bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
1064bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public PhotoEditorView getPhotoEditor() {
1074bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton        return mPhoto;
1084bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    }
1094bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
1104bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
1114bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * @return the RawContact ID that this editor is editing.
1124bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
1134bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    public abstract long getRawContactId();
1144bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton
1154bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton    /**
1164bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * Set the internal state for this view, given a current
117851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu     * {@link RawContactDelta} state and the {@link AccountType} that
1184bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     * apply to that state.
1194bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton     */
120851222a96b5d68602fb361ea3527101e893f67e3Maurice Chu    public abstract void setState(RawContactDelta state, AccountType source, ViewIdGenerator vig,
121681f36cc7cc49be781eedc4685eda2d1b2c0444cIsaac Katzenelson            boolean isProfile);
122ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
123ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    /* package */ void setExpanded(boolean value) {
124ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        // only allow collapsing if we are one of several children
125ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        final boolean newValue;
126ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        if (getParent() instanceof ViewGroup && ((ViewGroup) getParent()).getChildCount() == 1) {
127ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov            newValue = true;
128ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        } else {
129ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov            newValue = value;
130ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        }
131ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov
132ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        if (newValue == mExpanded) return;
133ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mExpanded = newValue;
134ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov        mBody.setVisibility(newValue ? View.VISIBLE : View.GONE);
135b18624f0cbca15e6a515316f7046ad814d54c970Dmitri Plotnikov        mDivider.setVisibility(newValue ? View.GONE : View.VISIBLE);
136ea54a96ada15c83086e854619789ea025244f7a6Dmitri Plotnikov    }
1374bef56bdbde4c6bd439ed2d528d4b99974359e18Jeff Hamilton}
138