com.android.ted.gank.service.ImageImproveService.java Source code

Java tutorial

Introduction

Here is the source code for com.android.ted.gank.service.ImageImproveService.java

Source

/*
 *    Copyright 2015 TedXiong <xiong-wei@hotmail.com>
 *
 *    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
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    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 com.android.ted.gank.service;

import android.app.IntentService;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Point;

import com.android.ted.gank.db.Image;
import com.orhanobut.logger.Logger;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import java.io.IOException;

import io.realm.Realm;
import io.realm.RealmResults;

/**
 * ??
 *
 * @author Ted
 */
public class ImageImproveService extends IntentService {

    public static final String ACTION_UPDATE_RESULT = "com.android.ted.UPDATE_RESULT";

    public static final String EXTRA_CHANGE = "change_data";
    public static final String EXTRA_ACTION = "action_name";

    public static final String PERMISSION_ACCESS_UPDATE_RESULT = "com.android.ted.ACCESS_UPDATE_RESULT";

    public static final String ACTION_IMPROVE_IMAGE = "com.android.ted.IMPROVE_IMAGE";

    private static final String TAG = "ImageImproveService";

    private final OkHttpClient client = new OkHttpClient();

    public ImageImproveService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Realm realm = Realm.getInstance(this);

        /**0*/
        int count = realm.where(Image.class).equalTo("width", 0)
                .findAllSorted("position", RealmResults.SORT_ORDER_DESCENDING).size();
        Logger.d(count + " image need improve");

        if (count == 0) {
            Logger.d("no new image, fresh fetch");
        } else if (ACTION_IMPROVE_IMAGE.equals(intent.getAction())) {
            improveImageInfo(count, realm);
        }

        realm.close();

        Logger.d("finished improve num:" + count);

        Intent broadcast = new Intent(ACTION_UPDATE_RESULT);
        broadcast.putExtra(EXTRA_CHANGE, count);
        broadcast.putExtra(EXTRA_ACTION, intent.getAction());
        sendBroadcast(broadcast, PERMISSION_ACCESS_UPDATE_RESULT);
    }

    private void improveImageInfo(int count, Realm realm) {
        for (int i = 0; i < count; i++) {
            Image image = Image.queryFirstZeroImg(realm);
            if (null != image)
                saveToDb(realm, image);
        }
    }

    /**
     * ???
     *
     * @param realm   Realm 
     * @param image 
     * @return ???
     */
    private boolean saveToDb(Realm realm, Image image) {
        realm.beginTransaction();
        try {
            Point size = new Point();
            loadImageForSize(image.getUrl(), size);
            image.setHeight(size.y);
            image.setWidth(size.x);
            realm.copyToRealmOrUpdate(image);
        } catch (IOException e) {
            Logger.d("Failed to fetch image");
            realm.cancelTransaction();
            return false;
        }
        realm.commitTransaction();
        return true;
    }

    /***
     * ?
     * @param url
     * @param measured
     * @throws IOException
     */
    public void loadImageForSize(String url, Point measured) throws IOException {
        Response response = client.newCall(new Request.Builder().url(url).build()).execute();
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(response.body().byteStream(), null, options);
        measured.x = options.outWidth;
        measured.y = options.outHeight;
    }
}