Skip to content
Open

- #74

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .idea/runConfigurations.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
94 changes: 94 additions & 0 deletions app/app.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="homework1" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android-gradle" name="Android-Gradle">
<configuration>
<option name="GRADLE_PROJECT_PATH" value=":app" />
</configuration>
</facet>
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugAndroidTest" />
<option name="COMPILE_JAVA_TEST_TASK_NAME" value="compileDebugAndroidTestSources" />
<afterSyncTasks>
<task>generateDebugAndroidTestSources</task>
<task>generateDebugSources</task>
</afterSyncTasks>
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
<output-test url="file://$MODULE_DIR$/build/intermediates/classes/androidTest/debug" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/debug" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.1.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/design/23.1.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/recyclerview-v7/23.1.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/23.1.0/jars" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/tmp" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="recyclerview-v7-23.1.0" level="project" />
<orderEntry type="library" exported="" name="support-annotations-23.1.0" level="project" />
<orderEntry type="library" exported="" name="appcompat-v7-23.1.0" level="project" />
<orderEntry type="library" exported="" name="design-23.1.0" level="project" />
<orderEntry type="library" exported="" name="support-v4-23.1.0" level="project" />
</component>
</module>
27 changes: 27 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig {
applicationId "ru.ifmo.android_2015.activitylifecycle"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.0'
}
27 changes: 27 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.ifmo.android_2015.activitylifecycle"> <!-- Build.VERSION_CODES -->
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="22" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name=".ui.MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
package ru.ifmo.android_2015.activitylifecycle.ui;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.math.BigDecimal;
import java.math.RoundingMode;

import ru.ifmo.android_2015.activitylifecycle.R;

public final class MainActivity extends Activity {
private enum Operation {
ADD, SUB, MUL, DIV, EQ, NONE;
}

private static final String TAG = MainActivity.class.getSimpleName();
private TextView calcRes;
private BigDecimal leftOperand = null;
private BigDecimal rightOperand = null;
private Operation currentOperation = Operation.NONE;

public void onDigitBtnClick(View view) {
Button b = (Button)view;
int currentDigit = Integer.parseInt(b.getText().toString());
if (rightOperand == null) {
rightOperand = new BigDecimal(0);
}
if (rightOperand.scale() > 0) {
int oldScale = rightOperand.scale();
Log.d(TAG, "scale: " + String.valueOf(oldScale));
int inc;
if (calcRes.getText().toString().endsWith(","))
inc = 0;
else
inc = 1;
rightOperand = rightOperand.setScale(oldScale + inc);
rightOperand = rightOperand.add(new BigDecimal(currentDigit).movePointLeft(oldScale + inc));
} else {
rightOperand = rightOperand.multiply(BigDecimal.TEN).add(new BigDecimal(currentDigit));
}
calcRes.setText(rightOperand.toPlainString());
Log.d(TAG, rightOperand.toPlainString());
}

public void onCancelBtnClick(View view) {
calcRes.setText("0");
leftOperand = null;
rightOperand = null;
currentOperation = Operation.NONE;
}

public void onDotBtnClick(View view) {
if (rightOperand == null) {
rightOperand = new BigDecimal(0);
}
if (rightOperand.scale() > 0) {
calcRes.setText(rightOperand.toPlainString());
} else {
String tmp = String.format("%s,", rightOperand.toPlainString());
calcRes.setText(tmp);
rightOperand = rightOperand.multiply(BigDecimal.TEN).movePointLeft(1);
}
Log.d(TAG, "scale: " + String.valueOf(rightOperand.scale()));
Log.d(TAG, rightOperand.toPlainString());
}

private BigDecimal copy(BigDecimal other) {
return new BigDecimal(other.toString());
}

private void eval(Operation nextOperation) {
// trying to evaluate last operation (currentOperation)
if (currentOperation != Operation.NONE && rightOperand != null && leftOperand != null) {
Log.d(TAG, currentOperation.toString());
switch (currentOperation) {
case ADD:
leftOperand = leftOperand.add(rightOperand);
break;
case SUB:
leftOperand = leftOperand.subtract(rightOperand);
break;
case MUL:
leftOperand = leftOperand.multiply(rightOperand);
break;
case DIV:
int scale = leftOperand.scale() + rightOperand.scale() + 4;
if (scale == 4) {
scale = 9;
}
if (rightOperand.equals(BigDecimal.ZERO)) {
rightOperand = null;
currentOperation = Operation.NONE;
leftOperand = null;
calcRes.setText("error: division by zero");
} else {
leftOperand = leftOperand.divide(rightOperand, scale, RoundingMode.CEILING);
}
break;
}
rightOperand = new BigDecimal(0);
}
if (nextOperation != Operation.EQ) {
// if next operation is not equal
// moving rightOperand to leftOperand
if (currentOperation == Operation.NONE) {
if (rightOperand != null) {
leftOperand = copy(rightOperand);
}
rightOperand = null;
} else {
if (leftOperand != null) {
calcRes.setText(leftOperand.toPlainString());
}
}
// updating current operation
currentOperation = nextOperation;

} else {
// if next operation is equal then current must become none
if (currentOperation == Operation.NONE && rightOperand != null && !rightOperand.equals(BigDecimal.ZERO)) {
calcRes.setText(rightOperand.toPlainString());
} else {
currentOperation = Operation.NONE;
rightOperand = null;
if (leftOperand != null) {
calcRes.setText(leftOperand.toPlainString());
}
}
}
}

public void onSignBtnClick(View view) {
Button op = (Button)view;
Log.d(TAG, "getText() returns: " + op.getText().toString());
Log.d(TAG, "leftOperand: " + (leftOperand == null ? "null" : leftOperand.toPlainString()));
Log.d(TAG, "rightOperand: " + (rightOperand == null ? "null" : rightOperand.toPlainString()));
Operation nextOp = null;
switch (op.getText().toString()) {
case "=":
nextOp = Operation.EQ;
break;
case "+":
nextOp = Operation.ADD;
break;
case "-":
nextOp = Operation.SUB;
break;
case "*":
nextOp = Operation.MUL;
break;
case "÷":
nextOp = Operation.DIV;
break;
}
eval(nextOp);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_main);
calcRes = (TextView)findViewById(R.id.text_view);
if (savedInstanceState != null) {
String savedOperand = savedInstanceState.getString("rightOperand");
if (savedOperand != null) {
rightOperand = new BigDecimal(savedOperand);
}
savedOperand = savedInstanceState.getString("leftOperand");
if (savedOperand != null) {
leftOperand = new BigDecimal(savedOperand);
}
currentOperation = Operation.valueOf(savedInstanceState.getString("currentOperation"));
calcRes.setText(savedInstanceState.getCharSequence("displayedValue"));
}
}

@Override
protected void onSaveInstanceState(Bundle savingBundle) {
super.onSaveInstanceState(savingBundle);
if (rightOperand != null) {
savingBundle.putString("rightOperand", rightOperand.toPlainString());
}
if (leftOperand != null) {
savingBundle.putString("leftOperand", leftOperand.toPlainString());
}
savingBundle.putString("currentOperation", currentOperation.toString());
savingBundle.putString("displayedValue", calcRes.getText().toString());
}
}
Loading