16f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov/*
26f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project
36f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov *
46f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
56f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * you may not use this file except in compliance with the License.
66f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * You may obtain a copy of the License at
76f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov *
86f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
96f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov *
106f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
116f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
126f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * See the License for the specific language governing permissions and
146f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * limitations under the License.
156f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov */
166f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov
176f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikovpackage com.android.contacts;
186f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov
1950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onukiimport android.app.Fragment;
2050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onukiimport android.app.FragmentManager;
214d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onukiimport android.app.FragmentTransaction;
221173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikovimport android.content.ContentResolver;
233a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikovimport android.content.Intent;
24072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikovimport android.content.SharedPreferences;
253a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikovimport android.os.Bundle;
2650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onukiimport android.view.View;
276f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov
28d7ca03e23948c3b2d5f97ec5598d8b50e3fc0b25Chiao Chengimport com.android.contacts.common.activity.TransactionSafeActivity;
29cd321f65f1e50409812976380ad1f0fdb3fa35cbYorke Leeimport com.android.contacts.common.test.InjectedServices;
30e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng
316f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov/**
326f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov * A common superclass for Contacts activities that handles application-wide services.
336f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov */
3418e2b6f48045eebd802ff560420e1ad19b2e2da8Katherine Kuanpublic abstract class ContactsActivity extends TransactionSafeActivity
353a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    implements ContactSaveService.Listener
363a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov{
376f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov
381173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov    private ContentResolver mContentResolver;
391173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov
401173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov    @Override
411173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov    public ContentResolver getContentResolver() {
421173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov        if (mContentResolver == null) {
431173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov            InjectedServices services = ContactsApplication.getInjectedServices();
441173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov            if (services != null) {
451173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov                mContentResolver = services.getContentResolver();
461173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov            }
471173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov            if (mContentResolver == null) {
481173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov                mContentResolver = super.getContentResolver();
491173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov            }
501173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov        }
511173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov        return mContentResolver;
521173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov    }
531173ae29217fc83f254404f8a5fa10419ee83c93Dmitri Plotnikov
546f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov    @Override
55072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov    public SharedPreferences getSharedPreferences(String name, int mode) {
56072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov        InjectedServices services = ContactsApplication.getInjectedServices();
57072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov        if (services != null) {
58072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov            SharedPreferences prefs = services.getSharedPreferences();
59072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov            if (prefs != null) {
60072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov                return prefs;
61072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov            }
62072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov        }
63072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov
64072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov        return super.getSharedPreferences(name, mode);
65072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov    }
66072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov
67072d91171c749f43b64900118e6f4dcbdd7b1097Dmitri Plotnikov    @Override
686f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov    public Object getSystemService(String name) {
696f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov        Object service = super.getSystemService(name);
706f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov        if (service != null) {
716f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov            return service;
726f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov        }
736f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov
746f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov        return getApplicationContext().getSystemService(name);
756f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov    }
763a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov
773a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    @Override
783a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    protected void onCreate(Bundle savedInstanceState) {
793a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov        ContactSaveService.registerListener(this);
803a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov        super.onCreate(savedInstanceState);
813a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    }
823a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov
833a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    @Override
843a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    protected void onDestroy() {
853a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov        ContactSaveService.unregisterListener(this);
863a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov        super.onDestroy();
873a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    }
883a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov
893a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    @Override
903a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    public void onServiceCompleted(Intent callbackIntent) {
913a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov        onNewIntent(callbackIntent);
923a6a905a39e6cbb3b2dc99835cdf28c84437691aDmitri Plotnikov    }
9350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
9450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    /**
9550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * Convenient version of {@link FragmentManager#findFragmentById(int)}, which throws
9650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * an exception if the fragment doesn't exist.
9750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     */
9850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    @SuppressWarnings("unchecked")
9950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    public <T extends Fragment> T getFragment(int id) {
10050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        T result = (T)getFragmentManager().findFragmentById(id);
10150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        if (result == null) {
10250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            throw new IllegalArgumentException("fragment 0x" + Integer.toHexString(id)
10350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki                    + " doesn't exist");
10450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        }
10550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        return result;
10650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    }
10750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki
10850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    /**
10950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * Convenient version of {@link #findViewById(int)}, which throws
11050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     * an exception if the view doesn't exist.
11150445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki     */
11250445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    @SuppressWarnings("unchecked")
11350445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    public <T extends View> T getView(int id) {
11450445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        T result = (T)findViewById(id);
11550445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        if (result == null) {
11650445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki            throw new IllegalArgumentException("view 0x" + Integer.toHexString(id)
11750445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki                    + " doesn't exist");
11850445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        }
11950445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki        return result;
12050445e9d1efb1fa046d9a1232c973b4c96e1f52dMakoto Onuki    }
1214d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
1224d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    protected static void showFragment(FragmentTransaction ft, Fragment f) {
1234d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        if ((f != null) && f.isHidden()) ft.show(f);
1244d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
1254d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki
1264d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    protected static void hideFragment(FragmentTransaction ft, Fragment f) {
1274d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki        if ((f != null) && !f.isHidden()) ft.hide(f);
1284d788fc27ac855bd6e0cec17dff39a18564f0089Makoto Onuki    }
1296f667b55687bf9193323802e8f3234f0ab254388Dmitri Plotnikov}
130