mtk解锁方式
1、setting -> system -> Developer options -> OEM unlocking
进入开发者模式中打开 OEM
2 adb reboot bootloader
3 fastboot flashing unlock
4 按音量上键
5 fastboot reboot
6 adb root
7 adb disable-verity
8 adb reboot
9 adb root
10 adb remount
Mtk S+T编译方式
编译步骤
1 先进入alps-mp-s0目录 比如编译userdebug版本 命令如下
source build/envsetup.sh
export OUT_DIR=out
lunch vnd_k62v1_64_bsp-usedebug
make vnd_images krn_images 2>&1 | tee build_vendor.log
2 第一步编译完 再进入 alps-mp-t0 再执行这一步
source build/envsetup.sh
export OUT_DIR=out_sys
lunch sys_mssi_64_cn-userdebug
make sys_images 2>&1 | tee build.log
3 执行完第三步 还是在alps-mp-t0这个目录 再执行这一步。 就编译完成了
python out_sys/target/product/mssi_64_cn/images/split_build.py --system-dir out_sys/target/product/mssi_64_cn/images --vendor-dir ../alps-mp-s0/out/target/product/k62v1_64_bsp/images --kernel-dir ../alps-mp-s0/out/target/product/k62v1_64_bsp/images --output-dir out_sys/target/product/mssi_64_cn/merged/ 2>&1 | tee build_python.log
添加可卸载内置apk名单
ap/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_system_list.txt
修改盘符和蓝牙名称、系统值
ap/build/make/tools/buildinfo.sh
+echo "ro.build.id=M392"
+echo "ro.build.display.id=T04_50_2_16_3.99inch_7701S_M392_V1.0_`$DATE +%Y%m%d`"
+echo "ro.product.model=M392"
+echo "ro.product.brand=M392"
+echo "ro.product.name=M392"
+echo "ro.product.device=M392"
echo "ro.build.product=M392"
蓝牙名称
ap/device/generic/common/bluetooth/bdroid_buildcfg.h
#define BTM_DEF_LOCAL_NAME "M392"
修改热点名称
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiApConfigStore.java
ap/device/mediateksample/k50v1_64_bsp/system.prop
persist.sys.auto.sd.time=30
广播
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
public class hqb {
private Receiver mReceiver;
Context mContext;
void Send(){//发送
Intent intent=new Intent();
intent.setAction("HQB_HQB");
mContext.sendBroadcast(intent);
}
void init(){//注册广播
mReceiver= new Receiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("HQB_HQB");
mContext.registerReceiver(mReceiver,intentFilter);
}
final class Receiver extends BroadcastReceiver {//接收广播
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("HQB_HQB")) {
//要执行的动作
}
}
}
void onPause(){//销毁广播
mContext.unregisterReceiver(mReceiver);
}
}
线程
new Thread(){
@Override
public void run() {
try {
Thread.sleep(800);
} catch (InterruptedException e) {
e.printStackTrace();
}
//执行的方法
}
}.start();
Toast
+++ b/ap/frameworks/base/core/java/android/widget/Toast.java
@@ -39,7 +39,7 @@ import android.view.View;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
-
+import java.util.Locale;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -131,6 +131,7 @@ public class Toast {
INotificationManager service = getService();
String pkg = mContext.getOpPackageName();
+ android.util.Log.d("hqb","pkg="+pkg);
TN tn = mTN;
tn.mNextView = mNextView;
@@ -267,6 +268,24 @@ public class Toast {
*
*/
public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
+ android.util.Log.d("hqb","6text="+text.toString());
+ Locale locale = context.getResources().getConfiguration().locale;
+ Log.d("hqb",locale.getLanguage());
+ if(text.toString().contains("关闭中")){
+ if(locale.getLanguage().contains("en")){
+ text="closing";
+ }else if(locale.getLanguage().contains("ja")){
+ text="closing";
+ }else if(locale.getLanguage().contains("de")){
+ text="closing";
+ }else if(locale.getLanguage().contains("fr")){
+ text="closing";
+ }else if(locale.getLanguage().contains("it")){
+ text="closing";
+ }else if(locale.getLanguage().contains("es")){
+ text="closing";
+ }
+ }
return makeText(context, null, text, duration);
}
移除一览
usb默认为文件传输
X:\AndroidT_2\sprd.mocor13.androidT\frameworks\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java
protected void finishBoot()和public void handleMessage(Message msg) {
//setEnabledFunctions(UsbManager.FUNCTION_NONE, false);
setEnabledFunctions(UsbManager.FUNCTION_MTP, false);
移除蓝牙的共享联系人
X:\AndroidT_2\sprd.mocor13.androidT\frameworks\base\packages\SettingsLib\src\com\android\settingslib\bluetooth\PbapServerProfile.java
public boolean isProfileReady() {
return false;
}
移除锁定屏幕-->通过已锁定的设备
X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\display\ControlsTrivialPrivacyPreferenceController.java
UNSUPPORTED_ON_DEVICE;
连接偏好设置移除蓝牙
X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\res\xml\connected_devices_advanced.xml
蓝牙加已连接的设备
X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\res\xml\connected_devices.xml中的
<Preference
android:key="previously_connected_devices_see_all"
android:title="@string/previous_connected_see_all"
android:icon="@drawable/ic_chevron_right_24dp"
android:order="10"
settings:searchable="false"
android:fragment="com.android.settings.connecteddevice.PreviouslyConnectedDeviceDashboardFragment"/>
移到X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\res\xml\bluetooth_screen.xml
移除按流量计费
X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\res\layout\wifi_network_config.xml
metered_settings
X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\wifi\WifiConfigController2.java
X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\wifi\WifiConfigController.java
mMeteredSettingsSpinner
移除不属于运营商的流量消耗
X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\network\NetworkProviderSettings.java
mDataUsagePreference.setVisible(false);
移除锁定屏幕的快捷方式
X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Settings\src\com\android\settings\accessibility\AccessibilityShortcutPreferenceController.java
@Override
public int getAvailabilityStatus() {
return UNSUPPORTED_ON_DEVICE;
}
移除备份和多用户
packages\apps\Settings\src\com\android\settings\SettingsActivity.java
import com.android.settings.backup.UserBackupSettingsActivity;
somethingChanged = setTileEnabled(changedList, //hqb
new ComponentName(packageName,
UserBackupSettingsActivity.class.getName()), false, isAdmin)
|| somethingChanged;
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.UserSettingsActivity.class.getName()),false, isAdmin)
|| somethingChanged;
packages/apps/Settingsres/xml/top_level_settings.xml
移除下拉状态栏编辑图标
frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java
setting搜索框过滤某些关键字
packages/apps/SettingsIntelligence/src/com/android/settings/intelligence/search/SearchResultsAdapter.java
// modify by yxiaobin Search for cast, and no result is displayed begin
import android.util.Log;
import android.text.TextUtils;
// modify by yxiaobin Search for cast, and no result is displayed end
public void postSearchResults(List<? extends SearchResult> newSearchResults) {
final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(
new SearchResultDiffCallback(mSearchResults, newSearchResults));
mSearchResults.clear();
/* modify by yxiaobin Search for cast, and no result is displayed begin */
notifyDataSetChanged();
int index = -1;
if(newSearchResults.size()>0){
for (int i= 0; i < newSearchResults.size(); i++) {
SearchResult sr = newSearchResults.get(i);
String title ="";
String summary="";
String dataKey="";
if(!TextUtils.isEmpty(sr.title)){
title = sr.title.toString();}
if(!TextUtils.isEmpty(sr.summary)){
summary=sr.summary.toString();}
if(!TextUtils.isEmpty(sr.dataKey)){
dataKey=sr.dataKey.toString();}
if("Cast".equalsIgnoreCase(title)||"cast".equalsIgnoreCase(summary)||"cast".equalsIgnoreCase(dataKey)||"Cast options".equalsIgnoreCase(title)||"Wi-Fi calling".equalsIgnoreCase(title)
|| title.contains("Wireless") || summary.contains("Receive wireless") || summary.contains("Wireless") || dataKey.contains("Wireless")
|| title.contains("Face") || summary.contains("Face") ){//modify by lzerong 20230601 for remove EmergencyBroadcast and Face ID
index = i;
newSearchResults.remove(index);
notifyDataSetChanged();
i--;
}
}
}
在clearallbutton中图标和文本动态居中
//packages/apps/Launcher3/quickstep/src/com/sprd/ext/clearall/ClearAllButton.java
protected void onDraw(Canvas canvas) {
Drawable[] drawables = getCompoundDrawables();
if(drawables !=null) {
Drawable drawableLeft = drawables[0];
if(drawableLeft !=null) {
float textWidth = getPaint().measureText(getText().toString());
int drawablePadding = getCompoundDrawablePadding();
int drawableWidth =0;
drawableWidth = drawableLeft.getIntrinsicWidth();
float bodyWidth = textWidth + drawableWidth + drawablePadding;
canvas.translate((getWidth() - bodyWidth) /2,0);
}
}
super.onDraw(canvas);
}
Google search替换成可移动可删除的小部件
//packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java
--public static final boolean QSB_ON_FIRST_SCREEN = true;
++public static final boolean QSB_ON_FIRST_SCREEN = false;
//vendor/partner_gms/apps/GmsSampleIntegration/res_dhs_full/xml/partner_default_layout.xml
++<appwidget screen="0" x="0" y="0" spanX="5" spanY="1" packageName="com.google.android.googlequicksearchbox" className="com.google.android.googlequicksearchbox.SearchWidgetProvider" />
//vendor/partner_gms/apps/SearchLauncher/res/xml/launcher_preferences.xml
-- <androidx.preference.PreferenceScreen
android:key="pref_smartspace"
android:persistent="false"
android:summary="@string/smartspace_preferences_in_settings_desc"
android:title="@string/smartspace_preferences_in_settings"/>
模拟按键命令
public static void sendKeyEvent(final int KeyCode) {
new Thread() {
public void run() {
try {
Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyCode);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
判断屏幕是否旋转
import android.content.SharedPreferences;
import com.android.launcher3.Utilities;
private boolean getHomeRotationEnabled(){
SharedPreferences mSharedPrefs = Utilities.getPrefs(getContext());
boolean mHomeRotationEnabled=mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY,false);
Log.d("TaskView","mHomeRotationEnabled:"+mHomeRotationEnabled);
return mHomeRotationEnabled;
}
定制侧滑返回
//frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java
navigation_edge_panel_width 110
navigation_edge_panel_height 200
//mPaint.setStyle(Paint.Style.FILL); 填充线条 Paint.Style.STROKE不填充
//mPaintwt.setColor(Color.LTGRAY); 设置颜色
//mArrowPaint.setStrokeWidth(4); 线条粗细
//mPaintwt.setAlpha(180); 透明度
private final Paint mPaint = new Paint()
Path mPath= new Path();
@Override
protected void onDraw(Canvas canvas) {
float pointerPosition = mCurrentTranslation - mArrowThickness / 2.0f;
mPath.reset();
int factor = mIsLeftPanel ? 1 : -1;
int currentY = getHeight() / 2;
int topY = 0;
int bottomY = getHeight();
int footX = mIsLeftPanel ? 0 : getWidth();
int peekX = (int) (footX + factor * (mIsLeftPanel ? pointerPosition : pointerPosition - getStaticArrowWidth()) / 2);
mPath.moveTo(footX, topY);
mPath.cubicTo(footX, topY + 75, peekX, topY + 100, peekX, currentY);
mPath.cubicTo(peekX, bottomY - 100, footX, bottomY - 75, footX, bottomY);
mPath.close();
//canvas.drawColor(Color.argb(125,255,0,0));
canvas.drawPath(mPath, mPaintwt);
mArrowPath.reset();
mArrowPath.moveTo(mIsLeftPanel?(peekX-40 + dp(3.5f)):(peekX+40 + dp(3.5f)), getHeight() / 2 - dp(5.5f));
mArrowPath.lineTo(mIsLeftPanel?(peekX-40 - dp(4f)):(peekX+40 - dp(4f)), getHeight() / 2);
mArrowPath.lineTo(mIsLeftPanel?(peekX-40 + dp(3.5f)):(peekX+40 + dp(3.5f)), getHeight() / 2 + dp(5.5f));
canvas.drawPath(mArrowPath, mArrowPaint);
}
判断WiFi是否连接、数据是否开启
//判断网络是否连接
public boolean isWifiConnect() {
ConnectivityManager connManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return mWifiInfo.isConnected();
}
//判断数据是否打开
import android.telephony.TelephonyManager;
private TelephonyManager mTelephonyManager;
if (mTelephonyManager == null) {
mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
}
if (mTelephonyManager != null && !mTelephonyManager.isDataEnabled()) {
state.typeId = 0;
}
获取顶部activity
private String getPkgName(Context context) {
try {
ActivityManager am = context.getSystemService(ActivityManager.class);
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
return tasks.get(0).topActivity.getPackageName();
} catch (Exception e) {
//ignore
}
return "";
}
拦截屏幕滑动事件
//frameworks/base/core/java/android/view/ViewGroup.java
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.isFromSource(InputDevice.SOURCE_MOUSE)
&& ev.getAction() == MotionEvent.ACTION_DOWN
&& ev.isButtonPressed(MotionEvent.BUTTON_PRIMARY)
&& isOnScrollbarThumb(ev.getX(), ev.getY())) {
return true;
}
if((ev.getPointerCount() >= 3)&&(Settings.Secure.getInt(mContext.getContentResolver(), "screenshot_pointer", 0)==1)){
return true;//hqingbin 2023.2.14 The screen does not slide when taking a three-finger screenshot
}
return false;
}
锁屏事件
//获取锁屏锁的状态
//Y:\AndroidS\sprd.mocor12.androidS\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\KeyguardStateController.java
mKeyguardStateController.isMethodSecure()
android横竖屏判断
//获取设置的配置信息
Configuration mConfiguration = this.getResources().getConfiguration();
//获取屏幕方向
int ori = mConfiguration.orientation;
if (ori == mConfiguration.ORIENTATION_LANDSCAPE) {
//横屏
} else if (ori == mConfiguration.ORIENTATION_PORTRAIT) {
//竖屏
}
打开开发者模式点击次数修改
packages\apps\Settings\src\com\android\settings\deviceinfo\BuildNumberPreferenceController.java里面的TAPS_TO_BE_A_DEVELOPER
长按电源键弹出的功能修改
frameworks/base/core/res/res/values/config.xml中的config_globalActionsList
修改默认导航键选项
frameworks/base/packages/SettingsProvider/res/values/defaults.xml中的def_navigation_bar_config
修改锁屏时录屏是否停止
frameworks/base/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
BroadcastReceiver mShutDownReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
/* UNISOC: Modify for bug 1880099 stop recording when screen off {@ */
if (Intent.ACTION_SHUTDOWN.equals(action)) {
Log.d(TAG, "SHUTDOWN, Stopping Recording.");
int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
if (userId == -1) {
userId = mUserContextTracker.getUserContext().getUserId();
}
stopRecording(userId);
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
Log.d(TAG, "Screen Off, Stopping Recording.");
//hqingbin 2023.5.16 Lock the screen and the recording stops automatically end
//onStartCommand(getStopIntent(getApplicationContext()), 0, 0);
//hqingbin 2023.5.16 Lock the screen and the recording stops automatically end
}
/* @} */
}
};
单点模式下两点快速触摸会错位
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
Log.d(TAG, "ygl--event.getAction())::" + event.getAction());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "ygl--MotionEvent.ACTION_DOWN::" + MotionEvent.ACTION_DOWN);
touchDown(event);
//hqingbin 2023.5.15 Line drift begin
movex = event.getX();
movey = event.getY();
//hqingbin 2023.5.15 Line drift end
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "ygl--MotionEvent.ACTION_MOVE::" + MotionEvent.ACTION_MOVE);
//hqingbin 2023.5.15 Line drift begin
if(Math.abs(movex - event.getX())>175||Math.abs(movey - event.getY())>175){
break;
}
touchMove(event);
movex=event.getX();
movey=event.getY();
//hqingbin 2023.5.15 Line drift end
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "ygl--MotionEvent.ACTION_UP::" + MotionEvent.ACTION_UP);
//mTouchDown = false;
Log.d(TAG, "mPassNum:" + mPassNum + " mTotalPassCount:" + mTotalPassCount);
if (mPassNum == mTotalPassCount) {
mIsRun = false;
mHandler.sendEmptyMessageDelayed(0, 200);
}
break;
长按google search不显示Glance widget
vendor/partner_gms/apps/SearchLauncher/quickstep/src/com/android/searchlauncher/SmartSpaceHostView.java
@Override
public boolean onLongClick(View view) {
if (!hasSettings(view.getContext())) {
return false;
}
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
Rect pos = new Rect();
mLauncher.getDragLayer().getDescendantRectRelativeToSelf(this, pos);
RectF centerPos = new RectF();
centerPos.left = centerPos.right = pos.exactCenterX();
// Set the top to match draglayer, so that the popup doesn't appear above the view.
centerPos.top = 0;
centerPos.bottom = pos.bottom;
// Adjust the bottom to match the bottom most visible child
centerPos.bottom = Math.min(findBottomRecur(this, pos.top, pos), centerPos.bottom);
OptionItem item = new OptionItem(mLauncher,
R.string.smartspace_preferences,
R.drawable.ic_smartspace_preferences,
LAUNCHER_SEARCH_SMARTSPACE_PREFERENCES_TAP_OR_LONGPRESS,
this::openSettings);
//OptionsPopupView.show(mLauncher, centerPos, Collections.singletonList(item), false);
//hqingbin 2023.5.11 Glance widget removed
return true;
}
修改运营商信号格强度标准
frameworks/base/telephony/java/android/telephony/CellSignalStrengthGsm.java
修改滑动解锁滑动距离
1、frameworks/base/packages/SystemUI/res/values/dimens.xml
<dimen name="unlock_falsing_threshold">40dp</dimen>
2、frameworks/base/packages/SystemUI/src/com/android/systemui/classifier/DistanceClassifier.java
private static final float HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN = 1;
3、frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelViewController.java
return getExpandedFraction() > 0.8f;
输入正确的PIN直接解锁
//frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java
@Override
protected void onViewAttached() {
super.onViewAttached();
for (NumPadKey button: mView.getButtons()) {
button.setOnTouchListener((v, event) -> {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
mFalsingCollector.avoidGesture();
}
return false;
});
}
mPasswordEntry.setOnKeyListener(mOnKeyListener);
mPasswordEntry.setUserActivityListener(this::onUserInput);
View deleteButton = mView.findViewById(R.id.delete_button);
deleteButton.setOnTouchListener(mActionButtonTouchListener);
deleteButton.setOnClickListener(v -> {
// check for time-based lockouts
if (mPasswordEntry.isEnabled()) {
mPasswordEntry.deleteLastChar();
}
});
deleteButton.setOnLongClickListener(v -> {
// check for time-based lockouts
if (mPasswordEntry.isEnabled()) {
mView.resetPasswordText(true /* animate */, true /* announce */);
}
mView.doHapticKeyClick();
return true;
});
View okButton = mView.findViewById(R.id.key_enter);
if (okButton != null) {
okButton.setOnTouchListener(mActionButtonTouchListener);
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mPasswordEntry.isEnabled()) {
verifyPasswordAndUnlock();
}
}
});
okButton.setOnHoverListener(mLiftToActivateListener);
}
//hqb 2023.4.14 Enter the correct PIN to unlock directly begin
mPasswordEntry.setUserActivityListener(new PasswordTextView.UserActivityListener() {
@Override
public void onUserActivity() {
String entry = mPasswordEntry.getText();
int passlength = Settings.Global.getInt(mView.getContext().getContentResolver(),"passlength", 0);
if(passlength !=0 && passlength==entry.length()){
verifyPasswordAndUnlock();
}
}
});
//hqb 2023.4.14 Enter the correct PIN to unlock directly end
}
//packages/apps/Settings/src/com/android/settings/password/ChooseLockPassword.java
public void handleNext() {
if (mSaveAndFinishWorker != null) return;
// TODO(b/120484642): This is a point of entry for passwords from the UI
final Editable passwordText = mPasswordEntry.getText();
if (TextUtils.isEmpty(passwordText)) {
return;
}
mChosenPassword = mIsAlphaMode ? LockscreenCredential.createPassword(passwordText)
: LockscreenCredential.createPin(passwordText);
if (mUiStage == Stage.Introduction) {
if (validatePassword(mChosenPassword)) {
mFirstPassword = mChosenPassword;
mPasswordEntry.setText("");
updateStage(Stage.NeedToConfirm);
} else {
mChosenPassword.zeroize();
}
} else if (mUiStage == Stage.NeedToConfirm) {
if (mChosenPassword.equals(mFirstPassword)) {
//hqb 2023.4.14 Enter the correct PIN to unlock directly begin
if(!mIsAlphaMode){
Settings.Global.putInt(getContext().getContentResolver(),"passlength", passwordText.length());
}
//hqb 2023.4.14 Enter the correct PIN to unlock directly end
startSaveAndFinish();
} else {
CharSequence tmp = mPasswordEntry.getText();
if (tmp != null) {
Selection.setSelection((Spannable) tmp, 0, tmp.length());
}
updateStage(Stage.ConfirmWrong);
mChosenPassword.zeroize();
}
}
}
Launcher字体固定
packages\apps\Launcher3\src\com\android\launcher3\BubbleTextView.java
public BubbleTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mActivity = ActivityContext.lookupContext(context);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.BubbleTextView, defStyle, 0);
mLayoutHorizontal = a.getBoolean(R.styleable.BubbleTextView_layoutHorizontal, false);
mIsRtl = (getResources().getConfiguration().getLayoutDirection()
== View.LAYOUT_DIRECTION_RTL);
DeviceProfile grid = mActivity.getDeviceProfile();
//hqingbin 2023.5.8 Determine whether to rotate begin
Configuration mConfiguration = context.getResources().getConfiguration();
int ori = mConfiguration.orientation;
//hqingbin 2023.5.8 Determine whether to rotate begin
mDisplay = a.getInteger(R.styleable.BubbleTextView_iconDisplay, DISPLAY_WORKSPACE);
final int defaultIconSize;
//hqingbin 2023.4.24 Desktop application icon names are not fully displayed begin
if (grid.iconTextSizePx>24.0f) {
if (grid.iconTextSizePx>27.5f) {
if (grid.iconTextSizePx>31.0f) {
mIconTextSize = 27.5f;
} else {
mIconTextSize = 26.0f;
}
} else {
mIconTextSize = 24.0f;
}
} else {
mIconTextSize = grid.iconTextSizePx;
}
//hqingbin 2023.4.24 Desktop application icon names are not fully displayed end
//add by cjianyong for Blu Public to app label double-line display @20230207
setMaxLines(2);
if (mDisplay == DISPLAY_WORKSPACE) {
if(ori == mConfiguration.ORIENTATION_LANDSCAPE){//hqingbin 2023.5.8 Determine whether to rotate
setTextSize(TypedValue.COMPLEX_UNIT_PX, grid.iconTextSizePx);
}else{
setTextSize(TypedValue.COMPLEX_UNIT_PX, mIconTextSize);
}
setCompoundDrawablePadding(grid.iconDrawablePaddingPx);
defaultIconSize = grid.iconSizePx;
setCenterVertically(grid.isScalableGrid);
} else if (mDisplay == DISPLAY_ALL_APPS) {
if(ori == mConfiguration.ORIENTATION_LANDSCAPE){//hqingbin 2023.5.8 Determine whether to rotate
setTextSize(TypedValue.COMPLEX_UNIT_PX, grid.allAppsIconTextSizePx);
}else{
setTextSize(TypedValue.COMPLEX_UNIT_PX, mIconTextSize);
}
setCompoundDrawablePadding(grid.allAppsIconDrawablePaddingPx);
defaultIconSize = grid.allAppsIconSizePx;
} else if (mDisplay == DISPLAY_FOLDER) {
if(ori == mConfiguration.ORIENTATION_LANDSCAPE){//hqingbin 2023.5.8 Determine whether to rotate
setTextSize(TypedValue.COMPLEX_UNIT_PX, grid.folderChildTextSizePx);
}else{
setTextSize(TypedValue.COMPLEX_UNIT_PX, mIconTextSize);
}
setCompoundDrawablePadding(grid.folderChildDrawablePaddingPx);
defaultIconSize = grid.folderChildIconSizePx;
//add by cjianyong for Blu Public to app label double-line display @20230207
setMaxLines(1);
去除按5次启动紧急拨号
frameworks/base/services/core/java/com/android/server/GestureLauncherService.java
isEmergencyGestureSettingEnabled
如何使apk在编译时生成到指定的目录下
在对应的apk代码目录下的Android.mk中添加下面语句
LOCAL_MODULE := SprdTest
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
+LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app //表示最后的目标安装路径
长按打开手电筒
frameworks/base/services/core/java/com/android/server/media/MediaSessionService.java
@Override
public void dispatchVolumeKeyEvent(String packageName, String opPackageName,
boolean asSystemService, KeyEvent keyEvent, int stream, boolean musicOnly) {
if (keyEvent == null
|| (keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_UP
&& keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_DOWN
&& keyEvent.getKeyCode() != KeyEvent.KEYCODE_VOLUME_MUTE)) {
Log.w(TAG, "Attempted to dispatch null or non-volume key event.");
return;
}
//lzerong 2023.5.24 To turn on and off the flashlight, press the volume up button for a long time begin
final int keyCode = keyEvent.getKeyCode();
final boolean down = keyEvent.getAction() == KeyEvent.ACTION_DOWN;
boolean up = keyEvent.getAction() == KeyEvent.ACTION_UP;
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
if((keyCode == KeyEvent.KEYCODE_VOLUME_UP)&& down && !pm.isScreenOn()&&(Settings.Secure.getInt(mContext.getContentResolver(),"quick_flashlight_enabled",0)==1)){
mLongVolumeUpdown = true;
mHandler.postDelayed(mLongPressVolumeUp,2000);
}else if((keyCode == KeyEvent.KEYCODE_VOLUME_UP)&& up && !pm.isScreenOn()){
mLongVolumeUpdown = false;
}
//lzerong 2023.5.24 To turn on and off the flashlight, press the volume up button for a long time end
final int pid = Binder.getCallingPid();
final int uid = Binder.getCallingUid();
final long token = Binder.clearCallingIdentity();
if (DEBUG_KEY_EVENT) {
Log.d(TAG, "dispatchVolumeKeyEvent, pkg=" + packageName
+ ", opPkg=" + opPackageName + ", pid=" + pid + ", uid=" + uid
+ ", asSystem=" + asSystemService + ", event=" + keyEvent
+ ", stream=" + stream + ", musicOnly=" + musicOnly);
}
try {
synchronized (mLock) {
if (isGlobalPriorityActiveLocked()) {
dispatchVolumeKeyEventLocked(packageName, opPackageName, pid, uid,
asSystemService, keyEvent, stream, musicOnly);
} else {
// TODO: Consider the case when both volume up and down keys are pressed
// at the same time.
mVolumeKeyEventHandler.handleVolumeKeyEventLocked(packageName, pid, uid,
asSystemService, keyEvent, opPackageName, stream, musicOnly);
}
}
} finally {
Binder.restoreCallingIdentity(token);
}
}
//lzerong 2023.5.24 To turn on and off the flashlight, press the volume up button for a long time begin
private boolean mLongVolumeUpdown = false;
private final Runnable mLongPressVolumeUp = new Runnable() {
@Override
public void run() {
if(mLongVolumeUpdown){
Intent intent = new Intent();
intent.setAction("LONG_PRESS_VOLUME_UP_OPEN_FLASH_BY_LZR");
mContext.sendBroadcast(intent);
}
}
};
//lzerong 2023.5.24 To turn on and off the flashlight, press the volume up button for a long time end
在某些情况下,不应该息屏
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
final int keyCode = event.getKeyCode();
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
|| event.isWakeKey();
//add by cjianyong for CD490_S6515-16A_LAVA Factory testing: Press the power button without stopping the screen @2023.6.12 begin
if (keyCode == KeyEvent.KEYCODE_POWER) {
String packageName = getTopActivityPackageName(mContext);
if (null != packageName && packageName.startsWith("com.sprd.validationtools")) {
return 0;
}
}
//add by cjianyong for CD490_S6515-16A_LAVA Factory testing: Press the power button without stopping the screen @2023.6.12 end
//add by cjianyong for CD490_S6515-16A_LAVA Factory testing: Press the power button without stopping the screen @2023.6.12 begin
public String getTopActivityPackageName(Context context) {
String topActivityPackage = null;
ActivityManager activityManager = (ActivityManager) (context
.getSystemService(android.content.Context.ACTIVITY_SERVICE));
List<RunningTaskInfo> runningTaskInfos = activityManager
.getRunningTasks(1);
if (runningTaskInfos != null) {
ComponentName f = runningTaskInfos.get(0).topActivity;
topActivityPackage = f.getPackageName();
}
return topActivityPackage;
}
//add by cjianyong for CD490_S6515-16A_LAVA Factory testing: Press the power button without stopping the screen @2023.6.12 end
}
修改下拉状态栏QS默认选项
frameworks/base/packages/SystemUI/res/values/config.xml
quick_settings_tiles_default
修改长按电源跳出的弹窗选项
frameworks/base/core/res/res/values/config.xml
config_globalActionsList
修改导航键默认样式
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
def_navigation_bar_config
点击5次打开工厂测试
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
return false;
}
mDevHitCountdown ++;
if (mDevHitCountdown % 5 == 0) {
Intent i = new Intent();
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setComponent(new ComponentName("com.sprd.validationtools", "com.sprd.validationtools.ValidationToolsMainActivity"));
mContext.startActivity(i);
return true;
}
return false;
}
移除长按home 出现的google白色圆球
frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
protected boolean shouldShowOrb() {
//modify by wshengnan remove google circle white ball @20230621 start
return false;
//modify by wshengnan remove google circle white ball @20230621 end
}
相机照片添加水印
public void writeExif(byte[] jpeg, OutputStream exifOutStream) throws IOException {
if(WaterMarkController.getInstance()!=null&&WaterMarkController.getInstance().WaterMark!=0){
jpeg=stampImage(jpeg);
}
if (jpeg == null || exifOutStream == null) {
throw new IllegalArgumentException(NULL_ARGUMENT_STRING);
}
OutputStream s = getExifWriterStream(exifOutStream);
s.write(jpeg, 0, jpeg.length);
s.flush();
}
public byte[] stampImage(byte[] b) {
Bitmap masterBitmap=null;
if (b.length != 0) {masterBitmap= BitmapFactory.decodeByteArray(b, 0, b.length);}
Paint paint = new Paint();
paint.setFilterBitmap(true);
Bitmap newBitmap = null;
Canvas canvas = null;
Bitmap bitmap=null;
try {
switch(WaterMarkController.getInstance().WaterMark){
case 1:
bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo1);
break;
case 2:
bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo2);
break;
case 3:
bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo3);
break;
case 4:
bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo4);
break;
case 5:
bitmap = BitmapFactory.decodeResource(CameraApp.getInstance().getApplicationContext().getResources(),R.drawable.water_mark_logo5);
break;
}
newBitmap = Bitmap.createBitmap(masterBitmap.getWidth(), masterBitmap.getHeight(), Bitmap.Config.ARGB_8888);
canvas = new Canvas(newBitmap);
canvas.drawBitmap(masterBitmap, 0, 0, paint);
canvas.drawBitmap(bitmap, masterBitmap.getWidth()/10, masterBitmap.getHeight()*0.97f-bitmap.getHeight(), paint);
canvas.save();
canvas.restore();
} catch (Exception e) {
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();
return data;
}
public byte[] stampText(byte[] b, String label, int labelSize, int labelColor) {
Paint paint = new Paint();
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setColor(labelColor);
paint.setTextSize(labelSize);
Bitmap masterBitmap=null;
Bitmap newBitmap = null;
Canvas canvas = null;
if (b.length != 0) {masterBitmap= BitmapFactory.decodeByteArray(b, 0, b.length);}
try {
Bitmap.Config config = masterBitmap.getConfig();
if (config == null) {
config = Bitmap.Config.ARGB_8888;
}
newBitmap = masterBitmap.copy(config, true);
canvas = new Canvas(newBitmap);
canvas.drawText(label, 500, 500, paint);
canvas.save();
canvas.restore();
} catch (Exception e) {
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();
return data;
}
按电源键不灭屏
sprd.mocor13.androidT/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
@Override // Binder call
public void goToSleep(long eventTime, int reason, int flags) {
//hqingbin 2023.6.21 The power button cannot turn off the screen begin
if(true){
return;
}
//hqingbin 2023.6.21 The power button cannot turn off the screen begin
置灰和禁用但是不置灰
mPreference.setEnabled(false);
android:shouldDisableView="false"
android:enabled="false"
判断是否为开机后第一次解锁
KeyguardUpdateMonitor.StrongAuthTracker strongAuthTracker =
mKeyguardUpdateMonitor.getStrongAuthTracker();
strongAuthTracker.hasUserAuthenticatedSinceBoot()
防止解锁时两声解锁声音
frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
private long prelongTim = 0;//hqingbin 2023.2.9 Prevent two release sounds
private void playSound(int soundId) {
if (soundId == 0) return;
//hqingbin 2023.2.9 Prevent two release sounds begin
if(prelongTim==0){
prelongTim = System.currentTimeMillis();
}else if(soundId == mUnlockSoundId){
long curTime = System.currentTimeMillis();
long difference = curTime - prelongTim;
prelongTim = curTime;
if (difference < 200) {
return;
}
}
//hqingbin 2023.2.9 Prevent two release sounds end
实现动态禁用导航键
import android.app.StatusBarManager;
private StatusBarManager mStatusBarManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_charging_simple);
mStatusBarManager = (StatusBarManager)getSystemService(Context.STATUS_BAR_SERVICE);/
/*add by sdongxuan 20230621 for The navigation bar is not displayed when the charging animation is displayed begin*/
@Override
protected void onStop() {
super.onStop();
mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
}
@Override
protected void onResume() {
super.onResume();
mStatusBarManager.disable(StatusBarManager.DISABLE_NAVIGATION|StatusBarManager.DISABLE_BACK);
}
/*add by sdongxuan 20230621 for The navigation bar is not displayed when the charging animation is displayed end*/
Calendar默认显示月
\packages\apps\Calendar\src\com\android\calendar\GeneralPreferences.java
public static final int DEFAULT_START_VIEW = CalendarController.ViewType.MONTH;//默认启动视图
限制recent只显示3个task
X:\AndroidT_2\sprd.mocor13.androidT\packages\apps\Launcher3\quickstep\src\com\android\quickstep\RecentTasksList.java
@VisibleForTesting
TaskLoadResult loadTasksInBackground(int numTasks, int requestId, boolean loadKeysOnly) {
int currentUserId = Process.myUserHandle().getIdentifier();
ArrayList<GroupedRecentTaskInfo> rawTasks =
mSysUiProxy.getRecentTasks(numTasks, currentUserId);
while(3<rawTasks.size()){
rawTasks.remove(rawTasks.size()-1);
}
仿苹果hotseat底部白条
Y:\mtk6762_13_alps\alps-mp-t0\vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\Hotseat.java
//hqingbin Add hotseat white bar begin
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAlpha(120);
RectF rectF = new RectF(20, 10, 700, 170);
canvas.drawRoundRect(rectF, 60, 60, paint);
}
//hqingbin Add hotseat white bar end
launcher移除导航栏后动态布局
Y:\mtk6762_13_alps\alps-mp-t0\vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\statemanager\StatefulActivity.java
protected void inflateRootView(int layoutId) {
mRootView = (LauncherRootView) LayoutInflater.from(this).inflate(layoutId, null);
mRootView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
/* | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION */
/* | View.SYSTEM_UI_FLAG_LAYOUT_STABLE */);
}
某些应用未适应屏幕大小
android:maxAspectRatio="2.22"
Android9修改系统分区大小
ap/device/mediateksample/k50v1_64_bsp/BoardConfig.mk
+#hqingbin 2023.7.20 Example Modify the system partition size
+BOARD_MTK_SYSTEM_SIZE_KB := 2872864
修改默认语言
ap/device/mediateksample/k50v1_64_bsp/full_k50v1_64_bsp.mk
Y:\mtk6755_A6\mtk6755_p_alps\ap\device\mediateksample\k50v1_64_bsp
persist.sys.locale=zh-CN
settings总内存修改为3G
Y:\mtk6755\mtk6755_p_alps\ap\vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\applications\ProcStatsData.java
//realTotalRam = memReader.getTotalSize();
realTotalRam = 2f*1000*1000*1000;//hqingbin totalram change
Android9添加锁屏壁纸
添加锁屏壁纸
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/res/drawable-nodpi/default_lock_wallpaper11.jpg b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/res/drawable-nodpi/default_lock_wallpaper11.jpg
new file mode 100755
index 0000000..cc26f20
Binary files /dev/null and b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/res/drawable-nodpi/default_lock_wallpaper11.jpg differ
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
old mode 100644
new mode 100755
index 40ddf5b..fa4f89a
--- a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenWallpaper.java
@@ -42,9 +42,11 @@ import android.util.Log;
import com.android.keyguard.KeyguardUpdateMonitor;
import libcore.io.IoUtils;
-
+import com.android.systemui.R;
import java.util.Objects;
-
+import java.io.IOException;
+import android.os.SystemProperties;
+import android.provider.Settings;
/**
* Manages the lockscreen wallpaper.
*/
@@ -64,10 +66,13 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
// users.
private UserHandle mSelectedUser;
private AsyncTask<Void, Void, LoaderResult> mLoader;
+
+ private Context mContext;
public LockscreenWallpaper(Context ctx, StatusBar bar, Handler h) {
mBar = bar;
mH = h;
+ mContext = ctx;
mWallpaperManager = (WallpaperManager) ctx.getSystemService(Context.WALLPAPER_SERVICE);
mCurrentUserId = ActivityManager.getCurrentUser();
mUpdateMonitor = KeyguardUpdateMonitor.getInstance(ctx);
@@ -97,6 +102,27 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
mUpdateMonitor.setHasLockscreenWallpaper(result.bitmap != null);
mCache = result.bitmap;
}
+ //zya add
+ if (mCache == null && Settings.System.getInt(mContext.getContentResolver(),"is_first_boot",-1)==-1) {
+ Settings.System.putInt(mContext.getContentResolver(),"is_first_boot",1);
+ try {
+ mWallpaperManager.setStream(
+ mContext.getResources().openRawResource(R.drawable.default_lock_wallpaper11),
+ null,
+ true,
+ WallpaperManager.FLAG_LOCK);
+
+ result = loadBitmap(mCurrentUserId, mSelectedUser);
+ if (result.success) {
+ mCached = true;
+ mUpdateMonitor.setHasLockscreenWallpaper(result.bitmap != null);
+ mCache = result.bitmap;
+ }
+ } catch (IOException e) {
+ //Log.e(TAG, "can not set default lockscreen wallpaper");
+ }
+ }
+ //zya end
return mCache;
}
@@ -124,8 +150,8 @@ public class LockscreenWallpaper extends IWallpaperManagerCallback.Stub implemen
} else {
if (selectedUser != null) {
// Show the selected user's static wallpaper.
- return LoaderResult.success(mWallpaperManager.getBitmapAsUser(
- selectedUser.getIdentifier(), true /* hardware */));
+ return LoaderResult.success(
+ mWallpaperManager.getBitmapAsUser(selectedUser.getIdentifier(),true));
} else {
// When there is no selected user, show the system wallpaper
清除应用数据
import android.app.ActivityManager;
import android.provider.Settings;
if(packageName.equals("in.krosbits.musicolet")&&(Settings.Global.getString(mContext.getContentResolver(),"sys.start.forceReload")==null)){
ActivityManager am = (ActivityManager)
mContext.getSystemService(mContext.ACTIVITY_SERVICE);
am.clearApplicationUserData("com.android.launcher3", null);
Settings.Global.putString(mContext.getContentResolver(),"sys.start.forceReload","1");
}
添加图标背景
Y:\mtk6755_A6\mtk6755_p_alps\ap\vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\graphics\LauncherIcons.java
createIconBitmap下面
return getRoundedBitmap(bitmap);
}
public static Bitmap getRoundedBitmap(Bitmap mBitmap){
//Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.frame);
//创建与原始位图大小相同的画布位图ᄡᄡᄑ따샤ᅫ콰ᄐ
/* Bitmap bgBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888);
//初始化画布
Canvas mCanvas = new Canvas(bgBitmap);
Paint mPaint = new Paint();
Rect mRect = new Rect(5, 5, mBitmap.getWidth()-5, mBitmap.getHeight()-5);
RectF mRectF = new RectF(mRect);
//设置圆角半径
float roundPx = 480;
mPaint.setAntiAlias(true);
//绘制圆角矩形
mCanvas.drawRoundRect(mRectF, roundPx, roundPx, mPaint);
//设置图像的叠加模式, 此处模式选择可参考后面的规则
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//绘制图像
mCanvas.drawBitmap(mBitmap, mRect, mRect, mPaint); */
return addBorderToImage(mBitmap);
}
private static Bitmap addBorderToImage(Bitmap src) {
Bitmap output = BitmapFactory.decodeResource(mContext.getResources(),R.drawable.iconback).copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(output);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
//paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
android.util.Log.d("hqb1"," output.getHeight()="+output.getHeight()+" output.getWidth()="+output.getWidth());
Rect dstRect = new Rect(0,0,output.getWidth(),output.getHeight());
canvas.drawBitmap(src, null, dstRect, paint);
return output;
}
默认给与权限
b/ap/frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -863,6 +863,7 @@ public class PermissionManagerService {
// For modern apps keep runtime permissions unchanged.
grant = GRANT_RUNTIME;
}
+ grant = GRANT_INSTALL;
} else if (bp.isSignature()) {
// For all apps signature permissions are install time ones.
allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions);
修改系统支持的语言
ap/frameworks/base/core/res/res/values/locale_config.xml
<string-array translatable="false" name="supported_locales">
Android13新建lunch项
在对应的AndroidProducts.mk下添加
COMMON_LUNCH_CHOICES := \
sys_mssi_64_cn-user \
sys_mssi_64_cn-userdebug
Android13设备名版本修改失败
rm -rf out_sys/target/product/mssi_64_cn/system/build.prop out_sys/target/product/mssi_64_cn/recovery/root/prop.default out_sys/target/product/mssi_64_cn/obj/PACKAGING/target_files_intermediates/sys_mssi_64_cn-target_files-mp1V1010/SYSTEM/build.prop out_sys/target/product/mssi_64_cn/obj/PACKAGING/target_files_intermediates/sys_mssi_64_cn-target_files-mp1V1010/BOOT/RAMDISK/prop.default out_sys/target/product/mssi_64_cn/obj/PACKAGING/system_build_prop_intermediates/buildinfo.prop out_sys/target/product/mssi_64_cn/obj/PACKAGING/system_target_files_intermediates/sys_mssi_64_cn-system_target_files/SYSTEM/build.prop
android 左上角返回上一级的实现
1.在.java中:
//左上角返回
@Override
protected void onStart() {
super.onStart();
ActionBar actionBar = this.getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
这样就会出现左上角返回按钮,但返回的是上一个Activity,跟返回键的功能相同。若需返回指定的activity需进行第二步。
2.在Manifest中:
<activity
android:name=".SecondActivity
android:parentActivityName=".FirstActivity">
</activity>
利用android:parentActivityName指定父类Activity.
android9和Android12修改亮度为线性变化
Android9
Author: huangqingbin <908689287@qq.com>
Date: Tue Jul 18 22:32:36 2023 +0800
修改为线型亮度(亮度默认为50%)
diff --git a/ap/frameworks/base/core/res/res/values/config.xml b/ap/frameworks/base/core/res/res/values/config.xml
old mode 100644
new mode 100755
index 3536b37..a254534
--- a/ap/frameworks/base/core/res/res/values/config.xml
+++ b/ap/frameworks/base/core/res/res/values/config.xml
@@ -1232,7 +1232,8 @@
<!-- Minimum screen brightness setting allowed by the power manager.
The user is forbidden from setting the brightness below this level. -->
- <integer name="config_screenBrightnessSettingMinimum">10</integer>
+ <!-- hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) -->
+ <integer name="config_screenBrightnessSettingMinimum">1</integer>
<!-- Maximum screen brightness allowed by the power manager.
The user is forbidden from setting the brightness above this level. -->
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java b/ap/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java
old mode 100644
new mode 100755
index 4bb0a99..0cf022d
--- a/ap/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/BrightnessLevelPreferenceController.java
@@ -32,7 +32,7 @@ import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.util.Log;
-
+import android.util.MathUtils;//hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) behin
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -128,11 +128,11 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr
private double getCurrentBrightness() {
final int value;
if (isInVrMode()) {
- value = convertLinearToGamma(System.getInt(mContentResolver,
+ value = convertLinearToGammaExt(System.getInt(mContentResolver,
System.SCREEN_BRIGHTNESS_FOR_VR, mMaxBrightness),
mMinVrBrightness, mMaxVrBrightness);
} else {
- value = convertLinearToGamma(Settings.System.getInt(mContentResolver,
+ value = convertLinearToGammaExt(Settings.System.getInt(mContentResolver,
System.SCREEN_BRIGHTNESS, mMinBrightness),
mMinBrightness, mMaxBrightness);
@@ -160,4 +160,11 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr
}
return false;
}
+ //hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) behin
+ private final int convertLinearToGammaExt(int val, int min, int max) {
+ // For some reason, HLG normalizes to the range [0, 12] rather than [0, 1]
+ final float normalizedVal = MathUtils.norm(0, max, val);
+ return (int) (normalizedVal*GAMMA_SPACE_MAX);
+ }
+ //hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) end
}
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
old mode 100644
new mode 100755
index be0aa11..25ea5c9
--- a/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/settings/BrightnessController.java
@@ -19,7 +19,7 @@ package com.android.systemui.settings;
import static com.android.settingslib.display.BrightnessUtils.GAMMA_SPACE_MAX;
import static com.android.settingslib.display.BrightnessUtils.convertGammaToLinear;
import static com.android.settingslib.display.BrightnessUtils.convertLinearToGamma;
-
+import android.util.MathUtils;
import android.animation.ValueAnimator;
import android.content.ContentResolver;
import android.content.Context;
@@ -373,7 +373,7 @@ public class BrightnessController implements ToggleSlider.Listener {
setting = Settings.System.SCREEN_BRIGHTNESS;
}
- final int val = convertGammaToLinear(value, min, max);
+ final int val = convertGammaToLinearExt(value, min, max);
if (stopTracking) {
MetricsLogger.action(mContext, metric, val);
@@ -445,7 +445,7 @@ public class BrightnessController implements ToggleSlider.Listener {
min = mMinimumBacklight;
max = mMaximumBacklight;
}
- if (val == convertGammaToLinear(mControl.getValue(), min, max)) {
+ if (val == convertGammaToLinearExt(mControl.getValue(), min, max)) {
// If we have more resolution on the slider than we do in the actual setting, then
// multiple slider positions will map to the same setting value. Thus, if we see a
// setting value here that maps to the current slider position, we don't bother to
@@ -453,7 +453,7 @@ public class BrightnessController implements ToggleSlider.Listener {
// change to the user even though it isn't one.
return;
}
- final int sliderVal = convertLinearToGamma(val, min, max);
+ final int sliderVal = convertLinearToGammaExt(val, min, max);
animateSliderTo(sliderVal);
}
@@ -475,5 +475,18 @@ public class BrightnessController implements ToggleSlider.Listener {
mSliderAnimator.setDuration(SLIDER_ANIMATION_DURATION);
mSliderAnimator.start();
}
+//hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) behin
+private final int convertGammaToLinearExt(int val, int min, int max) {
+ final float normalizedVal = MathUtils.norm(0, GAMMA_SPACE_MAX, val);
+ int value = (int) (normalizedVal*max);
+ return value>0? value : 1;
+ }
+ private final int convertLinearToGammaExt(int val, int min, int max) {
+ // For some reason, HLG normalizes to the range [0, 12] rather than [0, 1]
+ final float normalizedVal = MathUtils.norm(0, max, val);
+ return (int) (normalizedVal*GAMMA_SPACE_MAX);
+ }
+//hqingbin 2023.7.18 Change to Line brightness (Brightness is 50% by default) end
+
}
Android12
+++ b/alps-mp-t0/frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java
@@ -22,6 +22,7 @@ public class BrightnessUtils {
public static final int GAMMA_SPACE_MIN = 0;
public static final int GAMMA_SPACE_MAX = 65535;
+ public static final boolean ENABLE_GAMMA = false;
// Hybrid Log Gamma constant values
private static final float R = 0.5f;
@@ -75,6 +76,10 @@ public class BrightnessUtils {
* @return The corresponding setting value.
*/
public static final float convertGammaToLinearFloat(int val, float min, float max) {
+ if(!ENABLE_GAMMA){
+ float ratio = (float)val / GAMMA_SPACE_MAX;
+ return min + (float)(ratio * (max - min));
+ }
final float normalizedVal = MathUtils.norm(GAMMA_SPACE_MIN, GAMMA_SPACE_MAX, val);
final float ret;
if (normalizedVal <= R) {
@@ -128,6 +133,10 @@ public class BrightnessUtils {
*/
public static final int convertLinearToGammaFloat(float val, float min, float max) {
// For some reason, HLG normalizes to the range [0, 12] rather than [0, 1]
+ if(!ENABLE_GAMMA){
+ float ratio = (float)(val - min)/ (max - min);
+ return (int)(ratio * GAMMA_SPACE_MAX);
+ }
final float normalizedVal = MathUtils.norm(min, max, val) * 12;
final float ret;
if (normalizedVal <= 1f) {
修改MTK屏幕默认亮度
Android11以前的版本
vendor/mediatek/proprietary/packages/apps/SettingsProvider/res/values/defaults.xml
Android11后的版本
frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java
修改锁屏状态的熄屏时间
frameworks/base/core/res/res/values/config.xml
- <integer name="config_minimumScreenOffTimeout">10000</integer> + <integer name="config_minimumScreenOffTimeout">15000</integer>
禁止关机状态下电源加下键进入工厂模式
禁止关机状态下电源加下键进入工厂模式
diff --git a/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/boot_mode.c b/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/boot_mode.c
old mode 100644
new mode 100755
index b54a2ca..86b4b8d
--- a/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/boot_mode.c
+++ b/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/boot_mode.c
@@ -76,7 +76,7 @@ static int mrdump_check(void)
{
if (mrdump_detection()) {
#ifdef MTK_TC7_FEATURE
- g_boot_mode = FACTORY_BOOT;
+ g_boot_mode = NORMAL_BOOT;
cmdline_append("frdump_boot=1");
#endif
mt65xx_backlight_on();
@@ -165,7 +165,7 @@ void boot_mode_select(void)
if (mtk_detect_key(MT65XX_FACTORY_KEY)) {
dprintf(CRITICAL, "%s Detect key\n",MODULE_NAME);
dprintf(CRITICAL, "%s Enable factory mode\n",MODULE_NAME);
- g_boot_mode = FACTORY_BOOT;
+ g_boot_mode = NORMAL_BOOT;
//video_printf("%s : detect factory mode !\n",MODULE_NAME);
return;
}
@@ -243,7 +243,7 @@ void boot_mode_select(void)
if (mtk_detect_key(MT65XX_FACTORY_KEY)) {
dprintf(INFO, "%s Detect key\n",MODULE_NAME);
dprintf(INFO, "%s Enable factory mode\n",MODULE_NAME);
- g_boot_mode = FACTORY_BOOT;
+ g_boot_mode = NORMAL_BOOT;
//video_printf("%s : detect factory mode !\n",MODULE_NAME);
return TRUE;
}
diff --git a/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/factory.c b/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/factory.c
old mode 100644
new mode 100755
index ed8cddf..8c716fd
--- a/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/factory.c
+++ b/ap/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6755/factory.c
@@ -37,7 +37,7 @@ BOOL factory_check_key_trigger(void)
{
printf("%s Detect key\n",MODULE_NAME);
printf("%s Enable factory mode\n",MODULE_NAME);
- g_boot_mode = FACTORY_BOOT;
+ g_boot_mode = NORMAL_BOOT;
//video_printf("%s : detect factory mode !\n",MODULE_NAME);
return TRUE;
}
某些应用小部件不允许调整大小、不显示某些应用小部件
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java b/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
index 66fb3c6..fbb4c54 100755
--- a/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/Workspace.java
@@ -1911,6 +1911,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
item.spanX = resultSpan[0];
item.spanY = resultSpan[1];
AppWidgetHostView awhv = (AppWidgetHostView) cell;
+ android.util.Log.d("hqb1","1");
AppWidgetResizeFrame.updateWidgetSizeRanges(awhv, mLauncher, resultSpan[0],
resultSpan[1]);
}
@@ -1955,7 +1956,10 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
onCompleteRunnable = new Runnable() {
public void run() {
if (!isPageInTransition()) {
+ android.util.Log.d("hqb1","pInfo.label="+pInfo.label);
+ if(!pInfo.label.equals("NewWidght")){
AppWidgetResizeFrame.showForWidget(hostView, cellLayout);
+ }
}
}
};
@@ -2603,6 +2607,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
((PendingAddWidgetInfo) pendingInfo).boundWidget : null;
if (finalView != null && updateWidgetSize) {
+ android.util.Log.d("hqb1","3");
AppWidgetResizeFrame.updateWidgetSizeRanges(finalView, mLauncher, item.spanX,
item.spanY);
}
ts06@blueshark03:~/work/mtk6755_p_alps_fanmu/mtk6755_p_alps/ap$ git diff vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java b/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java
old mode 100644
new mode 100755
index 9f8f263..d1c6c76
--- a/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WidgetsModel.java
@@ -185,6 +185,10 @@ public class WidgetsModel {
}
String packageName = item.componentName.getPackageName();
+ android.util.Log.d("hqb1","packageName="+packageName);
+ if(packageName.equals("com.example.newwidght")){
+ continue;
+ }
PackageItemInfo pInfo = tmpPackageItemInfos.get(packageName);
if (pInfo == null) {
pInfo = new PackageItemInfo(packageName);
Android9取消未知安装
Author: huangqingbin <hqingbin@waterworld.com.cn>
Date: Tue Nov 21 18:32:05 2023 +0800
取消未知安装
diff --git a/ap/frameworks/base/core/java/android/app/AppOpsManager.java b/ap/frameworks/base/core/java/android/app/AppOpsManager.java
old mode 100644
new mode 100755
index 5559af2..686434d
--- a/ap/frameworks/base/core/java/android/app/AppOpsManager.java
+++ b/ap/frameworks/base/core/java/android/app/AppOpsManager.java
@@ -1240,7 +1240,7 @@ public class AppOpsManager {
AppOpsManager.MODE_ALLOWED, // OP_RUN_IN_BACKGROUND
AppOpsManager.MODE_ALLOWED, // OP_AUDIO_ACCESSIBILITY_VOLUME
AppOpsManager.MODE_ALLOWED,
- AppOpsManager.MODE_DEFAULT, // OP_REQUEST_INSTALL_PACKAGES
+ AppOpsManager.MODE_ALLOWED, // OP_REQUEST_INSTALL_PACKAGES
AppOpsManager.MODE_ALLOWED, // OP_PICTURE_IN_PICTURE
AppOpsManager.MODE_DEFAULT, // OP_INSTANT_APP_START_FOREGROUND
AppOpsManager.MODE_ALLOWED, // ANSWER_PHONE_CALLS
diff --git a/ap/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/ap/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
old mode 100644
new mode 100755
index 8b90997..b87dc4b
--- a/ap/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/ap/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -314,7 +314,9 @@ public final class DefaultPermissionGrantPolicy {
//by ken add start for app Permissions
if(pkg.packageName.equals("com.mediatek.filemanager")|| pkg.packageName.equals("com.android.browser")
|| pkg.packageName.equals("com.android.calendar")|| pkg.packageName.equals("com.android.soundrecorder")
- || pkg.packageName.equals("com.android.fmradio")|| pkg.packageName.equals("com.android.music")){
+ || pkg.packageName.equals("com.android.fmradio")
+ || pkg.packageName.equals("com.android.hotapps")
+ || pkg.packageName.equals("com.android.music")){
grantRuntimePermissionsForPackage(userId, pkg);
}else{
if (!isSysComponentOrPersistentPlatformSignedPrivApp(pkg)
diff --git a/ap/vendor/mediatek/proprietary/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/ap/vendor/mediatek/proprietary/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
index fd49690..6872bfe 100755
--- a/ap/vendor/mediatek/proprietary/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/ap/vendor/mediatek/proprietary/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -513,7 +513,8 @@ public class PackageInstallerActivity extends OverlayTouchActivity implements On
final int installAppsRestrictionSource = mUserManager.getUserRestrictionSource(
UserManager.DISALLOW_INSTALL_APPS, Process.myUserHandle());
if ((installAppsRestrictionSource & UserManager.RESTRICTION_SOURCE_SYSTEM) != 0) {
- showDialogInner(DLG_INSTALL_APPS_RESTRICTED_FOR_USER);
+ //showDialogInner(DLG_INSTALL_APPS_RESTRICTED_FOR_USER);
+ initiateInstall();
return;
} else if (installAppsRestrictionSource != UserManager.RESTRICTION_NOT_SET) {
startActivity(new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS));
@@ -533,7 +534,8 @@ public class PackageInstallerActivity extends OverlayTouchActivity implements On
startActivity(new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS));
finish();
} else {
- handleUnknownSources();
+ initiateInstall();
+ //handleUnknownSources();
}
}
}
@@ -541,8 +543,7 @@ public class PackageInstallerActivity extends OverlayTouchActivity implements On
private void handleUnknownSources() {
if (mOriginatingPackage == null) {
Log.i(TAG, "No source found for package " + mPkgInfo.packageName);
- //showDialogInner(DLG_ANONYMOUS_SOURCE);
- initiateInstall();
+ showDialogInner(DLG_ANONYMOUS_SOURCE);
return;
}
// Shouldn't use static constant directly, see b/65534401.
编译ota升级包命令
整包
make -j16 otapackage
Android11差异包
./build/tools/releasetools/ota_from_target_files -v -i v1.zip --block -p out/host/linux-x86 -k build/target/product/security/testkey v2.zip update.zip
android 13 差分包指令
./out_sys/host/linux-x86/bin/ota_from_target_files --path out_sys/host/linux-x86/ -v -i old_ota.zip new_ota.zip upate.zip
mtk的FM设置为可卸载后会报错
system/app或者priv-app目录下的系统应用需要可卸载
vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_system_list.txt
在文件中添加需要可卸载应用的包名
如果会报错则需要将缺乏的so文件添加到system/core/rootdir/etc/public.libraries.android.txt 文件中
Android 跳转到文件管理某个目录
private void openMusic(){
Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary:Music");
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
startActivityForResult(intent, 1);
}
修改壁纸库壁纸尺寸为真实尺寸
vendor/mediatek/proprietary/packages/apps/WallpaperPicker/src/com/android/wallpaperpicker/WallpaperUtils.java
vendor/mediatek/proprietary/packages/apps/WallpaperPicker/src/com/android/wallpaperpicker/WallpaperUtils.java
@@ -146,6 +146,7 @@ public final class WallpaperUtils {
defaultHeight = maxDim;
}
sDefaultWallpaperSize = new Point(defaultWidth, defaultHeight);
+ sDefaultWallpaperSize = realSize;
}
return sDefaultWallpaperSize;
}
Mtk改屏目录
vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/
kernel-4.14/drivers/misc/mediatek/lcm/