Android 插件化VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 插件化VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )相关的知识,希望对你有一定的参考价值。





一、添加应用源码分析




1、LaunchpadAdapter 适配器


io.virtualapp.home.HomeActivity 中 , 点击已安装应用列表中的元素 , 启动安装的 APK 应用 ;

下图显示的 RecyclerView 列表如下 :

            <android.support.v7.widget.RecyclerView
                android:id="@+id/home_launcher"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipToPadding="false"
                android:scrollbars="vertical"
                tools:listitem="@layout/item_launcher_app" />

在 HomeActivity 中定义的 RecyclerView 如下 :

private RecyclerView mLauncherView;

mLauncherView = (RecyclerView) findViewById(R.id.home_launcher);

设置的适配器如下 :

private LaunchpadAdapter mLaunchpadAdapter;


2、适配器添加元素


io.virtualapp.home.adapters.LaunchpadAdapter 中 , 列表数据源是 List<AppData> mList , 调用 public void add(AppData model) 添加元素 ;

public class LaunchpadAdapter extends RecyclerView.Adapter<LaunchpadAdapter.ViewHolder> {
    private List<AppData> mList;
    
    // 添加元素
    public void add(AppData model) {
        int insertPos = mList.size() - 1;
        mList.add(insertPos, model);
        notifyItemInserted(insertPos);
    }
}

在 HomeActivity 的 public void addAppToLauncher(AppData model) 方法中 , 添加已安装的应用信息 ,

public class HomeActivity extends VActivity implements HomeContract.HomeView {
    @Override
    public void addAppToLauncher(AppData model) {
        List<AppData> dataList = mLaunchpadAdapter.getList();
        boolean replaced = false;
        for (int i = 0; i < dataList.size(); i++) {
            AppData data = dataList.get(i);
            if (data instanceof EmptyAppData) {
                mLaunchpadAdapter.replace(i, model);
                replaced = true;
                break;
            }
        }
        if (!replaced) {
            mLaunchpadAdapter.add(model);
            mLauncherView.smoothScrollToPosition(mLaunchpadAdapter.getItemCount() - 1);
        }
    }
}

在 HomeActivity 中声明的 public void addAppToLauncher(AppData model) 方法 , 是在 public void addApp(AppInfoLite info) 方法中调用的 , 应用安装完毕后 , 会调用添加应用到列表中的方法 ;

class HomePresenterImpl implements HomeContract.HomePresenter {
    @Override
    public void addApp(AppInfoLite info) {
        class AddResult {
            private PackageAppData appData;
            private int userId;
            private boolean justEnableHidden;
        }
        AddResult addResult = new AddResult();
        VUiKit.defer().when(() -> {
            // 获取安装的应用信息 , 该应用之前是否安装过
            // 这里应该是判断 克隆应用 / SD 卡 APK 文件
        }).then((res) -> {
            addResult.appData = PackageAppDataStorage.get().acquire(info.packageName);
        }).done(res -> {
        	// 是否有多个版本 
            boolean multipleVersion = addResult.justEnableHidden && addResult.userId != 0;
            if (!multipleVersion) {
                PackageAppData data = addResult.appData;
                data.isLoading = true;
                // 添加应用
                mView.addAppToLauncher(data);
                handleOptApp(data, info.packageName, true);
            } else {
                MultiplePackageAppData data = new MultiplePackageAppData(addResult.appData, addResult.userId);
                data.isLoading = true;
                // 添加应用
                mView.addAppToLauncher(data);
                handleOptApp(data, info.packageName, false);
            }
        });
    }
}

3、PackageAppData 元素


上述 LaunchpadAdapter 列表适配器的数据源 List<AppData> dataList , 中的元素类型是 io.virtualapp.home.modelsPackageAppData ;

public class PackageAppData implements AppData {
    public String packageName;
    public String name;
    public Drawable icon;
    public boolean fastOpen;
    public boolean isFirstOpen;
    public boolean isLoading;
}

以上是关于Android 插件化VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )的主要内容,如果未能解决你的问题,请参考以下文章

Android 插件化VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )

Android 插件化VirtualApp 源码分析 ( 安装应用源码分析 | HomePresenterImpl 添加应用 | AppRepository.addVirtualApp )

Android 插件化VirtualApp 接入 ( 在 VirtualApp 工程下创建 Module | 添加依赖 | 启动 VirtualApp 插件引擎 )

Android 插件化VirtualApp 接入 ( 在 VirtualApp 工程下创建 Module | 添加依赖 | 启动 VirtualApp 插件引擎 )

Android 插件化VirtualApp 安装并启动资源中自带的 APK 插件 ( 添加依赖库 | 准备插件 APK | 启动插件引擎 | 拷贝 APK 插件 | 安装插件 | 启动插件 )(代码片

Android 插件化VirtualApp 安装并启动资源中自带的 APK 插件 ( 添加依赖库 | 准备插件 APK | 启动插件引擎 | 拷贝 APK 插件 | 安装插件 | 启动插件 )(代码片