AskService.java 10.9 KB
package com.xgimi.gimicinema.service;

import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
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.BaseData;
import com.gimi.common.cinema.model.Constant;
import com.gimi.common.cinema.model.ControlMessage;
import com.gimi.common.cinema.model.GimiMessage;
import com.gimi.common.cinema.model.GimiSysMsg;
import com.gimi.common.cinema.model.PlayStatus;
import com.gimi.common.cinema.model.PlayStatusMessage;
import com.gimi.common.cinema.model.SambaMsg;
import com.gimi.common.cinema.model.UdpModel;
import com.gimi.common.cinema.utils.AuthUtils;
import com.gimi.common.cinema.utils.FolderUtils;
import com.gimi.common.cinema.utils.LocalDataUtils;
import com.gimi.common.cinema.utils.MovieMessageUtils;
import com.gimi.common.cinema.utils.OpenMMUtils;
import com.gimi.common.cinema.utils.SambaFileCharge;
import com.gimi.common.cinema.utils.SystemUtils;
import com.gimi.common.cinema.utils.T;
import com.gimi.common.cinema.utils.Utils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.xgimi.gimicinema.BuildConfig;
import com.xgimi.gimicinema.ICinemaControl;
import com.xgimi.gimicinema.activity.CinemaConfig;
import com.xgimi.gimicinema.deserializer.GimiMessageDeserializer;
import com.xgimi.gimicinema.deserializer.GimiSysMsgDeserializer;
import com.xgimi.gimicinema.mview.IAskView;
import com.xgimi.gimicinema.presenter.AskPresenter;

import java.util.ArrayList;
import java.util.List;


/**
 * Created by pc on 2015/1/6
 */
public class AskService extends Service implements IAskView {
    public static final String TAG = "AskService";
    private Handler handler = new Handler();

    private Context context;
    private SystemUtils systemUtils;
    private SharedPreferences sharedPreferences;
    private NewDBManager dbManager;
    private LocalDataUtils localDataUtils;
    private AskPresenter askPresenter;
    private String ip = "";
    private String folder = "";

    private SambaMsg sambaMsg;
    private Gson gson;
    private UdpPostSender sender;
    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
        if (!mBound) {
            attemptToBindService();
        }
        gson = new GsonBuilder()
                .registerTypeAdapter(GimiSysMsg.class, new GimiSysMsgDeserializer())
                .registerTypeAdapter(GimiMessage.class, new GimiMessageDeserializer())
//                .registerTypeAdapter(typeStatus, new QnMsgDeserializer<StatusData>())
//                .registerTypeAdapter(typeMessage, new QnMsgDeserializer<List<MessageData>>())
                .create();

        askPresenter = new AskPresenter(this);
        localDataUtils = new LocalDataUtils(context);
        dbManager = new NewDBManager(this);
        systemUtils = new SystemUtils();
        sharedPreferences = Utils.getSp(context);
        agentType = Utils.getInt(sharedPreferences, "agent-type", 0);
        Log.d(TAG, "onCreate: " + BuildConfig.MACHINE_TYPE);
        updateMsg();

        sender = new UdpPostSender("", 53301, 53301, _handler);

        askPresenter.load(context);
        handler.postDelayed(updateRunnable, 5 * 1000);
//        PollingUtils.startPollingService(context, 60, CountService.class, CountService.STATUS_ACTION);
    }

    private void updateMsg() {
        sambaMsg = Utils.getSambaMsg(sharedPreferences);
        ip = sambaMsg.getIp();
        folder = sambaMsg.getFolder();
    }

    int agentType;

    private Handler _handler = new Handler() {
        @Override
        public void dispatchMessage(Message msg) {
            if (msg.what == UdpPostSender.MSG_PARSE_DATA) {
                //maybe need delay
                if (AuthUtils.isFinish(context)) {
                    return;
                }
                String obj = (String) msg.obj;
                ControlMessage controlMessage = gson.fromJson(obj, ControlMessage.class);
                UdpModel udpModel1 = controlMessage.getUdpModel();
                switch (controlMessage.getAction()) {
                    case 0://播放点播电影
                        playPath(getPlayUrl(udpModel1.getMovie_url()));
                        break;
                    case 1://播放点播电影列表
//                        int length = udpModel1.getMovie_urls().length;
//                        String[] trans = new String[length];
//                        for (int i = 0; i < length; i++) {
//                            trans[i] = getPlayUrl(udpModel1.getMovie_urls()[i]);
//                        }
                        playMultiPath(udpModel1.getMovie_urls(), udpModel1.getPosition());
                        break;
                    case 2://返回当前播放状态
                        try {
                            returnCurrentStatus();
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                        break;
                }
            }
            super.dispatchMessage(msg);
        }
    };

    private void returnCurrentStatus() throws RemoteException {
        PlayStatusMessage statusMessage = new PlayStatusMessage();
        statusMessage.setAction(2);
        PlayStatus status = new PlayStatus();
        status.setCurrentPosition(cinemaControl.getCurrentMoviePosition());
        status.setMovieLength(cinemaControl.getMovieDuration());
        status.setMovieUrls(cinemaControl.getPlayList());
        status.setPath(cinemaControl.getCurrentPath());
        status.setState(cinemaControl.getCurrentStatus());
        statusMessage.setStatus(status);
        String s = gson.toJson(statusMessage);
        sender.sendUDPmsg(s);
    }

    private void playMultiPath(String[] movie_urls, int position) {
        stopMediaPlayer();
        Toast.makeText(context.getApplicationContext(),
                "即将播放新的列表电影", Toast.LENGTH_SHORT).show();
        List<String> result = new ArrayList<>();
        for (String movie_url : movie_urls) {
            result.add("/mnt/samba/" + movie_url);
        }
        try {
            cinemaControl.setPlayList(null);
            cinemaControl.setPlayList(result);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        playPath(result, position);
    }


    private String getPlayUrl(String url) {
        String result;
        if (BuildConfig.MACHINE_TYPE.equals("himedia")) {
            String replace = url.replace(ip, "");
            if (!TextUtils.isEmpty(folder) && (replace.startsWith(folder)
                    || replace.startsWith("//" + folder)
                    || replace.startsWith("/" + folder))) {
                replace = replace.replace(folder, "");
            }
            result = (CinemaConfig.BASIC_ROOT + replace);
        } else {
            result = ("/mnt/samba/" + url);
        }
        return result;
    }

    private String currentPath = "";

    private void playPath(String videoPath) {
        try {
            cinemaControl.setPlayList(null);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        if (!TextUtils.isEmpty(videoPath)) {
            if (SambaFileCharge.fileExist(videoPath)) {
                currentPath = videoPath;
                BaseData bd = new BaseData();
                bd.setPath(videoPath);
                stopMediaPlayer();
                Toast.makeText(context.getApplicationContext(),
                        "即将播放新的电影", Toast.LENGTH_SHORT).show();

                final String path = bd.getPath();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        askPresenter.playMovie(context, path);
                    }
                }, 5000);
                String movieFolderPath = FolderUtils.getMovieFolderPath(videoPath, sambaMsg.getIp(), null);
                int playCount = MovieMessageUtils.getPlayCount(movieFolderPath);
                playCount = playCount + 1;
                MovieMessageUtils.writePlayCount(movieFolderPath, playCount);//update files
                dbManager.updateMovieCount(videoPath, playCount);
            } else {
                T.show(context, "没有电影可以播放,请检查网络或者服务器情况");
                askPresenter.load(context);
                updateMsg();
            }
        } else {
            T.show(context, "没有电影可以播放");
        }
    }

    private void stopMediaPlayer() {
        systemUtils.stopMediaPlayer(context.getApplicationContext());
    }

    private Runnable updateRunnable = new Runnable() {
        @Override
        public void run() {
            Constant.gimiAuth = sharedPreferences.getBoolean(Constant.GIMI_AUTHENTICATION, true);
            if (Constant.gimiAuth) {
                localDataUtils.updateDb();
            }
        }
    };

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        askPresenter.umountSamba();
        if (mBound) {
            unbindService(mServiceConnection);
            mBound = false;
        }
        super.onDestroy();
    }

    @Override
    public void playPath() {
        OpenMMUtils.openMM(context, currentPath, null);
    }

    @Override
    public void playPath(List<String> result, int position) {
        OpenMMUtils.openMM(context, null, result, null, position);
    }

    @Override
    public void showMsg(String msg) {
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    }
        //由AIDL文件生成的Java类
    private ICinemaControl cinemaControl = null;

    //标志当前与服务端连接状况的布尔值,false为未连接,true为连接中
    private boolean mBound = false;


    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            cinemaControl = ICinemaControl.Stub.asInterface(service);
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mBound = false;
        }
    };

    /**
     * 尝试与服务端建立连接
     */
    private void attemptToBindService() {
        Intent intent = new Intent();
        intent.setAction("com.gimicinema.cinemacontrol");
        intent.setPackage("com.xgimi.gimicinema");
        bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
    }

    public static final String ACTION = "cn.etzmico.broadcastreceiverregister.SENDBROADCAST";
}