项目不带通话功能,要求通过计算器输入暗码打开测试应用。
- 查看布局文件 数字显示控件
packages\apps\ExactCalculator\res\layout\display_one_line.xml
...<com.android.calculator2.CalculatorScrollViewandroid:id="@+id/formula_container"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:overScrollMode="never"android:scrollbars="none"><!--用户输入显示控件--><com.android.calculator2.CalculatorFormulaandroid:id="@+id/formula"style="@style/DisplayTextStyle.Formula"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="bottom|end"android:ellipsize="none"android:gravity="bottom|end"android:longClickable="true"android:singleLine="true"android:textColor="@color/display_formula_text_color"android:textIsSelectable="false" /></com.android.calculator2.CalculatorScrollView>
...
- 自定义控件CalculatorFormula最终继承了TextView,并且重写了onTextChanged方法。
packages/apps/ExactCalculator/src/com/android/calculator2/CalculatorFormula.java
package com.android.calculator2;...
import android.content.Intent;///mh.modify /*** TextView adapted for displaying the formula and allowing pasting.*/
public class CalculatorFormula extends AlignedTextView implements MenuItem.OnMenuItemClickListener,ClipboardManager.OnPrimaryClipChangedListener {public static final String TAG_ACTION_MODE = "ACTION_MODE";...private Context mContext;///mh.modifypublic CalculatorFormula(Context context) {this(context, null /* attrs */);}public CalculatorFormula(Context context, AttributeSet attrs) {this(context, attrs, 0 /* defStyleAttr */);}//修改构造方法,context启动应用时需要public CalculatorFormula(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mContext = context;//mh.modifymClipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CalculatorFormula, defStyleAttr, 0);mMaximumTextSize = a.getDimension(R.styleable.CalculatorFormula_maxTextSize, getTextSize());mMinimumTextSize = a.getDimension(R.styleable.CalculatorFormula_minTextSize, getTextSize());mStepTextSize = a.getDimension(R.styleable.CalculatorFormula_stepTextSize,(mMaximumTextSize - mMinimumTextSize) / 3);a.recycle();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {setupActionMode();} else {setupContextMenu();}}...///mh.modify start 20190615private void handleSecretCode(Context context, String input) {android.util.Log.d("mh.log", "input:"+input);int len = input.length();if (len >= 8 && input.startsWith("!^!^") && input.endsWith("^!^!")) {Intent intent = new Intent();if("!^!^6,868^!^!".equals(input)) {intent.setClassName("com.xckj.factorytest", "com.xckj.factorytest.FactoryTestEntry");}if("!^!^3,646,633^!^!".equals(input)) {intent.setClassName("com.mediatek.engineermode", "com.mediatek.engineermode.EngineerMode");}try {intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}catch(Exception e){}}}///mh.modify end 20190615@Overrideprotected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {super.onTextChanged(text, start, lengthBefore, lengthAfter);setTextSize(TypedValue.COMPLEX_UNIT_PX, getVariableTextSize(text.toString()));handleSecretCode(mContext, text.toString());//调用}...