123357198c440e6872d3aef3e608295db7f8273bcSteve Howardpackage com.android.providers.downloads;
223357198c440e6872d3aef3e608295db7f8273bcSteve Howard
39b4371da26f27cfa85d78e0bd4728309f9a445c9Vasu Noriimport android.app.DownloadManager;
493155e1da7e89d4925e244f5afa94afb8ada7381Steve Howardimport android.app.Notification;
593155e1da7e89d4925e244f5afa94afb8ada7381Steve Howardimport android.app.NotificationManager;
6af28400b74de05862b470412a5c92f68e99f59f8Steve Howardimport android.content.Context;
70a77c62a82503b38c484e0079648f0231dd85d53Steve Howardimport android.content.Intent;
80a77c62a82503b38c484e0079648f0231dd85d53Steve Howardimport android.content.pm.PackageManager.NameNotFoundException;
9af28400b74de05862b470412a5c92f68e99f59f8Steve Howardimport android.net.ConnectivityManager;
10af28400b74de05862b470412a5c92f68e99f59f8Steve Howardimport android.net.NetworkInfo;
110d4f9f105c3a31475a36e9a1edfa868c66ff455fSteve Howardimport android.provider.Settings;
120d4f9f105c3a31475a36e9a1edfa868c66ff455fSteve Howardimport android.provider.Settings.SettingNotFoundException;
13af28400b74de05862b470412a5c92f68e99f59f8Steve Howardimport android.telephony.TelephonyManager;
14af28400b74de05862b470412a5c92f68e99f59f8Steve Howardimport android.util.Log;
15af28400b74de05862b470412a5c92f68e99f59f8Steve Howard
1623357198c440e6872d3aef3e608295db7f8273bcSteve Howardclass RealSystemFacade implements SystemFacade {
17af28400b74de05862b470412a5c92f68e99f59f8Steve Howard    private Context mContext;
1893155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard    private NotificationManager mNotificationManager;
19af28400b74de05862b470412a5c92f68e99f59f8Steve Howard
20af28400b74de05862b470412a5c92f68e99f59f8Steve Howard    public RealSystemFacade(Context context) {
21af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        mContext = context;
2293155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard        mNotificationManager = (NotificationManager)
2393155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard                mContext.getSystemService(Context.NOTIFICATION_SERVICE);
24af28400b74de05862b470412a5c92f68e99f59f8Steve Howard    }
25af28400b74de05862b470412a5c92f68e99f59f8Steve Howard
2623357198c440e6872d3aef3e608295db7f8273bcSteve Howard    public long currentTimeMillis() {
2723357198c440e6872d3aef3e608295db7f8273bcSteve Howard        return System.currentTimeMillis();
2823357198c440e6872d3aef3e608295db7f8273bcSteve Howard    }
29af28400b74de05862b470412a5c92f68e99f59f8Steve Howard
30961024389b3782936a40a7d090d670290bb66c3cJeff Sharkey    public NetworkInfo getActiveNetworkInfo(int uid) {
31af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        ConnectivityManager connectivity =
32af28400b74de05862b470412a5c92f68e99f59f8Steve Howard                (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
33af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        if (connectivity == null) {
34af28400b74de05862b470412a5c92f68e99f59f8Steve Howard            Log.w(Constants.TAG, "couldn't get connectivity manager");
35071bd7acb3185f4f1e807855605c5e6018e9742fSteve Howard            return null;
36af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        }
37af28400b74de05862b470412a5c92f68e99f59f8Steve Howard
38961024389b3782936a40a7d090d670290bb66c3cJeff Sharkey        final NetworkInfo activeInfo = connectivity.getActiveNetworkInfoForUid(uid);
39961024389b3782936a40a7d090d670290bb66c3cJeff Sharkey        if (activeInfo == null && Constants.LOGVV) {
40961024389b3782936a40a7d090d670290bb66c3cJeff Sharkey            Log.v(Constants.TAG, "network is not available");
41af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        }
42961024389b3782936a40a7d090d670290bb66c3cJeff Sharkey        return activeInfo;
43af28400b74de05862b470412a5c92f68e99f59f8Steve Howard    }
44af28400b74de05862b470412a5c92f68e99f59f8Steve Howard
45af28400b74de05862b470412a5c92f68e99f59f8Steve Howard    public boolean isNetworkRoaming() {
46af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        ConnectivityManager connectivity =
47af28400b74de05862b470412a5c92f68e99f59f8Steve Howard            (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
48af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        if (connectivity == null) {
49af28400b74de05862b470412a5c92f68e99f59f8Steve Howard            Log.w(Constants.TAG, "couldn't get connectivity manager");
50af28400b74de05862b470412a5c92f68e99f59f8Steve Howard            return false;
51af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        }
52af28400b74de05862b470412a5c92f68e99f59f8Steve Howard
53af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        NetworkInfo info = connectivity.getActiveNetworkInfo();
54af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        boolean isMobile = (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE);
55af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        boolean isRoaming = isMobile && TelephonyManager.getDefault().isNetworkRoaming();
56071bd7acb3185f4f1e807855605c5e6018e9742fSteve Howard        if (Constants.LOGVV && isRoaming) {
57071bd7acb3185f4f1e807855605c5e6018e9742fSteve Howard            Log.v(Constants.TAG, "network is roaming");
58af28400b74de05862b470412a5c92f68e99f59f8Steve Howard        }
59071bd7acb3185f4f1e807855605c5e6018e9742fSteve Howard        return isRoaming;
60071bd7acb3185f4f1e807855605c5e6018e9742fSteve Howard    }
61071bd7acb3185f4f1e807855605c5e6018e9742fSteve Howard
620d4f9f105c3a31475a36e9a1edfa868c66ff455fSteve Howard    public Long getMaxBytesOverMobile() {
639b4371da26f27cfa85d78e0bd4728309f9a445c9Vasu Nori        return DownloadManager.getMaxBytesOverMobile(mContext);
64af28400b74de05862b470412a5c92f68e99f59f8Steve Howard    }
650a77c62a82503b38c484e0079648f0231dd85d53Steve Howard
660a77c62a82503b38c484e0079648f0231dd85d53Steve Howard    @Override
67d319729622da1893e895f2e35f41d01ecdca3705Steve Howard    public Long getRecommendedMaxBytesOverMobile() {
689b4371da26f27cfa85d78e0bd4728309f9a445c9Vasu Nori        return DownloadManager.getRecommendedMaxBytesOverMobile(mContext);
69d319729622da1893e895f2e35f41d01ecdca3705Steve Howard    }
70d319729622da1893e895f2e35f41d01ecdca3705Steve Howard
71d319729622da1893e895f2e35f41d01ecdca3705Steve Howard    @Override
720a77c62a82503b38c484e0079648f0231dd85d53Steve Howard    public void sendBroadcast(Intent intent) {
730a77c62a82503b38c484e0079648f0231dd85d53Steve Howard        mContext.sendBroadcast(intent);
740a77c62a82503b38c484e0079648f0231dd85d53Steve Howard    }
750a77c62a82503b38c484e0079648f0231dd85d53Steve Howard
760a77c62a82503b38c484e0079648f0231dd85d53Steve Howard    @Override
770a77c62a82503b38c484e0079648f0231dd85d53Steve Howard    public boolean userOwnsPackage(int uid, String packageName) throws NameNotFoundException {
780a77c62a82503b38c484e0079648f0231dd85d53Steve Howard        return mContext.getPackageManager().getApplicationInfo(packageName, 0).uid == uid;
790a77c62a82503b38c484e0079648f0231dd85d53Steve Howard    }
8093155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard
8193155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard    @Override
823398db8f3b195959faa2a7cf09918f364432ac28Steve Howard    public void postNotification(long id, Notification notification) {
833398db8f3b195959faa2a7cf09918f364432ac28Steve Howard        /**
843398db8f3b195959faa2a7cf09918f364432ac28Steve Howard         * TODO: The system notification manager takes ints, not longs, as IDs, but the download
853398db8f3b195959faa2a7cf09918f364432ac28Steve Howard         * manager uses IDs take straight from the database, which are longs.  This will have to be
863398db8f3b195959faa2a7cf09918f364432ac28Steve Howard         * dealt with at some point.
873398db8f3b195959faa2a7cf09918f364432ac28Steve Howard         */
883398db8f3b195959faa2a7cf09918f364432ac28Steve Howard        mNotificationManager.notify((int) id, notification);
8993155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard    }
9093155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard
9193155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard    @Override
923398db8f3b195959faa2a7cf09918f364432ac28Steve Howard    public void cancelNotification(long id) {
933398db8f3b195959faa2a7cf09918f364432ac28Steve Howard        mNotificationManager.cancel((int) id);
9493155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard    }
9593155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard
9693155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard    @Override
9793155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard    public void cancelAllNotifications() {
9893155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard        mNotificationManager.cancelAll();
9993155e1da7e89d4925e244f5afa94afb8ada7381Steve Howard    }
100e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard
101e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    @Override
102e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    public void startThread(Thread thread) {
103e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard        thread.start();
104e6a05a1aa4697440e9630d12b741b3bae321fe49Steve Howard    }
10523357198c440e6872d3aef3e608295db7f8273bcSteve Howard}
106