Skip to content
Permalink
Browse files

Final Google Play Store Release

Many bugfixes and new features! Added composer walkthrough tutorial,
miscellaneous management functionalities, better Home-Screen and more!
Bugfixes on all components.
  • Loading branch information
Taremeh committed Apr 23, 2017
1 parent 725a1d9 commit e30e8549ad71fa81d3d9d82699e7221d1a2d6527
Showing with 760 additions and 266 deletions.
  1. +15 −3 apphovenAlpha/app/App_Resources/Android/AndroidManifest.xml
  2. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/apphoven_text_logo.png
  3. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/background.png
  4. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/beethoven_profile.png
  5. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/empty_shelf_red.png
  6. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/empty_shelf_red_recorder.png
  7. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/empty_shelf_white.png
  8. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/home_icon_add_piece.png
  9. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/home_icon_calendar.png
  10. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/home_icon_microphone.png
  11. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/home_icon_piece_list.png
  12. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/home_icon_vinyl.png
  13. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/ic_menu_black.png
  14. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/icon.png
  15. BIN apphovenAlpha/app/App_Resources/Android/drawable-hdpi/logo.png
  16. BIN apphovenAlpha/app/App_Resources/Android/drawable-ldpi/apphoven_text_logo.png
  17. BIN apphovenAlpha/app/App_Resources/Android/drawable-ldpi/background.png
  18. BIN apphovenAlpha/app/App_Resources/Android/drawable-ldpi/beethoven_profile.png
  19. BIN apphovenAlpha/app/App_Resources/Android/drawable-ldpi/icon.png
  20. BIN apphovenAlpha/app/App_Resources/Android/drawable-ldpi/logo.png
  21. BIN apphovenAlpha/app/App_Resources/Android/drawable-mdpi/apphoven_text_logo.png
  22. BIN apphovenAlpha/app/App_Resources/Android/drawable-mdpi/background.png
  23. BIN apphovenAlpha/app/App_Resources/Android/drawable-mdpi/beethoven_profile.png
  24. BIN apphovenAlpha/app/App_Resources/Android/drawable-mdpi/ic_menu_black.png
  25. BIN apphovenAlpha/app/App_Resources/Android/drawable-mdpi/icon.png
  26. BIN apphovenAlpha/app/App_Resources/Android/drawable-mdpi/logo.png
  27. BIN apphovenAlpha/app/App_Resources/Android/drawable-xhdpi/apphoven_text_logo.png
  28. BIN apphovenAlpha/app/App_Resources/Android/drawable-xhdpi/background.png
  29. BIN apphovenAlpha/app/App_Resources/Android/drawable-xhdpi/beethoven_profile.png
  30. BIN apphovenAlpha/app/App_Resources/Android/drawable-xhdpi/ic_menu_black.png
  31. BIN apphovenAlpha/app/App_Resources/Android/drawable-xhdpi/icon.png
  32. BIN apphovenAlpha/app/App_Resources/Android/drawable-xhdpi/logo.png
  33. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxhdpi/apphoven_text_logo.png
  34. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxhdpi/background.png
  35. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxhdpi/beethoven_profile.png
  36. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxhdpi/ic_menu_black.png
  37. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxhdpi/icon.png
  38. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxhdpi/logo.png
  39. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxxhdpi/apphoven_text_logo.png
  40. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxxhdpi/background.png
  41. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxxhdpi/beethoven_profile.png
  42. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxxhdpi/ic_menu_black.png
  43. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxxhdpi/icon.png
  44. BIN apphovenAlpha/app/App_Resources/Android/drawable-xxxhdpi/logo.png
  45. +3 −3 apphovenAlpha/app/App_Resources/Android/values/styles.xml
  46. +14 −0 apphovenAlpha/app/app.css
  47. +1 −3 apphovenAlpha/app/app.module.ts
  48. +3 −4 apphovenAlpha/app/app.routing.ts
  49. +7 −1 apphovenAlpha/app/main.ts
  50. +5 −0 apphovenAlpha/app/pages/audio-recorder/audio-analyzer/audio-analyzer-common.css
  51. +1 −0 apphovenAlpha/app/pages/audio-recorder/audio-analyzer/audio-analyzer.component.html
  52. +31 −7 apphovenAlpha/app/pages/audio-recorder/audio-analyzer/audio-analyzer.component.ts
  53. +9 −1 apphovenAlpha/app/pages/audio-recorder/audio-list/audio-list.component.html
  54. +11 −7 apphovenAlpha/app/pages/audio-recorder/audio-list/audio-list.component.ts
  55. +5 −1 apphovenAlpha/app/pages/audio-recorder/audio-recorder/audio-recorder.component.html
  56. +2 −5 apphovenAlpha/app/pages/audio-recorder/audio-recorder/audio-recorder.component.ts
  57. +39 −2 apphovenAlpha/app/pages/home/home-common.css
  58. +64 −24 apphovenAlpha/app/pages/home/home.component.html
  59. +254 −6 apphovenAlpha/app/pages/home/home.component.ts
  60. +1 −1 apphovenAlpha/app/pages/login/login.component.html
  61. +13 −8 apphovenAlpha/app/pages/login/login.component.ts
  62. +14 −7 apphovenAlpha/app/pages/metronome/metronome.component.html
  63. +9 −0 apphovenAlpha/app/pages/metronome/metronome.component.ts
  64. +3 −3 apphovenAlpha/app/pages/piece/addpiece/addpiece.component.html
  65. +54 −17 apphovenAlpha/app/pages/piece/addpiece/addpiece.component.ts
  66. +4 −0 apphovenAlpha/app/pages/piece/piece-list/piece-list.component.html
  67. +25 −6 apphovenAlpha/app/pages/piece/piece-list/piece-list.component.ts
  68. +9 −2 apphovenAlpha/app/pages/piece/piece-recorder/piece-recorder.component.html
  69. +50 −12 apphovenAlpha/app/pages/piece/piece-recorder/piece-recorder.component.ts
  70. +1 −1 apphovenAlpha/app/pages/practice-session/practice-session-common.css
  71. +5 −4 apphovenAlpha/app/pages/practice-session/practice-session.component.html
  72. +68 −30 apphovenAlpha/app/pages/practice-session/practice-session.component.ts
  73. +0 −25 apphovenAlpha/app/pages/profile/profile-common.css
  74. 0 apphovenAlpha/app/pages/profile/profile.component.android.css
  75. +0 −15 apphovenAlpha/app/pages/profile/profile.component.html
  76. 0 apphovenAlpha/app/pages/profile/profile.component.ios.css
  77. +0 −58 apphovenAlpha/app/pages/profile/profile.component.ts
  78. +0 −9 apphovenAlpha/app/pages/profile/profile.module.ts
  79. +9 −1 apphovenAlpha/app/pages/settings/settings.component.html
  80. +6 −0 apphovenAlpha/app/pages/settings/settings.component.ts
  81. +18 −0 apphovenAlpha/app/shared/firebase/backend.service.ts
  82. +2 −0 apphovenAlpha/app/shared/firebase/login.service.ts
  83. +4 −0 apphovenAlpha/app/shared/firebase/piece.service.ts
  84. +1 −0 apphovenAlpha/package.json
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="__PACKAGE__"
android:versionCode="1"
android:versionName="1.0">
android:versionCode="3"
android:versionName="1.1.1">

<supports-screens
android:smallScreens="true"
@@ -18,19 +18,31 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application
android:name="com.tns.NativeScriptApplication"
android:allowBackup="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/ApphovenTheme">
<service android:name="org.nativescript.plugins.firebase.MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<service android:name="org.nativescript.plugins.firebase.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>

<activity
android:name="com.tns.NativeScriptActivity"
android:label="@string/title_activity_kimera"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@style/LaunchScreenTheme">
android:theme="@style/LaunchScreenTheme"
android:screenOrientation="portrait">

<meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/ApphovenTheme" />

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
@@ -5,9 +5,9 @@
<style name="LaunchScreenThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
<item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>

<item name="colorPrimary">@color/ns_primary</item>
<item name="colorPrimaryDark">@color/ns_primaryDark</item>
<item name="colorAccent">@color/ns_accent</item>
<item name="colorPrimary">@color/ah_primary</item>
<item name="colorPrimaryDark">@color/ah_primaryDark</item>
<item name="colorAccent">@color/ah_accent</item>

<item name="android:windowBackground">@drawable/splash_screen</item>

@@ -88,4 +88,18 @@

.font-dark {
color: #757575;
}

.beethoven-container {
background-color: #F44336;
padding: 20 10 20 10;
}

.beethoven-msg {
background-color: #FAFAFA;
color: black;
margin: 0 0 0 5;
padding: 10;
border-radius: 10;
height: auto;
}
@@ -20,7 +20,6 @@ import { PerformanceTestService } from "./pages/metronome/performance-test.servi
// Modules
import { LoginModule } from "./pages/login/login.module";
import { SettingsModule } from "./pages/settings/settings.module";
import { ProfileModule } from "./pages/profile/profile.module";

// Currently disabled: (ToDo: Find a way to regulate the status bar)
// setStatusBarColors();
@@ -41,8 +40,7 @@ import { ProfileModule } from "./pages/profile/profile.module";
NativeScriptRouterModule,
NativeScriptRouterModule.forRoot(routes),
LoginModule,
SettingsModule,
ProfileModule
SettingsModule
],
declarations: [
AppComponent,
@@ -2,7 +2,6 @@ import { AuthGuard } from "./auth-guard.service";
import { LoginComponent } from "./pages/login/login.component";
import { HomeComponent } from "./pages/home/home.component";
import { SettingsComponent } from "./pages/settings/settings.component";
import { ProfileComponent } from "./pages/profile/profile.component";
import { MetronomeComponent } from "./pages/metronome/metronome.component";
import { AddPieceComponent } from "./pages/piece/addpiece/addpiece.component";
import { PieceDashboardComponent } from "./pages/piece/piece-dashboard/piece-dashboard.component";
@@ -21,8 +20,8 @@ export const routes = [
{ path: '', redirectTo: '/home', pathMatch: 'full' },
{ path: 'login', component: LoginComponent },
{ path: 'home', component: HomeComponent, canActivate: [AuthGuard] },
{ path: 'home/:optionalParam', component: HomeComponent, canActivate: [AuthGuard] },
{ path: 'settings', component: SettingsComponent, clearHistory: true, canActivate: [AuthGuard] },
{ path: 'profile', component: ProfileComponent, canActivate: [AuthGuard] },
{ path: 'metronome', component: MetronomeComponent, canActivate: [AuthGuard] },
{ path: 'addpiece', component: AddPieceComponent, canActivate: [AuthGuard] },
{ path: 'piece-db/:pieceId/:originType', component: PieceDashboardComponent, canActivate: [AuthGuard] },
@@ -31,15 +30,15 @@ export const routes = [
{ path: 'practice-session', component: PracticeSessionComponent, canActivate: [AuthGuard] },
{ path: 'audio-recorder', component: AudioRecorderComponent, canActivate: [AuthGuard] },
{ path: 'audio-list', component: AudioListComponent, canActivate: [AuthGuard] },
{ path: 'audio-analyzer/:recordingFileName', component: AudioAnalyzerComponent, canActivate: [AuthGuard] }
{ path: 'audio-analyzer/:recordingFileName', component: AudioAnalyzerComponent, canActivate: [AuthGuard] },
{ path: 'audio-analyzer/:recordingFileName/:optionalParam', component: AudioAnalyzerComponent, canActivate: [AuthGuard] }
];

// Needed for app.module.ts declaration
export const navigatableComponents = [
LoginComponent,
HomeComponent,
SettingsComponent,
ProfileComponent,
MetronomeComponent,
AddPieceComponent,
PieceDashboardComponent,
@@ -4,11 +4,17 @@ import { AppModule } from "./app.module";
import firebase = require("nativescript-plugin-firebase");
import { BackendService } from "./shared";


firebase.init({
onMessageReceivedCallback: function(message) {
console.log(`Title: ${message.title}`);
console.log(`Body: ${message.body}`);
// if your server passed a custom property called 'foo', then do this:
// console.log(`Value of 'foo': ${message.data.foo}`);
},
persist: true
}).then(
function (instance) {
firebase.subscribeToTopic("allDevices");
console.log("firebase.init done");
},
function (error) {
@@ -47,4 +47,9 @@ button {
.mark-label-highlight {
color: white;
background-color: #F44336;
}

.mark-info-label {
padding: 3;
vertical-align: center;
}
@@ -25,6 +25,7 @@
<Label (tap)="addMark()" text="{{ addIcon }}" class="icon-font add-marker-icon"></Label>
<ScrollView orientation="horizontal">
<StackLayout orientation="horizontal">
<Label *ngIf="noMarks" text="Tap on the pin to add a marker" class="mark-info-label"></Label>
<Label *ngFor="let mark of fbRecordingMarks" text="{{ mark.time | mstransformer }}" class="{{ mark.class }}" (tap)="onMarkTap(mark.position)"></Label>
</StackLayout>
</ScrollView>
@@ -1,11 +1,13 @@
import { Component, OnInit, ViewChild, ElementRef, NgZone } from "@angular/core";
import { Component, OnInit, OnDestroy, ViewChild, ElementRef, NgZone } from "@angular/core";
import { View } from "ui/core/view";
import { Color } from "color";
import { PageRoute } from "nativescript-angular/router";
import firebase = require("nativescript-plugin-firebase");
import { BackendService, PieceService, MillisecondTransformerPipe } from "../../../shared";
import { Observable as RxObservable } from 'rxjs/Observable';
import { knownFolders, File } from 'file-system';
import * as application from "application";
import { AndroidApplication, AndroidActivityBackPressedEventData } from "application";
// import * as fs from 'file-system';
import * as app from 'application';
import * as color from 'color';
@@ -16,6 +18,8 @@ import { Slider } from 'ui/slider';
// import { SnackBar } from 'nativescript-snackbar';
import { SegmentedBarItem } from "ui/segmented-bar";
import { TNSRecorder, TNSPlayer, AudioPlayerOptions, AudioRecorderOptions } from 'nativescript-audio';
import { RouterExtensions } from "nativescript-angular/router";


@Component({
selector: "ah-audio-analyzer",
@@ -24,7 +28,7 @@ import { TNSRecorder, TNSPlayer, AudioPlayerOptions, AudioRecorderOptions } from
providers: [MillisecondTransformerPipe]
})

export class AudioAnalyzerComponent implements OnInit{
export class AudioAnalyzerComponent implements OnInit, OnDestroy {

private fbRecordingArray: Array<any>;
private fbRecordingIdArray: Array<any>;
@@ -50,6 +54,7 @@ export class AudioAnalyzerComponent implements OnInit{
private audioTime = 0;
private playButton: string = "Play Recording";
private addIcon = String.fromCharCode(0xf08d);
private noMarks = false;

// AUDIO PLUGIN
private player;
@@ -61,7 +66,7 @@ export class AudioAnalyzerComponent implements OnInit{
private seekTimeout;


constructor(private _pageRoute: PageRoute, private _ngZone: NgZone, private _page: Page, private _msTransform: MillisecondTransformerPipe){
constructor(private _pageRoute: PageRoute, private _ngZone: NgZone, private _page: Page, private _msTransform: MillisecondTransformerPipe, private _routerExtensions: RouterExtensions){
this.fbRecordingIdArray = [];
this.fbRecordingArray = [];
this.fbRecordingMarks = [];
@@ -75,8 +80,9 @@ export class AudioAnalyzerComponent implements OnInit{

this._pageRoute.activatedRoute
.switchMap(activatedRoute => activatedRoute.params)
.forEach((params) => {
.forEach((params) => {
this.routerParamId['recordingFileName'] = params['recordingFileName'];
this.routerParamId['optionalParam'] = params['optionalParam'];
});

this.player.initFromFile({
@@ -106,10 +112,24 @@ export class AudioAnalyzerComponent implements OnInit{
// Hide Action-Bar
this._page.actionBarHidden = true;

/*application.android.on(AndroidApplication.activityBackPressedEvent, (data: AndroidActivityBackPressedEventData) => {
application.android.on(AndroidApplication.activityBackPressedEvent, (data: AndroidActivityBackPressedEventData) => {
console.log("BACK BUTTON EVENT TRIGGERED");
//this._router.navigate(['/addpiece']);
});*/
if(this.routerParamId['optionalParam'] == "backToHome") {
data.cancel = true;
this._routerExtensions.navigate(["/home"], { clearHistory: true });
} else {
data.cancel = false;
}
});
}

ngOnDestroy(){
// STOP PLAYER IF IS AUDIO PLAYING
if(this.player.isAudioPlaying()){
this.player.dispose();
}
application.android.off(AndroidApplication.activityBackPressedEvent);
console.log("AudioAnalyzer - ngOnDestroy()");
}

public togglePlay() {
@@ -517,6 +537,7 @@ export class AudioAnalyzerComponent implements OnInit{

if(result.value.mark != null){
console.log("MARKS FOUND");
this.noMarks = false;
this.fbRecordingMarkIds = [];
let recordingMarkings = Object.keys(result.value.mark).length;
console.log("RESULT LENGTH: " + recordingMarkings);
@@ -549,6 +570,9 @@ export class AudioAnalyzerComponent implements OnInit{
}
});

} else {
// No marks found
this.noMarks = true;
}


@@ -1,10 +1,18 @@
<ActionBar title="Apphoven" class="ah-action-bar"></ActionBar>
<ActionBar class="ah-action-bar">
<GridLayout columns="*">
<Label col="0" text="APPHOVEN" style="font-size: 20; vertical-align: center;"></Label>
</GridLayout>
</ActionBar>
<StackLayout class="ah-main-container">
<StackLayout class="piece-container">
<StackLayout class="movement-container">
<!-- <Label class="piece-text" text="Your current pieces:"></Label> -->
<!-- <StackLayout class="movement-list-current"> -->
<StackLayout>
<GridLayout *ngIf="noRecordingsFound" rows="*, auto" class="p-20">
<Image row="0" src="res://empty_shelf_red_recorder" stretch="aspectFill"></Image>
<Label row="1" text="No recordings found" class="text-center p-5 m-10"></Label>
</GridLayout>
<ListView class="list-group clear-background" [items]="fbRecordingArray" separatorColor="transparent" (itemTap)="onRecordingTap($event)">
<template let-recording="item">
<StackLayout class="list-group-item clear-background">
@@ -98,6 +98,7 @@ export class AudioListComponent {
console.log("Value: " + JSON.stringify(result.value));

if(result.value){
this.noRecordingsFound = false;
console.log("PIECE-ITEMS FOUND");
var lenPieces = Object.keys(result.value).length;
for (let i = 0; i < lenPieces; i++) {
@@ -106,11 +107,11 @@ export class AudioListComponent {

let displayTitle;
for (let i = 0; i < this.fbRecordingIdArray.length; i++) {
console.log("mark 1");
if(result.value[this.fbRecordingIdArray[i]].recordingTitle != ""){
console.log("RECORDING TITLE FOUND");
displayTitle = result.value[this.fbRecordingIdArray[i]].recordingTitle;
} else if(result.value[this.fbRecordingIdArray[i]].pieceTitle != ""){
} else if(result.value[this.fbRecordingIdArray[i]].pieceTitle != null){
console.log("pieceTitle found");
displayTitle = result.value[this.fbRecordingIdArray[i]].pieceTitle;
} else {
displayTitle = "Recording (no title)";
@@ -141,14 +142,17 @@ export class AudioListComponent {
});
});
} else {
//result.value.movementItem.length = 0;
this.noRecordingsFound = true;
console.log("NO PIECES FOUND");
this._ngZone.run(() => {
this.noRecordingsFound = true;
console.log("NO RECORDINGS FOUND");
});
}

} else {
this.noRecordingsFound = true;
console.log("NO PIECES FOUND");
this._ngZone.run(() => {
this.noRecordingsFound = true;
console.log("NO RECORDINGS FOUND");
});
}
},
"/user/" + BackendService.token + "/recording",
@@ -1,4 +1,8 @@
<ActionBar title="Apphoven" class="ah-action-bar"></ActionBar>
<ActionBar class="ah-action-bar">
<GridLayout columns="*">
<Label col="0" text="APPHOVEN" style="font-size: 20; vertical-align: center;"></Label>
</GridLayout>
</ActionBar>
<StackLayout #ahMainContainer class="ah-main-container">
<GridLayout #meterLineContainer rows="*, auto">
<!-- MeterLine -->
@@ -609,7 +609,7 @@ export class AudioRecorderComponent implements OnInit, OnDestroy {
}
}


let that = this;
firebase.setValue(
'/user/'+BackendService.token+'/recording/'+this.fileName,
firebaseRecordingItem
@@ -618,10 +618,7 @@ export class AudioRecorderComponent implements OnInit, OnDestroy {
// BackendService: Update lastPieceId & lastMovementId (DEL)
// BackendService.lastPieceId = Number(that.routerParamIds['pieceId']);
// BackendService.lastMovementId = Number(that.routerParamIds['movementId']);

dialogs.alert("Recording saved!").then(()=> {
console.log("Dialog closed!");
});
that._routerExtensions.navigate(["/audio-analyzer/"+that.fileName+"/backToHome"], { clearHistory: true });
}
);
}

0 comments on commit e30e854

Please sign in to comment.
You can’t perform that action at this time.