SearchMovieMessageService.java 9.05 KB
package com.xgimi.gimicinema.service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import com.gimi.common.cinema.db.NewDBManager;
import com.gimi.common.cinema.model.AsyncCallback;
import com.gimi.common.cinema.model.Constant;
import com.gimi.common.cinema.model.LocalMovieMessage;
import com.gimi.common.cinema.model.MovieMessage;
import com.gimi.common.cinema.model.QueryBean;
import com.gimi.common.cinema.model.QueryDoubanUtils;
import com.gimi.common.cinema.model.SambaMsg;
import com.gimi.common.cinema.model.WrongMsg;
import com.gimi.common.cinema.utils.FileReadUtils;
import com.gimi.common.cinema.utils.FolderUtils;
import com.gimi.common.cinema.utils.GimiCinemaBusiness;
import com.gimi.common.cinema.utils.OkHttpClientManager;
import com.gimi.common.cinema.utils.SambaFileCharge;
import com.gimi.common.cinema.utils.ScanUtils;
import com.gimi.common.cinema.utils.Utils;
import com.google.gson.Gson;
import com.squareup.okhttp.Request;

import java.io.File;
import java.lang.ref.WeakReference;
import java.util.List;

/**
 * Created by pc on 2015/1/6
 */
public class SearchMovieMessageService extends Service {

    private static final int SUCCESS = 0x01;
    private static final int FAILURE = 0x02;
    private static final int START = 0x03;
    private static final int END = 0x04;
    private GimiCinemaBusiness gimiCinemaBusiness;
    private SambaMsg sambaMsg;
    private ScanUtils scanUtils;
    private NewDBManager dbManager;
    private List<LocalMovieMessage> localMovieMessages;
    SharedPreferences sharedPreferences;
    private Context mContext;

    private Handler gcbHandler;

    private void downImages(final String urlPath, final String savePath) {
        OkHttpClientManager.downloadEncryptAsyn(urlPath, savePath,
                new OkHttpClientManager.ResultCallback<String>() {
                    @Override
                    public void onError(Request request, Exception e) {
                    }

                    @Override
                    public void onResponse(String response) {
                        Log.e("APpUpdateUtils", "success:" + response);
                    }
                });
    }


    @Override
    public IBinder onBind(Intent intent) {
        throw new NullPointerException();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
        scanUtils = new ScanUtils(this);
        dbManager = new NewDBManager(this);
        gcbHandler = new GcbHandler(this);
        localMovieMessages = dbManager.queryPosterDoubanIdNull();
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //注册receiver,接收Activity发送的广播,停止线程,停止service
        initSambaMsg();
        Thread t = new Thread(new MyThread());
        t.start();
        return super.onStartCommand(intent, flags, startId);
    }

    class MyThread implements Runnable {
        public void run() {
            try {
                Thread.sleep(1000);
                gcbHandler.sendEmptyMessage(START);
                getMovieMessage();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void initSambaMsg() {
        gimiCinemaBusiness = new GimiCinemaBusiness(this);
        sharedPreferences = getSharedPreferences(Constant.XML_NAME, Context.MODE_PRIVATE);
        sambaMsg = Utils.getSambaMsg(sharedPreferences);
    }

    int count = 0;

    private void getMovieMessage() {
        if (localMovieMessages == null || localMovieMessages.size() == 0) {
            localMovieMessages = dbManager.queryPosterDoubanIdNull();
        }

        if (sambaMsg != null) {
            if (localMovieMessages.size() > 0) {
                count = 0;
                gcbHandler.post(searchAndGetRunnable);
            }
        }
    }


    private Runnable searchAndGetRunnable = new Runnable() {
        @Override
        public void run() {
            if (SambaFileCharge.fileExist(localMovieMessages.get(count).getPlayPath())) {
                QueryDoubanUtils.getQueryBeanByName(localMovieMessages.get(count).getMovieName(), new AsyncCallback<QueryBean>() {
                    @Override
                    public void onSuccess(QueryBean data) {
                        super.onSuccess(data);
                        List<QueryBean.SubjectsEntity> subjects = data.getSubjects();
                        if (subjects.size() > 0) {
                            QueryBean.SubjectsEntity subjectsEntity = subjects.get(0);
                            request(FolderUtils.getMovieFolderPath(localMovieMessages.get(count).getPlayPath(), sambaMsg.getLocalPath()), subjectsEntity.getId());
                        }
                        coutppsendhand();
                    }

                    @Override
                    public void onFailure(WrongMsg caught) {
                        super.onFailure(caught);
                        coutppsendhand();
                    }
                });

            }
        }

        private void coutppsendhand() {
            count++;
            if (count < localMovieMessages.size()) {
                gcbHandler.postDelayed(this, 15 * 1000);
            } else if (count == localMovieMessages.size()) {
                gcbHandler.sendEmptyMessage(END);
            }
        }
    };

    private void request(final String rootPath, String dbId) {
        File mmFile = new File(rootPath + Constant.MOVIE_MESSAGE_NAME_OLD);
        File mmFile1 = new File(rootPath + Constant.MOVIE_POSTER_NEW);
        //if not exist and id is not null to get the message else return
        if (!mmFile.exists() && !mmFile1.exists()) {
            if (!TextUtils.isEmpty(dbId)) {
                Thread thread = gimiCinemaBusiness.getMovieMessages(dbId, new AsyncCallback<MovieMessage>() {
                    @Override
                    public void onSuccess(MovieMessage data) {
                        super.onSuccess(data);
                        Message message = Message.obtain();
                        message.what = SUCCESS;
                        message.obj = data;
                        Bundle bundle = new Bundle();
                        message.setData(bundle);
                        bundle.putString("movie-message-path", rootPath);
                        gcbHandler.sendMessage(message);
                    }

                    @Override
                    public void onFailure(WrongMsg caught) {
                        super.onFailure(caught);
                        Bundle bundle = new Bundle();
                        Message message = Message.obtain();
                        message.what = FAILURE;
                        message.setData(bundle);
                        gcbHandler.sendMessage(message);
                    }

                    @Override
                    public void onDone() {
                        super.onDone();
                    }

                });
                thread.start();
            }
        }
    }

    private static class GcbHandler extends Handler {
        private final WeakReference<SearchMovieMessageService> service;


        private GcbHandler(SearchMovieMessageService service) {
            this.service = new WeakReference<>(service);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            SearchMovieMessageService m = service.get();
            if (m != null) {
                switch (msg.what) {
                    case SUCCESS:
                        MovieMessage movieMessage = (MovieMessage) msg.obj;
                        String curFilePath = (String) msg.getData().get("movie-message-path");
                        String content = new Gson().toJson(movieMessage);
                        FileReadUtils.writeDateByEn(curFilePath + Constant.MOVIE_MESSAGE_NAME_OLD, content);

                        if (TextUtils.isEmpty(m.scanUtils.getPoster(curFilePath))) {
                            m.downImages(movieMessage.getImages().getLarge(), curFilePath + Constant.MOVIE_POSTER_NEW);
                        }
                        //get the url from message and download
                        //1,charge image file exists in current path
                        //2,download and save
                        //do upper in the MovieDetailActivity.java
                        break;
                    case FAILURE:
                        System.err.println(msg.getData().get("error-message"));
                        break;
                    case START:
                        Toast.makeText(m.mContext, "开始抓取电影介绍", Toast.LENGTH_LONG).show();
                        break;
                    case END:
                        Toast.makeText(m.mContext, "电影介绍抓取完成", Toast.LENGTH_LONG).show();
                        break;
                }
            }
        }
    }
}