ภาพรวม
UserManager.isUserAGoat() เป็นเมธอด Easter Egg (ฟีเจอร์ลับเพื่อความสนุก) ใน Android Framework ไม่ได้มีไว้ใช้งานจริงใน Production Code
คำอธิบายเมธอด
public boolean isUserAGoat() {
// API 17-20: คืนค่า false เสมอ
// API 21+: คืนค่า true ถ้ามีแอป com.coffeestainstudios.goatsimulator ติดตั้ง
// API 30+: คืนค่า false เสมอ (ถูกลบฟังก์ชัน Goat Simulator ออก)
}
ประวัติความเป็นมา
- API 17 (Jelly Bean MR1): เพิ่มเมธอด คืนค่า
falseเสมอ - API 21 (Lollipop): เปลี่ยนเป็นตรวจสอบว่าแอป
com.coffeestainstudios.goatsimulator(Goat Simulator) ติดตั้งอยู่หรือไม่ - API 30 (Android 11): กลับมาเป็น
falseเสมออีกครั้ง
ตัวอย่างโค้ด (สำหรับการศึกษาเท่านั้น)
package com.example.myapplication;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView actionEvent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
actionEvent = findViewById(R.id.actionEvent);
actionEvent.setText("Check Goat");
actionEvent.setOnClickListener(v -> {
boolean isGoat = isUserAGoat();
actionEvent.setText("isUserAGoat(): " + isGoat);
});
}
// วิธีการทำงานจริงของ Framework (API 21-29)
public boolean isUserAGoat() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP ||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
return false;
}
PackageManager pm = getPackageManager();
try {
pm.getPackageInfo("com.coffeestainstudios.goatsimulator", PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
}
⚠️ ไม่ควรใช้ใน Production Code
- เป็น Easter Egg เท่านั้น ไม่มี Semantic Meaning
- พฤติกรรมเปลี่ยนแปลงตาม Version ไม่เสถียร
- อาจถูกลบหรือเปลี่ยนแปลงในอนาคตโดยไม่แจ้งเตือน
- ไม่ผ่าน Code Review ในองค์กรที่จริงจัง
กรณีที่น่าสนใจ (Just for Fun)
- Demo/Teaching: ใช้สอนเรื่อง Easter Egg ใน Software
- Debug Build: ใช้เป็น Feature Toggle สำหรับ Debug Menu (แต่ควรใช้ BuildConfig.DEBUG แทน)
- Testing: ทดสอบว่า Code Handle ค่าที่ไม่คาดคิดได้หรือไม่
- Android Version Easter Egg: Settings → About Phone → Tap Android Version หลายครั้ง
ActivityManager.isUserAMonkey()- ตรวจสอบว่า UI ถูกทดสอบโดย Monkey Tool- Developer Options → "Show taps", "Pointer location" เป็นต้น
Easter Egg อื่นๆ ใน Android
สรุป
UserManager.isUserAGoat() ไม่มี Use Case จริงใน Production
เป็นเพียง Easter Egg ของนักพัฒนา Android Framework หากเห็นใน Codebase จริง ควร Refactor ออกทันที