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