AbsApplication

51 阅读2分钟
package com.alibaba.genie.panel;

import static com.alibaba.genie.panel.AppConfig.ACCESS_KEY_ID;
import static com.alibaba.genie.panel.AppConfig.ACCESS_KEY_SECRET;
import static com.alibaba.genie.panel.AppConfig.ENCODE_KEY;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.Application;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
import android.view.WindowManager;

import com.alibaba.ailabs.genie.density.GenieDensityInstaller;
import com.alibaba.ailabs.genie.density.MetaBean;
import com.alibaba.ailabs.genie.density.MetaUtils;
import com.alibaba.ailabs.geniesdk.AguiCtx;
import com.alibaba.ailabs.geniesdk.AiLabsCore;
import com.alibaba.genie.agcs.openapi.client.OpenAPIMgr;
import com.alibaba.genie.panel.agui.genieball.GenieEvent;
import com.alibaba.genie.panel.agui.genieball.GenieUiController;
import com.alibaba.genie.panel.agui.genieball.config.AnimationConfigManager;
import com.alibaba.genie.panel.basic.AbsApplication;
import com.alibaba.genie.panel.basic.manager.NetworkStateManager;
import com.alibaba.genie.panel.basic.utils.WakeTask;
import com.alibaba.genie.panel.basic.utils.network.AppNetManager;
import com.alibaba.genie.panel.denpendence.Dependency;
import com.alibaba.genie.panel.denpendence.VolumeDialogController;
import com.alibaba.genie.panel.network.NetWorkListener;
import com.alibaba.genie.panel.quickcontrol.adapter.refresh.DeviceRefreshUi;
import com.alibaba.genie.panel.repository.AppRepository;
import com.alibaba.genie.panel.repository.greendao.GreenDao;
import com.alibaba.genie.panel.setting.ui.SystemController;
import com.alibaba.genie.panel.utils.AguiUtils;
import com.alibaba.genie.panel.utils.ContextUtils;
import com.alibaba.genie.panel.utils.GlobalState;
import com.alibaba.genie.panel.utils.SharedPreferenceManager;
import com.alibaba.genie.panel.basic.utils.SystemPropertiesUtils;
import com.alibaba.genie.panel.basic.utils.weather.WeatherParseManager;
import com.alibaba.genie.panel.volume.VolumeControllerImpl;
import com.alibaba.smarthome.sdk.SmartHomeInterface;
import com.aliyun.alink.linksdk.ccp.system.ControlCallback;
import com.aliyun.alink.linksdk.tools.ALog;
import com.dnake.product.ProductTestManager;
import com.dnake.tinycap.Capture;
import com.dnake.v700.DNKSender;
import com.youku.kubus.Event;
import com.youku.kubus.EventBus;

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

/**
 * Created by wzchao on .
 */
public class App extends AbsApplication implements Application.ActivityLifecycleCallbacks {
    private final static String TAG = App.class.getSimpleName();

    private static App mApplication;

    public static App getApplication() {
        return mApplication;
    }

    private Handler uiHandler;
    private Handler workHandler;
    private Event mEvent1;
    private GenieEvent mEvent;

    private DeviceRefreshUi.DeviceNotifyObserver deviceNotifyObserver;

    private boolean mIsMusicActivityInForeground = false;

    @Override
    public void onCreate() {
        super.onCreate();
        mApplication = this;
        WakeTask.onCreate(this);
        registerActivityLifecycleCallbacks(this);
        SystemController.getInstance().init(this);
        GenieDensityInstaller.getInstance().installIfNeed(this, beans);

        AguiUtils.getInstance().initAgui(this);
//        AiLabsCore.getInstance().enableLocalasr();
        OpenAPIMgr.getInstance().init(this, ENCODE_KEY, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        ProductConstant.init(this);
        ALog.setLevel(ALog.LEVEL_DEBUG);
        GenieUiController.getInstance().onBind();
        // 初始化产测
        ProductTestManager.getInstance().init(this);
        try {
            Dependency.put(VolumeDialogController.class, new VolumeControllerImpl(this));
        } catch (Throwable throwable) {
            ALog.e(TAG,throwable.getLocalizedMessage());
        }
        startSystemUI();
        getUiHandler().postDelayed(() -> NetWorkListener.getInstance().register(App.this), 15000);
        getUiHandler().postDelayed(() -> {
            SystemController.getInstance().getController().systemControl(null, "dhcp", "1", new ControlCallback() {
                @Override
                public void onSuccess(String s) {
                    ALog.d(TAG,"open dhcp");
                }

                @Override
                public void onFailure(int i, String s) {
                    ALog.d(TAG,"dhcp open failure");
                }
            });
        }, 500);
        ContextUtils.init(mApplication);
        AnimationConfigManager.getInstance().init(() -> {
        });

        mEvent = new GenieEvent();
        mEvent1 = new Event(GenieEvent.MSG_EVENT_GENIE_BALL);

        listenerIotCoreNotifyMessage();

        new AppRepository().loadDeviceId();

        ProductTestManager.getInstance().setOnBroadcastListener(new ProductTestManager.OnBroadcastListener() {
            @Override
            public void onReceiveIntent(Context context, Intent intent) {
                String stringExtra = intent.getStringExtra(ProductTestManager.KEY_TYPE);
                if (ProductTestManager.TYPE_PRODUCT_MODE.equalsIgnoreCase(stringExtra)) {
                    // 进入或退出产测模式
                    boolean isProductMode = intent.getBooleanExtra(ProductTestManager.KEY_BOOLEAN, false);
                    ALog.d(TAG,"isProductMode: " + isProductMode);
                    GlobalState.hasProvision = !isProductMode;
                } else if (ProductTestManager.TYPE_SPEECH.equalsIgnoreCase(stringExtra)) {
                    ALog.d(TAG,"TYPE_SPEECH: " + stringExtra);
                    // 语音事件
                    boolean isOpen = intent.getBooleanExtra(ProductTestManager.KEY_BOOLEAN, false);
                    AguiCtx.getInstance().setWakeupForbidden(!isOpen);
                    if (isOpen) {
                        // 打开语音
                        ALog.d(TAG,"VoiceModeChangeEvent 打开语音");
                        Capture.getInstance().startRecordByCaptureFrame();
                    } else {
                        // 关闭语音
                        ALog.d(TAG,"VoiceModeChangeEvent 关闭语音");
                        Capture.getInstance().stopRecordByCaptureFrame();
                    }
                }
            }

            @Override
            public void onReceive(String url, String body) {
                DNKSender.send(url, body);
            }
        });

        // 初始化网络监听
        AppNetManager.getInstance().init(this);

        // 初始化网络监听
        NetworkStateManager.getInstance().init(this);

        // 初始化数据库
        GreenDao.getInstance().init(this);

        //初始化SP
        SharedPreferenceManager.getInstance().init(this);

        WeatherParseManager.getInstance().init();
    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        ALog.i(TAG, "onTrimMemory: level = " + level);

        if (level == TRIM_MEMORY_RUNNING_CRITICAL) {// 应用即将被系统杀死
            clean();
        }
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        ALog.i(TAG, "onTerminate");

        clean();
    }

    private void clean() {
        try {
            SmartHomeInterface.getInstance().closeGattServer();
        } catch (RemoteException e) {
            throw new RuntimeException(e);
        }
    }

    private void startSystemUI() {
        if (BuildConfig.BETA) { return; }
        getUiHandler().postDelayed(() -> StatusBar.getInstance().start(), 10000);
    }

    public Handler getUiHandler() {
        if (uiHandler == null) {
            uiHandler = new Handler(Looper.getMainLooper());
        }
        return uiHandler;
    }


    /**
     * 设置MainActivity是否在前台
     */
    public void setIsMusicActivityInForeground(boolean isInForeground) {
        mIsMusicActivityInForeground = isInForeground;
    }

    /**
     * 当前MainActivity是否在前台
     */
    public boolean isMusicActivityInForeground() {
        return mIsMusicActivityInForeground;
    }

    private void initWorkThread() {
        HandlerThread mWorkerThread = new HandlerThread("SysUiBg", Process.THREAD_PRIORITY_BACKGROUND);
        mWorkerThread.start();
        workHandler = new Handler(mWorkerThread.getLooper());
    }

    public Handler getWorkHandler() {
        if (workHandler == null) {
            initWorkThread();
        }
        return workHandler;
    }

    public static List<MetaBean> beans = new ArrayList<MetaBean>() {{
        add(new MetaBean("com.alibaba.genie.panel.activity.HomeActivity", MetaUtils.AUTO_SIZE_10, MetaUtils.ORIENTATION_HORIZONTAL));
        add(new MetaBean("com.alibaba.genie.panel.activity.QSettingActivity", MetaUtils.AUTO_SIZE_10, MetaUtils.ORIENTATION_HORIZONTAL));
        add(new MetaBean("com.alibaba.genie.panel.activity.HomeMusicFragment", MetaUtils.AUTO_SIZE_7, MetaUtils.ORIENTATION_HORIZONTAL));
        add(new MetaBean("com.alibaba.genie.panel.activity.HomeSettingFragment", MetaUtils.AUTO_SIZE_7, MetaUtils.ORIENTATION_HORIZONTAL));
        add(new MetaBean("com.alibaba.genie.panel.activity.HomePageFragment", MetaUtils.AUTO_SIZE_7, MetaUtils.ORIENTATION_HORIZONTAL));
        add(new MetaBean("com.alibaba.genie.panel.activity.HomeControlFragment", MetaUtils.AUTO_SIZE_7, MetaUtils.ORIENTATION_HORIZONTAL));
        add(new MetaBean("com.alibaba.genie.panel.debug.OtherFragment", MetaUtils.AUTO_SIZE_7, MetaUtils.ORIENTATION_HORIZONTAL));
        add(new MetaBean("com.alibaba.genie.panel.view.fragment.TabAllFragment", MetaUtils.AUTO_SIZE_7, MetaUtils.ORIENTATION_HORIZONTAL));
        add(new MetaBean("com.alibaba.genie.panel.controlpanel.DeviceControlPanelContainerActivity", MetaUtils.AUTO_SIZE_7, MetaUtils.ORIENTATION_HORIZONTAL));
    }};

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        super.onActivityCreated(activity, savedInstanceState);
        if (SystemPropertiesUtils.isUserLogined()) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  //应用运行时,保持屏幕高亮,不锁屏
        }
    }

    @Override
    public void onActivityStarted(Activity activity) {

    }

    @Override
    public void onActivityResumed(Activity activity) {
        String packageName = activity.getPackageName();
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(1);
        if (!runningTasks.isEmpty()) {
            ActivityManager.RunningTaskInfo taskInfo = runningTasks.get(0);
            ComponentName topActivity = taskInfo.topActivity;
            GlobalState.topActivityName = topActivity.getClassName();
            //仅当前是首页时显示精灵球setBackground(false):显示;setBackground(true):隐藏
            mEvent.setBackground(!topActivity.getPackageName().equals(packageName) || !topActivity.getClassName().equals("com.alibaba.genie.panel.activity.HomeActivity"));
            mEvent1.data = mEvent;
            EventBus.getDefault().post(mEvent1);
        }
    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

    }

    public void listenerIotCoreNotifyMessage() {
        if (deviceNotifyObserver == null) {
            deviceNotifyObserver = new DeviceRefreshUi.DeviceNotifyObserver() {
                @Override
                public void onNotify(String msgType, Object msg) {
                    ALog.d(TAG,"onNotify() called with: msgType = [" + msgType + "], msg = [" + msg + "]");
                    // unbind ccp device
                    if (Constants.GATEWAY_BIND_STATUS.UNBIND_STATUS.equalsIgnoreCase(msgType)) {
                        ALog.i(TAG," user unbind ccp device, logout agui.");
                        AiLabsCore.getInstance().logoutUser();
                        return;
                    }
                }
            };
        }
        DeviceRefreshUi.getInstance().addDeviceNotifyChangeObserver(deviceNotifyObserver);
    }
}