me.kartikarora.transfersh.adapters.FileGridAdapter.java Source code

Java tutorial

Introduction

Here is the source code for me.kartikarora.transfersh.adapters.FileGridAdapter.java

Source

/**
 * Copyright 2016 Kartik Arora
 * <p/>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p/>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p/>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package me.kartikarora.transfersh.adapters;

import android.Manifest;
import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.widget.CursorAdapter;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;

import org.apache.commons.io.FilenameUtils;

import me.kartikarora.transfersh.BuildConfig;
import me.kartikarora.transfersh.R;
import me.kartikarora.transfersh.contracts.FilesContract;

/**
 * Developer: chipset
 * Package : me.kartikarora.transfersh.adapters
 * Project : Transfer.sh
 * Date : 9/6/16
 */
public class FileGridAdapter extends CursorAdapter {

    public static final int PERM_REQUEST_CODE = BuildConfig.VERSION_CODE / 10000;
    private LayoutInflater inflater;
    private AppCompatActivity activity;
    private Context context;
    private PermissionRequestResult permissionRequestResult;
    private Tracker tracker;

    public FileGridAdapter(AppCompatActivity activity, Cursor cursor, Tracker tracker) {
        super(activity.getApplicationContext(), cursor, false);
        this.context = activity.getApplicationContext();
        this.inflater = LayoutInflater.from(context);
        this.activity = activity;
        this.tracker = tracker;
    }

    public PermissionRequestResult getPermissionRequestResult() {
        return permissionRequestResult;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View view = inflater.inflate(R.layout.file_item, parent, false);
        FileItemViewHolder holder = new FileItemViewHolder(view);
        view.setTag(holder);
        return view;
    }

    @Override
    public void bindView(View view, final Context context, Cursor cursor) {
        FileItemViewHolder holder = (FileItemViewHolder) view.getTag();
        int nameCol = cursor.getColumnIndex(FilesContract.FilesEntry.COLUMN_NAME);
        int typeCol = cursor.getColumnIndex(FilesContract.FilesEntry.COLUMN_TYPE);
        int sizeCol = cursor.getColumnIndex(FilesContract.FilesEntry.COLUMN_SIZE);
        int urlCol = cursor.getColumnIndex(FilesContract.FilesEntry.COLUMN_URL);
        final String name = cursor.getString(nameCol);
        final String type = cursor.getString(typeCol);
        final String size = cursor.getString(sizeCol);
        final String url = cursor.getString(urlCol);
        holder.fileNameTextView.setText(name);
        String ext = FilenameUtils.getExtension(name);
        int identifier = context.getResources().getIdentifier("t" + ext, "drawable", context.getPackageName());
        try {
            holder.fileTypeImageView
                    .setImageDrawable(ResourcesCompat.getDrawable(context.getResources(), identifier, null));
        } catch (Resources.NotFoundException e) {
            e.printStackTrace();
            holder.fileTypeImageView
                    .setImageDrawable(ResourcesCompat.getDrawable(context.getResources(), R.drawable.tblank, null));
        }

        holder.fileInfoImageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String message = "Name: " + name + "\n" + "File type: " + type + "\n" + "URL: " + url;
                new AlertDialog.Builder(activity).setMessage(message).setPositiveButton(android.R.string.ok, null)
                        .create().show();
            }
        });

        holder.fileShareImageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                tracker.send(
                        new HitBuilders.EventBuilder().setCategory("Action").setAction("Share : " + url).build());
                context.startActivity(new Intent().setAction(Intent.ACTION_SEND).putExtra(Intent.EXTRA_TEXT, url)
                        .setType("text/plain").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
            }
        });

        holder.fileDownloadImageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkForDownload(name, type, url, view);
            }
        });
    }

    private class FileItemViewHolder {

        private TextView fileNameTextView;
        private ImageView fileTypeImageView;
        private ImageButton fileInfoImageButton;
        private ImageButton fileShareImageButton;
        private ImageButton fileDownloadImageButton;

        public FileItemViewHolder(View view) {
            fileNameTextView = (TextView) view.findViewById(R.id.file_item_name_text_view);
            fileTypeImageView = (ImageView) view.findViewById(R.id.file_item_type_image_view);
            fileInfoImageButton = (ImageButton) view.findViewById(R.id.file_item_info_image_button);
            fileShareImageButton = (ImageButton) view.findViewById(R.id.file_item_share_image_button);
            fileDownloadImageButton = (ImageButton) view.findViewById(R.id.file_item_download_image_button);
        }
    }

    private void beginDownload(String name, String type, String url) {
        tracker.send(new HitBuilders.EventBuilder().setCategory("Action").setAction("Download : " + url).build());
        DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
        Uri uri = Uri.parse(url);
        DownloadManager.Request request = new DownloadManager.Request(uri);
        request.setDescription(context.getString(R.string.app_name));
        request.setTitle(name);
        String dir = "/" + context.getString(R.string.app_name) + "/" + type + "/" + name;
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, dir);
        manager.enqueue(request);
    }

    private void showRationale(View view) {
        Snackbar.make(view, R.string.permission_message, Snackbar.LENGTH_INDEFINITE)
                .setAction(android.R.string.ok, new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        showPermissionDialog();
                    }
                }).show();
    }

    private void showPermissionDialog() {
        ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
                PERM_REQUEST_CODE);
    }

    private void checkForDownload(final String name, final String type, final String url, View view) {
        this.permissionRequestResult = new PermissionRequestResult() {
            @Override
            public void onPermitted() {
                beginDownload(name, type, url);
            }
        };
        if (ActivityCompat.checkSelfPermission(context,
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
            beginDownload(name, type, url);
        else {
            if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE))
                showRationale(view);
            else {
                showPermissionDialog();
            }
        }
    }

    public interface PermissionRequestResult {
        void onPermitted();
    }
}