chromium/tools/android/memconsumer/java/src/org/chromium/memconsumer/MemConsumer.java

// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.memconsumer;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.TextView;

public class MemConsumer extends Activity {
    public static final String NOTIFICATION_ACTION = MemConsumer.class.toString() + ".NOTIFICATION";

    private ResidentService mResidentService;
    private int mMemory;
    private NumberPicker mMemoryPicker;

    private ServiceConnection mServiceConnection =
            new ServiceConnection() {
                @Override
                public void onServiceConnected(ComponentName name, IBinder binder) {
                    mResidentService = ((ResidentService.ServiceBinder) binder).getService();
                    mResidentService.useMemory(mMemory);
                }

                @Override
                public void onServiceDisconnected(ComponentName name) {
                    mResidentService = null;
                }
            };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMemoryPicker = new NumberPicker(this);
        mMemoryPicker.setGravity(Gravity.CENTER);
        mMemoryPicker.setMaxValue(Integer.MAX_VALUE);
        mMemoryPicker.setMinValue(0);
        mMemoryPicker.setOnValueChangedListener(
                new NumberPicker.OnValueChangeListener() {
                    @Override
                    public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
                        updateMemoryConsumption(picker.getValue());
                    }
                });
        for (int i = 0; i < mMemoryPicker.getChildCount(); i++) {
            View child = mMemoryPicker.getChildAt(i);
            if (child instanceof EditText) {
                EditText editText = (EditText) child;
                editText.setOnEditorActionListener(
                        new TextView.OnEditorActionListener() {
                            @Override
                            public boolean onEditorAction(
                                    TextView v, int actionId, KeyEvent event) {
                                if (v.getText().length() > 0) {
                                    updateMemoryConsumption(
                                            Integer.parseInt(v.getText().toString()));
                                }
                                return false;
                            }
                        });
            }
        }
        setContentView(mMemoryPicker);
        onNewIntent(getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (TextUtils.equals(intent.getAction(), NOTIFICATION_ACTION)) {
            updateMemoryConsumption(0);
            return;
        }
        if (!intent.hasExtra("memory")) return;
        updateMemoryConsumption(intent.getIntExtra("memory", 0));
    }

    void updateMemoryConsumption(int memory) {
        if (memory == mMemory || memory < 0) return;
        mMemory = memory;
        mMemoryPicker.setValue(mMemory);
        if (mResidentService == null) {
            if (mMemory > 0) {
                Intent resident = new Intent();
                resident.setClass(this, ResidentService.class);
                startService(resident);
                bindService(
                        new Intent(this, ResidentService.class),
                        mServiceConnection,
                        Context.BIND_AUTO_CREATE);
            }
        } else {
            mResidentService.useMemory(mMemory);
            if (mMemory == 0) {
                unbindService(mServiceConnection);
                stopService(new Intent(this, ResidentService.class));
                mResidentService = null;
            }
        }
    }
}