Home | History | Annotate | Download | only in fakeoemfeatures
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.fakeoemfeatures;
     18 
     19 import android.app.ActivityManager;
     20 import android.app.ActivityThread;
     21 import android.app.AlertDialog;
     22 import android.app.Application;
     23 import android.app.Dialog;
     24 import android.content.ComponentName;
     25 import android.content.Context;
     26 import android.content.Intent;
     27 import android.content.ServiceConnection;
     28 import android.os.Handler;
     29 import android.os.IBinder;
     30 import android.os.Message;
     31 import android.util.Slog;
     32 import android.view.Display;
     33 import android.view.ViewGroup;
     34 import android.view.WindowManager;
     35 
     36 public class FakeApp extends Application {
     37     // Stuffing of 20MB
     38     static final int STUFFING_SIZE_BYTES = 20*1024*1024;
     39     static final int STUFFING_SIZE_INTS = STUFFING_SIZE_BYTES/4;
     40     int[] mStuffing;
     41 
     42     // Assume 4k pages.
     43     static final int PAGE_SIZE = 4*1024;
     44 
     45     static final long TICK_DELAY = 4*60*60*1000; // One hour
     46     static final int MSG_TICK = 1;
     47     final Handler mHandler = new Handler() {
     48         @Override public void handleMessage(Message msg) {
     49             switch (msg.what) {
     50                 case MSG_TICK:
     51                     // Our service is IMPORTANT.  We know, we wrote it.
     52                     // We need to keep that thing running.  Because WE KNOW.
     53                     // Damn you users, STOP MESSING WITH US.
     54                     startService(new Intent(FakeApp.this, FakeBackgroundService.class));
     55                     sendEmptyMessageDelayed(MSG_TICK, TICK_DELAY);
     56                     break;
     57                 default:
     58                     super.handleMessage(msg);
     59                     break;
     60             }
     61         }
     62     };
     63 
     64     // Always run another process for more per-process overhead.
     65     ServiceConnection mServiceConnection = new ServiceConnection() {
     66         @Override public void onServiceConnected(ComponentName name, IBinder service) {
     67         }
     68 
     69         @Override public void onServiceDisconnected(ComponentName name) {
     70         }
     71     };
     72     ServiceConnection mServiceConnection2 = new ServiceConnection() {
     73         @Override public void onServiceConnected(ComponentName name, IBinder service) {
     74         }
     75 
     76         @Override public void onServiceDisconnected(ComponentName name) {
     77         }
     78     };
     79     ServiceConnection mServiceConnection3 = new ServiceConnection() {
     80         @Override public void onServiceConnected(ComponentName name, IBinder service) {
     81         }
     82 
     83         @Override public void onServiceDisconnected(ComponentName name) {
     84         }
     85     };
     86 
     87     @Override
     88     public void onCreate() {
     89         String processName = ActivityThread.currentProcessName();
     90         Slog.i("FakeOEMFeatures", "Creating app in process: " + processName);
     91         if (!getApplicationInfo().packageName.equals(processName)) {
     92             // If we are not in the main process of the app, then don't do
     93             // our extra overhead stuff.
     94             return;
     95         }
     96 
     97         final WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
     98         final Display display = wm.getDefaultDisplay();
     99 
    100         // Check to make sure we are not running on a user build.  If this
    101         // is a user build, WARN!  Do not want!
    102         if ("user".equals(android.os.Build.TYPE)) {
    103             AlertDialog.Builder builder = new AlertDialog.Builder(this);
    104             builder.setTitle("Should not be on user build");
    105             builder.setMessage("The app Fake OEM Features should not be installed on a "
    106                     + "user build.  Please remove this .apk before shipping this build to "
    107                     + " your customers!");
    108             builder.setCancelable(false);
    109             builder.setPositiveButton("I understand", null);
    110             Dialog dialog = builder.create();
    111             dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    112             dialog.show();
    113         }
    114 
    115         // Make a fake window that is always around eating graphics resources.
    116         FakeView view = new FakeView(this);
    117         WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
    118                 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    119                 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    120                 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
    121                 | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    122         if (ActivityManager.isHighEndGfx()) {
    123             lp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
    124         }
    125         lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
    126         lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
    127         int maxSize = display.getMaximumSizeDimension();
    128         maxSize *= 2;
    129         lp.x = maxSize;
    130         lp.y = maxSize;
    131         lp.setTitle(getPackageName());
    132         wm.addView(view, lp);
    133 
    134         // Bind to a fake service we want to keep running in another process.
    135         bindService(new Intent(this, FakeCoreService.class), mServiceConnection,
    136                 Context.BIND_AUTO_CREATE);
    137         bindService(new Intent(this, FakeCoreService2.class), mServiceConnection2,
    138                 Context.BIND_AUTO_CREATE);
    139         bindService(new Intent(this, FakeCoreService3.class), mServiceConnection3,
    140                 Context.BIND_AUTO_CREATE);
    141 
    142         // Start to a fake service that should run in the background of
    143         // another process.
    144         mHandler.sendEmptyMessage(MSG_TICK);
    145 
    146         // Make a fake allocation to consume some RAM.
    147         mStuffing = new int[STUFFING_SIZE_INTS];
    148         for (int i=0; i<STUFFING_SIZE_BYTES/PAGE_SIZE; i++) {
    149             // Fill each page with a unique value.
    150             final int VAL = i*2 + 100;
    151             final int OFF = (i*PAGE_SIZE)/4;
    152             for (int j=0; j<(PAGE_SIZE/4); j++) {
    153                 mStuffing[OFF+j] = VAL;
    154             }
    155         }
    156     }
    157 }
    158