效果图
修改思路
1、增加全局控制变量 sys.launcher3.is_full_app,用来动态切换
2、增加两套布局,对应有抽屉和无抽屉
3、去除 allAppsButton
4、将 AllAppsContainerView 中的图标加载到 Workspace
5、新安装的 app 自动添加图标到 Workspace
6、替换 Workspace 图标长按删除选项为取消
7、屏蔽上拉显示抽屉页面手势
8、修改页面指示线为圆点
上代码
1、增加全局控制变量 sys.launcher3.is_full_app
1) 在 LauncherAppState 中增加静态方法 isDisableAllApps(), 通过修改 Settings 中自定义的值 sys.launcher3.is_full_app
vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\LauncherAppState. java private static Context mContext;
public static boolean isDisableAllApps() {
if (mContext != null) {
return Settings.System.getInt(mContext.getContentResolver(),
"sys.launcher3.is_full_app", 0) == 1;
}
return true;
}
vendor\mediatek\proprietary\packages\apps\Launcher3\AndroidManifest-common.xml
2) AndroidManifest-common.xml 中增加权限
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
3) 在 SettingsActivity 中增加 SwitchPreference 用以动态修改 sys.launcher3.is_full_app
vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\SettingsActivity.java
在内部类 LauncherSettingsFragment 中重写 onPreferenceTreeClick() 用以监听 SwitchPreference 点击
/**
* This fragment shows the launcher preferences.
*/
public static class LauncherSettingsFragment extends PreferenceFragment {
.....
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
//读取保存的值,初始化 SwitchPreference 的初始状态,是否选中
int isFull = Settings.System.getInt(getActivity().getContentResolver(),
"sys.launcher3.is_full_app", 0);
Log.d("Launcher3", "sys.launcher3.is_full_app="+isFull);
SwitchPreference fullSwitch = (SwitchPreference) findPreference("pref_is_full_app");
fullSwitch.setChecked(isFull==1);
}
//add for change is_full_app value
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
boolean result = true;
final String key = preference.getKey();
if ("pref_is_full_app".equals(key)) {
boolean checked = ((SwitchPreference) preference).isChecked();
Settings.System.putInt(getActivity().getContentResolver(), "sys.launcher3.is_full_app",
checked ? 1 : 0);
Log.e("Launcher3", "SwitchPreference checked="+checked);
// Value has changed
ProgressDialog.show(getActivity(),
null /* title */,
getActivity().getString(R.string.full_app_override_progress),
true /* indeterminate */,
false /* cancelable */);
new LooperExecutor(LauncherModel.getWorkerLooper()).execute(
new OverrideApplyHandler(getActivity()));
}
return result;
}
}
点击 SwitchPreference 后需要保存 sys.launcher3.is_full_app 新值,同时清除 Launcher3 的缓存,延时启动并结束当前进程
清除缓存方法 clearApplicationUserData 在 Launcher3 中编译报错,所以通过发送广播到 Setting 中进行真正的清缓存操作
//add for change is_full_app value
private static class OverrideApplyHandler implements Runnable {
private final Context mContext;
private OverrideApplyHandler(Context context) {
mContext = context;
}
@Override
public void run() {
// Clear the icon cache.
LauncherAppState.getInstance(mContext).getIconCache().clear();
// Wait for it
try {
Thread.sleep(1000);
} catch (Exception e) {
Log.e("Launcher3", "Error waiting", e);
}
// Schedule an alarm before we kill ourself.
Intent homeIntent = new Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_HOME)
.setPackage(mContext.getPackageName())
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(mContext, 42,
home