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

2023-03-29 19:25:44 浏览数 (1)

文章目录

  • 一、添加应用源码分析
    • 1、LaunchpadAdapter 适配器
    • 2、适配器添加元素
    • 3、PackageAppData 元素

一、添加应用源码分析


1、LaunchpadAdapter 适配器

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

下图显示的 RecyclerView 列表如下 :

代码语言:javascript复制
            <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 如下 :

代码语言:javascript复制
private RecyclerView mLauncherView;

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

设置的适配器如下 :

代码语言:javascript复制
private LaunchpadAdapter mLaunchpadAdapter;

2、适配器添加元素

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

代码语言:javascript复制
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) 方法中 , 添加已安装的应用信息 ,

代码语言:javascript复制
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) 方法中调用的 , 应用安装完毕后 , 会调用添加应用到列表中的方法 ;

代码语言:javascript复制
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 ;

代码语言:javascript复制
public class PackageAppData implements AppData {
    public String packageName;
    public String name;
    public Drawable icon;
    public boolean fastOpen;
    public boolean isFirstOpen;
    public boolean isLoading;
}

0 人点赞