morristech
5/2/2019 - 10:57 AM

NetworkContentProvider.java

package com.f.programming;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.util.Log;

public class NetworkContentProvider extends ContentProvider {

    private static final String TAG = "NetworkContentProvider";

    public static final String URL_QUERY_KEY = "url";

    public static final String AUTHORITY = "com.f.programming.networkcontentprovider";
    public static final String NETWORK_PATH = "newtwork";

    private static final int BASE_URI_CODE = 0;
    private static final int NETWORK_CODE = 1;

    private final static UriMatcher sUriMatcher = new UriMatcher(BASE_URI_CODE);
    static
    {
        sUriMatcher.addURI(AUTHORITY, NETWORK_PATH, NETWORK_CODE);
    }

    @Override
    public final boolean onCreate() {
        return true;
    }

    @Override
    public final ParcelFileDescriptor openFile(final Uri uri, final String mode) {
        Log.d(TAG, "openFile called. uri = " + uri);

        ParcelFileDescriptor retVal = null;
        final int code = sUriMatcher.match(uri);
        switch (code) {
        case NETWORK_CODE:
            // get url from query parameter in uri.
            final String urlString = uri.getQueryParameter(URL_QUERY_KEY);
            if (urlString != null) {
                // support only read from network.
                if (!"r".equals(mode)) {
                    throw new IllegalArgumentException("not supported.");
                }
                Log.d(TAG, "Download URL is " + urlString);
                // Check network state.
                if (isConnected(getContext())) {

                    InputStream is = null;
                    OutputStream os = null;
                    try {
                        // Download from the URL.
                        URL url = new URL(urlString);
                        is = url.openStream();

                        // Get tmp folder.
                        File tmpFolder = getContext().getCacheDir();

                        // Delete tmp files.
                        File[] tmps = tmpFolder.listFiles();
                        if (tmps != null && tmps.length != 0) {
                            for (int i = 0; tmps.length < i; i++) {
                                tmps[i].delete();
                            }
                        }

                        //TODO Add file extension handling.
                        // Create new tmp file.
                        File tmp = File.createTempFile(null, null, tmpFolder);
                        Log.d(TAG, "tmp file: " + tmp.getAbsolutePath());
                        os = new FileOutputStream(tmp);

                        byte[] buffer = new byte[1024];
                        while(is.read(buffer) != -1) {
                            os.write(buffer);
                        }
                        os.close();
                        is.close();

                        retVal = ParcelFileDescriptor.open(tmp, ParcelFileDescriptor.MODE_READ_ONLY);

                    } catch (MalformedURLException e) {
                        Log.d(TAG, "Read error on " + urlString, e);
                    } catch (IOException e) {
                        // close streams.
                        if (is != null) {
                            try {
                                is.close();
                            } catch (IOException e1) {
                                Log.d(TAG, "Error on file close");
                            }
                        }
                        if (os != null) {
                            try {
                                os.close();
                            } catch (IOException e1) {
                                Log.d(TAG, "Error on file close");
                            }
                        }
                    }
                }
            }
            break;
        }
        return retVal;
    }

    /**
     * Check network connection state.
     * @param context
     * @return
     */
    private static boolean isConnected(Context context) {
        boolean retVal = false;
        if(context != null) {
            ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo info = manager.getActiveNetworkInfo();
            if (info != null) {
                retVal = info.isConnected();
            }
        }
        return retVal;
    }

    @Override
    public final String getType(Uri uri) {
        return null;
    }

    @Override
    public final Uri insert(Uri uri, ContentValues values) {
        throw new IllegalArgumentException("not supported.");
    }

    @Override
    public final int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        throw new IllegalArgumentException("not supported.");
    }

    @Override
    public final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        throw new IllegalArgumentException("not supported.");
    }

    @Override
    public final int delete(Uri uri, String selection, String[] selectionArgs) {
        throw new IllegalArgumentException("not supported.");
    }

}