13c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen/*
23c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen * Copyright (C) 2009 The Android Open Source Project
33c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen *
43c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen * Licensed under the Apache License, Version 2.0 (the "License");
53c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen * you may not use this file except in compliance with the License.
63c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen * You may obtain a copy of the License at
73c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen *
83c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen *      http://www.apache.org/licenses/LICENSE-2.0
93c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen *
103c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen * Unless required by applicable law or agreed to in writing, software
113c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen * distributed under the License is distributed on an "AS IS" BASIS,
123c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen * See the License for the specific language governing permissions and
143c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen * limitations under the License.
153c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen */
163c02f2877dc2f8f0b5c01d03fa2b487c040e4000Wei-Ta Chen
17d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatpackage com.cooliris.app;
18d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
19d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatimport android.app.Activity;
20d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatimport android.content.Context;
21d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatimport android.os.Handler;
22d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatimport android.os.HandlerThread;
23d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatimport android.util.DisplayMetrics;
24d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatimport android.widget.Toast;
25d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
26d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatimport java.util.HashMap;
27d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatimport java.util.TimeZone;
28d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
29d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatimport com.cooliris.media.ReverseGeocoder;
30d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
31d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat/*
32d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat *  TODO: consider adding HashMap<object, object> for globals globals
33d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat *  TODO: hook up other activity classes to App (besides Gallery and Search)
34d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat */
35d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkatpublic class App {
36d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat	static private final HashMap<Context, App> mMap = new HashMap<Context, App>();
37d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
38d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat	static public App get(Context context) {
39d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat		return mMap.get(context);
40d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat	}
41d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
42d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    public static final TimeZone CURRENT_TIME_ZONE = TimeZone.getDefault();
43d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    public static float PIXEL_DENSITY = 0.0f;
44d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
45d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat	private final Context mContext;
46d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    private final HandlerThread mHandlerThread = new HandlerThread("AppHandlerThread");
47d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    private final Handler mHandler;
48d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    private ReverseGeocoder mReverseGeocoder = null;
49d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
50d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    private boolean mPaused = false;
51d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
52d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat	public App(Context context) {
53d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat		// register
54d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat		mMap.put(context, this);
55d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
56d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat		mContext = context;
57d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
58d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat		if(PIXEL_DENSITY == 0.0f) {
59d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat			DisplayMetrics metrics = new DisplayMetrics();
60d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat			((Activity)mContext).getWindowManager().getDefaultDisplay().getMetrics(metrics);
61d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat			PIXEL_DENSITY = metrics.density;
62d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat		}
63d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
64d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        mHandlerThread.start();
65d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        mHandler = new Handler(mHandlerThread.getLooper());
66d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
67d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat	    mReverseGeocoder = new ReverseGeocoder(mContext);
68d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat	}
69d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
70d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat	public void shutdown() {
71d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        mReverseGeocoder.shutdown();
72d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
73d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        // unregister
74d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        mMap.put(mContext, null);
75d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat	}
76d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
77d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    public Context getContext() {
78d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        return mContext;
79d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    }
80d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
81d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    public Handler getHandler() {
82d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        while (mHandler == null) {
83d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat            // Wait till the handler is created.
84d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat            ;
85d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        }
86d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        return mHandler;
87d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    }
88d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
89d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    public ReverseGeocoder getReverseGeocoder() {
90d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        return mReverseGeocoder;
91d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    }
92d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
93d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    public boolean isPaused() {
94d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    	return mPaused;
95d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    }
96d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
97d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    public void onCreate(Bundle savedInstanceState) {
98d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    }
99d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//
100d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    public void onStart() {
101d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    }
102d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//
103d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    public void onRestart() {
104d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    }
105d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
106d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    public void onResume() {
107d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    	mPaused = false;
108d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    }
109d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
110d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    public void onPause() {
111d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    	mReverseGeocoder.flushCache();
112d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    	mPaused = true;
113d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    }
114d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
115d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    public void onStop() {
116d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//
117d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    }
118d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//
119d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    public void onDestroy() {
120d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat//    }
121d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat
122d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    public void showToast(final String string, final int duration) {
123d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        mHandler.post(new Runnable() {
124d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat            public void run() {
125d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat                Toast.makeText(mContext, string, duration).show();
126d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat            }
127d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat        });
128d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat    }
129d93f177bf2bc26f4ad64ca2f7725da8b0347a77fVenkat}
130